<?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' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-27232680</id><updated>2012-02-03T06:07:54.413+01:00</updated><category term='linux'/><category term='logging'/><category term='merging'/><category term='branching'/><category term='distributed'/><category term='proxy'/><category term='selectors'/><category term='workflow'/><category term='news'/><category term='ddj'/><category term='annotate'/><category term='security'/><category term='best practices'/><category term='scm'/><category term='migration'/><category term='delphi'/><category term='GUI'/><category term='c#'/><category term='visual studio'/><category term='git'/><category term='Agile'/><category term='configuration'/><category term='shell extension'/><category term='plastic'/><category term='Mac'/><category term='Scrum'/><category term='ssl'/><category term='performance'/><category term='fun'/><category term='integrations'/><category term='eclipse'/><category term='backend'/><category term='testing'/><category term='mono'/><category term='solaris'/><category term='branch explorer'/><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?max-results=100'/><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=101&amp;max-results=100'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01839507951800291038</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_-O_O8wZ7KPU/ShPx2jrI-PI/AAAAAAAAAuI/l6BIG-NCPns/S220/avatar256.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>290</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-27232680.post-7114509232928555300</id><published>2012-02-02T16:29:00.011+01:00</published><updated>2012-02-02T19:19:22.671+01:00</updated><title type='text'>Migrating from SVN to PlasticSCM</title><content type='html'>&lt;div&gt;Thanks to the script made by Ignacio Calvo (&lt;a href="http://ignaciocalvo.com/"&gt;ignaciocalvo.com&lt;/a&gt;) you can migrate your subversion repository into PlasticSCM in a very easy way. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/-w5cWga42ZHU/Tyq3OfuwC1I/AAAAAAAAAOs/0-iinc3T7Gw/s1600/svn2pscm.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 230px;" src="http://2.bp.blogspot.com/-w5cWga42ZHU/Tyq3OfuwC1I/AAAAAAAAAOs/0-iinc3T7Gw/s400/svn2pscm.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5704573337681791826" /&gt;&lt;/a&gt;&lt;br /&gt;There are a lot of ways to do the same and with different tools, but this one is pretty and  quite simple.&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;You can find the source code &lt;a href="http://www.plasticscm.com/externalcontent/svn/svn.zip"&gt;here&lt;/a&gt;,  and a lot of more info in our public forum &lt;a href="http://www.plasticscm.net/"&gt;http://www.plasticscm.net&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&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-7114509232928555300?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/7114509232928555300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=7114509232928555300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7114509232928555300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7114509232928555300'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2012/02/migrating-from-svn-to-plasticscm.html' title='Migrating from SVN to PlasticSCM'/><author><name>Manu</name><uri>http://www.blogger.com/profile/16216075572494383120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Xqj1H4j2PWA/SNzH0nB162I/AAAAAAAAAAM/85w19DcUF3g/S220/yo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-w5cWga42ZHU/Tyq3OfuwC1I/AAAAAAAAAOs/0-iinc3T7Gw/s72-c/svn2pscm.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6136479851978818478</id><published>2012-01-27T16:32:00.000+01:00</published><updated>2012-01-27T12:48:41.208+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migration'/><title type='text'>P4 break</title><content type='html'>&lt;div&gt;&lt;h2 style="text-align: center;font-size: medium; "&gt;&lt;span&gt;&lt;span style="font-weight: normal; "&gt;Are you confined in perforce? Do you want to escape from it?&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/-u9EaoU_ASS4/TxBSl710bGI/AAAAAAAAAMw/lGspLv8_0mg/s1600/escape-from-alcatraz-1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 308px; height: 400px;" src="http://2.bp.blogspot.com/-u9EaoU_ASS4/TxBSl710bGI/AAAAAAAAAMw/lGspLv8_0mg/s400/escape-from-alcatraz-1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5697144340295740514" /&gt;&lt;/a&gt;&lt;h2&gt;&lt;span style="font-weight: normal; "&gt;Materials&lt;/span&gt;&lt;/h2&gt;&lt;h2 style="font-size: medium; "&gt;&lt;span&gt;&lt;span style="font-weight: normal;"&gt;We need some tools to success in our adventure!&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2 style="font-size: medium; "&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: normal; font-size: medium; "&gt;Python 2.7 (&lt;a href="file:///C:/Program%20Files/Bazaar/plugins"&gt;http://www.python.org/getit/releases/2.7/&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;P4PythonLib 2010.1 for Python 2.7 (&lt;/span&gt;&lt;a href="http://public.perforce.com:8080/guest/sven_erik_knop/P4Pythonlib/bin/?ac=83" style="font-weight: normal; "&gt;http://public.perforce.com:8080/guest/sven_erik_knop/P4Pythonlib/bin/?ac=83&lt;/a&gt;&lt;span style="font-weight: normal; "&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;Bzr Standalone (&lt;/span&gt;&lt;a href="http://launchpad.net/bzr/2.4/2.4.2/+download/bzr-2.4.2-1-setup.exe" style="font-weight: normal; "&gt;http://launchpad.net/bzr/2.4/2.4.2/+download/bzr-2.4.2-1-setup.exe&lt;/a&gt;&lt;span style="font-weight: normal; "&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; font-size: medium; "&gt;Bzr Python Based (&lt;a href="http://launchpad.net/bzr/2.4/2.4.2/+download/bzr-2.4.2-1.win32-py2.7.exe"&gt;http://launchpad.net/bzr/2.4/2.4.2/+download/bzr-2.4.2-1.win32-py2.7.exe&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; font-size: medium; "&gt;Git for windows (&lt;a href="http://msysgit.googlecode.com/files/Git-1.7.8-preview20111206.exe"&gt;http://msysgit.googlecode.com/files/Git-1.7.8-preview20111206.exe&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;P4-fast-export.py (bzrp4)(&lt;/span&gt;&lt;a href="http://dl.dropbox.com/u/2974293/trunk.rar" style="font-weight: normal; "&gt;http://dl.dropbox.com/u/2974293/trunk.rar&lt;/a&gt;&lt;span style="font-weight: normal; "&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;I assume you have the P4 client and server.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/h2&gt;&lt;h2&gt;&lt;span style="font-weight: normal; "&gt;Dangers&lt;/span&gt;&lt;/h2&gt;&lt;h2 style="font-size: medium; "&gt;&lt;span&gt;&lt;span style="font-weight: normal;"&gt;It’s not going to be a Boy Scout trip… some brave people failed.&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h2&gt;&lt;ol style="font-size: medium; "&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;If the Bzr and P4PythonLib is not able to find the Python installation directory please review the following link: &lt;a href="http://www.blogger.com/(http://selfsolved.com/problems/setuptools-06c11-fails-to-instal/s/63"&gt;(http://selfsolved.com/problems/setuptools-06c11-fails-to-instal/s/63&lt;/a&gt;)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;If the p4-fast-export.py fails regarding a Git error you have to follow this:(&lt;/span&gt;&lt;a href="http://stackoverflow.com/questions/5299122/unable-to-import-with-git-p4-on-windows" style="font-weight: normal; "&gt;http://stackoverflow.com/questions/5299122/unable-to-import-with-git-p4-on-windows&lt;/a&gt;&lt;span style="font-weight: normal; "&gt;)&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span style="font-weight: normal; "&gt;The plan&lt;/span&gt;&lt;/div&gt;&lt;/h2&gt;&lt;h2 style="font-size: medium; "&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;Install all the materials, just install it, you don’t need to open or configure anything.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;Place the http://dl.dropbox.com/u/2974293/trunk.rar content inside a directory called “bzrp4” under the "C:\Program Files\Bazaar\plugins" directory, the path to the python migration file should be like this:  “C:\Program Files\Bazaar\plugins\bzrp4\p4-fast-export.py”.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;Customize the “setup_env.bat” parameters with your environment info, adapt the Git path, P4PORT, and the Perforce server Path. Finally run it.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;O&lt;/span&gt;&lt;span style="font-weight: normal; "&gt;pen a command line window and run: “python p4-fast-export.py //my/repo/path@all &amp;gt; p4fe.dat”. If you are strong enough you can review the command help. Make sure you are using the Python 2.7 executable.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;Create a temporal directory, change your command line directory to it and perform the following: “git init .” “type p4fe.dat | git fast-import” and then “git fast-export --all --tag-of-filtered-object=drop --signed-tags=strip &amp;gt; gitFe.dat”&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal; "&gt;The last step is “cm fast-import p4ImportedRep gitFe.dat”&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/h2&gt;&lt;div style="font-size: medium; "&gt;If all works fine you will have your repository inside PlasticSCM!!!&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Survivors?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6136479851978818478?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6136479851978818478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6136479851978818478' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6136479851978818478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6136479851978818478'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2012/01/p4-break.html' title='P4 break'/><author><name>Manu</name><uri>http://www.blogger.com/profile/16216075572494383120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Xqj1H4j2PWA/SNzH0nB162I/AAAAAAAAAAM/85w19DcUF3g/S220/yo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-u9EaoU_ASS4/TxBSl710bGI/AAAAAAAAAMw/lGspLv8_0mg/s72-c/escape-from-alcatraz-1.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-3234022113767883017</id><published>2012-01-25T11:30:00.015+01:00</published><updated>2012-01-25T12:27:33.219+01:00</updated><title type='text'>CmdRunner power!</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The CmdRunner library is a tiny c# project that allows you to create porcelain applications using the “cm shell” strength.&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-tMj93AStwiU/Tx_Z-RTVx3I/AAAAAAAAANM/veFgMOsY4Ns/s400/wally5.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5701515317093975922" style="color: rgb(0, 0, 238); text-decoration: underline; float: right; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 10px; cursor: pointer; width: 101px; height: 108px; " /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What is the “cm shell” feature? The “cm shell” utility is able to execute cm commands like flash! It opens a shell interface where you can start issuing cm commands! Test it! first run four or five “cm lrep” lonely commands, not a big deal... Now try to issue “cm shell” and then type lrep &amp;amp; enter, lrep &amp;amp; enter, lrep &amp;amp; enter, lrep &amp;amp; enter... much faster!! ain’t it cool?&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Using the CmdRunner library you will be able to use this incredible speed running cm commands and create small or big utilities for your daily work with PlasticSCM.&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center; "&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's see some examples, for example, if you want to list all the changesets inside the “default” repository you just need to write something like this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-j7l77qoNstk/Tx_btRUt2vI/AAAAAAAAANY/Vq5GX0D0sPM/s400/cset.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5701517224065227506" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 55px; " /&gt;&lt;div&gt;&lt;div style="text-align: center; "&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;You can also perform write operations, this example will return 0 or 1 regarding if the checkout operation was successful or not:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div style="text-align: center; "&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;img src="http://1.bp.blogspot.com/-cJOXaRP0ahY/Tx_caTwOgRI/AAAAAAAAANk/ZrzIY8wQZSQ/s400/co.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5701517997811597586" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 392px; height: 61px; " /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;After the checkin you may want to modify the file and finally commit it:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div style="text-align: center; "&gt;&lt;img src="http://2.bp.blogspot.com/-M8q5PfMyrFs/Tx_dKU3zPBI/AAAAAAAAANw/e2Mbp6MKCHw/s400/ci.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5701518822745521170" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 400px; height: 97px; " /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;You can go further! for example you can create your own c# replication scheduler, launch replication operations is as simple as this:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div style="text-align: center; "&gt;&lt;img src="http://4.bp.blogspot.com/-UMn8jbgon58/Tx_eNjhEMuI/AAAAAAAAAN8/8NsOaB2JdFA/s400/replica.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5701519977727931106" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 400px; height: 84px; " /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;You only have to surround the cm commands with your stuff and you will able to create everything you can want!!! Every single cm command you can imagine can be executed by our CmdRunner! Some of our plugins are using this library to work! so can create big things!!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can download the CmdRunner source code and easy examples here: &lt;a href="http://www.plasticscm.com/externalcontent/CmdRunnerVS2010.zip"&gt;http://www.plasticscm.com/externalcontent/CmdRunnerVS2010.zip&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The VisualStudio solution can be opened with VS 2010. The "CmdRunnerExample" project contains code examples to start playing.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have fun!&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-3234022113767883017?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/3234022113767883017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=3234022113767883017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3234022113767883017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3234022113767883017'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2012/01/cmdrunner-power.html' title='CmdRunner power!'/><author><name>Manu</name><uri>http://www.blogger.com/profile/16216075572494383120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Xqj1H4j2PWA/SNzH0nB162I/AAAAAAAAAAM/85w19DcUF3g/S220/yo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-tMj93AStwiU/Tx_Z-RTVx3I/AAAAAAAAANM/veFgMOsY4Ns/s72-c/wally5.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-22379518071592797</id><published>2012-01-20T00:12:00.001+01:00</published><updated>2012-02-02T12:45:24.902+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merging'/><title type='text'>More on recursive merge strategy</title><content type='html'>A few days ago I had the chance to read a comment on my previous blog post &lt;a href="http://codicesoftware.blogspot.com/2011/09/merge-recursive-strategy.html"&gt;about merge recursive&lt;/a&gt; pointing to the &lt;a href="http://article.gmane.org/gmane.comp.version-control.mercurial.general/29523"&gt;Mercurial mailing list&lt;/a&gt; where Matt Mackall (&lt;a href="http://ostatic.com/blog/interview-with-mercurials-matt-mackall"&gt;of Mercurial fame&lt;/a&gt;) strongly criticized my explanation of the recursive merge strategy.&lt;p&gt;Well, some were simply about the “rendering style” of plastic’s branch explorer (which is what I used to drive the examples), and others about the explanation itself.&lt;p&gt;Mercurial’s programmer admits that recursive merge is better although argues that it is only worth in some cases and that its costs to implement is bigger than its benefits. Implementing a recursive merge isn’t cheap, as we known down here at Codice, but you know, the big difference between a great product and an exceptional one normally relies on the upper 2% of features that makes it rock.&lt;p&gt;Today we'll be covering (I'm writing this with the help of Borja, our merge master) &lt;b&gt;"advantages of recursive merge - Case 1: Only one ancestor is the right option".&lt;/b&gt;&lt;h2&gt;Back to the drawing board&lt;/h2&gt;Recursive merge is not only good for “criss-cross” merge situations but also for more “regular” ones where merge history simply gets complicated.&lt;p&gt;I’d like to go back to the original example and explain it now in bigger detail:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TmvP9Ubvf8g/Typ3R93_IeI/AAAAAAAABRc/H5Eey3vKp5E/s1600/image00.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="130" width="400" src="http://3.bp.blogspot.com/-TmvP9Ubvf8g/Typ3R93_IeI/AAAAAAAABRc/H5Eey3vKp5E/s400/image00.png" /&gt;&lt;/a&gt;&lt;/div&gt;We’re going to merge from changeset 5 to changeset 6. In this diagram (another explanation using code will come later) we simply say the “content” of the file is A or B or C, but it applies to lines of code (containing important changes, bug fixes and so on).&lt;h2&gt;DAG format&lt;/h2&gt;Just in case anyone has trouble understanding that the green lines are merges and they’re rendered from source to destination, here’s an alternative diagram:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-QWxjhlYws8g/TxiiejUdSqI/AAAAAAAABQM/kmzFZC_ozNg/s1600/image01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="358" src="http://2.bp.blogspot.com/-QWxjhlYws8g/TxiiejUdSqI/AAAAAAAABQM/kmzFZC_ozNg/s400/image01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Common ancestors&lt;/h2&gt;In order to run a merge, you need to identify the “source”, the “destination” and the nearest common ancestor.&lt;p&gt;In this case the “src” and “dst” are clear but the problem is the “common ancestor” because there’s more than one candidate.&lt;p&gt;If you look carefully you’ll see that both changesets “2” and “3” can be taken as common ancestors.&lt;p&gt;A non-recursive merge algorithm will only use one of them, and depending on the “choice”, the result can be quite different.&lt;h2&gt;Selecting “3” as common ancestor&lt;/h2&gt;If the algorithm chooses “3” (and as we explained in our previous post, this is the choice taken by Hg, and also would be the one taken by former plastic’s algorithm previous to “merge recursive” implementation) then the following situation will happen:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3uczFDi94qM/TxiiuzmTkRI/AAAAAAAABQY/6Vq930uaiFk/s1600/image03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="282" width="400" src="http://1.bp.blogspot.com/-3uczFDi94qM/TxiiuzmTkRI/AAAAAAAABQY/6Vq930uaiFk/s400/image03.png" /&gt;&lt;/a&gt;&lt;/div&gt;It will lead to a manual merge, where the user will be forced to choose.&lt;h2&gt;Selecting “2” as common ancestor – the lucky shot&lt;/h2&gt;If the algorithm uses “2” as common ancestor, then the merge will be between content “B”, “B” and “C•”, so, since two contributors are the same, the result will be “C”.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-NuQbez1q9Vs/Txii3pOk7_I/AAAAAAAABQk/wBQrmrm-siw/s1600/image02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="340" width="400" src="http://1.bp.blogspot.com/-NuQbez1q9Vs/Txii3pOk7_I/AAAAAAAABQk/wBQrmrm-siw/s400/image02.png" /&gt;&lt;/a&gt;&lt;/div&gt;It is the expected result as we will see later, and it is a pretty valid choice, the problem is that there’s no good consistent way to choose “2”.&lt;p&gt;This time, the result matches the expected result, but sometimes it simply leads to an incorrect automatic choice, which is the real problem and the real reason why “recursive” is implemented by git and plastic.&lt;h2&gt;The recursive option&lt;/h2&gt;Again, here’s how the “recursive works”: since there’re two ancestors at the same distance, it will “merge them” creating a new virtual ancestor that will be used as the “base” for the final merge between the merge candidates “5” and “6”:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Vfh_rmI7jDI/TxijBFxt1bI/AAAAAAAABQw/CWTe8pa5ZDE/s1600/image04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="135" width="400" src="http://4.bp.blogspot.com/-Vfh_rmI7jDI/TxijBFxt1bI/AAAAAAAABQw/CWTe8pa5ZDE/s400/image04.png" /&gt;&lt;/a&gt;&lt;/div&gt;The following image depicts the first step, the calculation of the “virt” common ancestor (the intermediate one):&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-p00VquWWCy4/TxijFQ4NjWI/AAAAAAAABQ8/n21dlvaC9wg/s1600/image05.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="338" width="400" src="http://1.bp.blogspot.com/-p00VquWWCy4/TxijFQ4NjWI/AAAAAAAABQ8/n21dlvaC9wg/s400/image05.png" /&gt;&lt;/a&gt;&lt;/div&gt;And then the second step, where the result is calculated automatically, this time without user intervention:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-8sLJCaeQCHo/TxijJ-TOv5I/AAAAAAAABRI/_lpTkkUjE5w/s1600/image06.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="352" width="400" src="http://4.bp.blogspot.com/-8sLJCaeQCHo/TxijJ-TOv5I/AAAAAAAABRI/_lpTkkUjE5w/s400/image06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Where is the huge difference?&lt;/h2&gt;Comparing recursive and no-recursive algorithms in this example, you might only see that the recursive is able to avoid a manual conflict because it is able to find out how it was solved before. Is it such a big difference? Just avoiding one manual merge?&lt;p&gt;Real world has the answer: try a "real" merge involving several hundreds of files and then the answer is clear: usable if you don't have to solve the conflicts vs not usable.&lt;h2&gt;Wrap up&lt;/h2&gt;We still have a ton of posts to write to share the particular cases where having recursive merge saves the day, so we’ll try to move forward one by one in the coming weeks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-22379518071592797?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/22379518071592797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=22379518071592797' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/22379518071592797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/22379518071592797'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2012/01/more-on-recursive-merge-strategy.html' title='More on recursive merge strategy'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-TmvP9Ubvf8g/Typ3R93_IeI/AAAAAAAABRc/H5Eey3vKp5E/s72-c/image00.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-7821427390301777251</id><published>2012-01-11T11:24:00.002+01:00</published><updated>2012-01-11T11:38:17.775+01:00</updated><title type='text'>VMware issues when copying virtual machines</title><content type='html'>We at Codice Software use internally VMware for testing purposes; specifically we use VMware Server 2 to run automated tests (both smoke, GUI and integration tests) and VMware Workstation for manual testing, support, test new oportunities, platforms, applications and so on.&lt;br /&gt;&lt;br /&gt;We've been using this software for several years and we are very happy with it. It performs great, fast, secure and flexible. Nevertheless, sometimes we've encountered some problems. My work as builder of the company includes setting up new testing virtual machines and maintenance, so I'm working with VMware almost everyday.&lt;br /&gt;&lt;br /&gt;Recently I created a cloned virtual machine from a snapshot in a VMware Workstation 7. After setting it up I moved it to our automated testing hosts (FYI, we have seven hosts that handles between 5 and 20 virtual machines each, all of them for testing purposes). When I tried to start up the virtual machine in VMware Server 2 I got a crash in the web application that I only could solve by restarting the service in the host machine!&lt;br /&gt;&lt;br /&gt;Finally I workarounded the problem doing the following:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;First, I created a new virtual machine in VMware server with the same hardware features as the original one.&lt;/li&gt;&lt;li&gt;Edit the .vmx file of the new virtual machine changing it to use the disk files (.vmdk) of the virtual machine I want to register in VMware Server. It's possible to do this from the "New virtual machine" wizard of VMware server or after that by editing the vmx file.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Finally, start the new virtual machine.&lt;/li&gt;&lt;/ol&gt;This ensures the compatibility with VMware Server.&lt;br /&gt;&lt;br /&gt;I hope you'll find this helpful in the future.&lt;br /&gt;&lt;br /&gt;Keep in touch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-7821427390301777251?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/7821427390301777251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=7821427390301777251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7821427390301777251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7821427390301777251'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2012/01/vmware-issues-when-copying-virtual.html' title='VMware issues when copying virtual machines'/><author><name>Luix</name><uri>http://www.blogger.com/profile/07097113195001698472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_7ogr8wNjLG4/SDCpP_C1POI/AAAAAAAAAGo/gxjmeNyHIu4/S220/buk16-02-2008+003.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-7311421585125703088</id><published>2012-01-10T10:40:00.000+01:00</published><updated>2012-01-10T10:40:16.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scm'/><title type='text'>The history/story behind transparent scm</title><content type='html'>I'd like to tell the story of how Plastic evolved towards &lt;a href="http://www.plasticscm.com/features/transparent-scm.aspx"&gt;"transparent scm"&lt;/a&gt;.What you're seeing today in 4.0 is the result of quite an evolution since we first wanted to walk the transparent path.&lt;h2&gt;Inspiration&lt;/h2&gt;Believe it or not, our original inspiration towards transparent scm was good-ol ClearCase. CC implemented MVFS, a dynamic file system able to show you the full file tree of a given version, capture all IO calls and adjust them to SCM operations.&lt;p&gt;&lt;p&gt;Sample: cat foo.c@main@4&lt;p&gt;&lt;p&gt;Would be captured by the CC fs driver and instead of issuing a "file not found" it would be able to get the right version of the file to be dumped by "cat".&lt;p&gt;&lt;p&gt;Likewise it was able to intercept "move" operations so you didn't need to run "cleartool mv" command. What does it mean? You don't need to tell the SCM that you modified a file or that you moved it: it is intercepting all your IO actions, and making the right ops at the FS level!&lt;p&gt;&lt;p&gt;So, definitely, we always wanted to have some sort "move interception" to avoid having to "tell" plastic a file or dir was moved... it would simply know.&lt;h2&gt;First attempts&lt;/h2&gt;We code-named "glass" the first version of what we called "plastic made transparent" (hence glass).&lt;p&gt;&lt;p&gt;Glass was able to use some underlying FS layer (third party FS driver code to simplify FS creation) to intercept all ops and:&lt;li&gt;do a checkout automatically when you modify a file (remember, checkout in plastic, perforce or clearcase sense, not svn or git. Checkout means "create a new version" instead of "download the code"&lt;li&gt;do move ops for you (you just move the files or dirs and glass issues a plastic mv command for you)&lt;li&gt;deletes and adds elements&lt;p&gt;Well, writing your own FS is always a cool thing, but there were caveats:&lt;li&gt;An issue on a FS can tear down the entire system (blue screen of dead ! :P)&lt;li&gt;Intercepting all the IO ops impacts performance&lt;p&gt;So, while we used glass internally, we never moved it to production mode.&lt;h2&gt;Xdiff&lt;/h2&gt;Ok, you might think: what does Xdiff have to do with transparent?? Well, &lt;a href="http://www.plasticscm.com/features/xmerge.aspx"&gt;Xdiff implements an algorithm to find moved&lt;/a&gt; fragments of text even when they've been modified afterwards. It is able to calculate "similarities".&lt;p&gt;Xdiff opened up a new door to make Plastic transparent.&lt;h2&gt;The current version&lt;/h2&gt;When we started the development of 4.0 we knew we wanted a new way to deal with local changes:&lt;li&gt;Work in the workspace doing changes, deletes, adding files or moving them&lt;li&gt;Have Plastic detect what happened.&lt;p&gt;And we applied the Xdiff technology. How?&lt;li&gt;Finding changes, deleted and added elements is easy (just compare disk with the loaded tree)&lt;li&gt;Each added/deleted pair will be run through a similarity algorithm to check whether it is the same file... moved! The same holds true for directories with a more advanced algorithm.&lt;p&gt;This way the "pending changes view" is now able to figure out what you did on your workspace, including modified and moved files, and directories (remember dvcs like git or mercurial are not able to track directory renames or moves).&lt;h2&gt;New way or working&lt;/h2&gt;Now it is straightforward to work on your favorite editor, doing refactors (renames and moves) and simply switch to plastic to checkin after detecting your changes.&lt;h2&gt;Future&lt;/h2&gt;Check &lt;a href="http://www.youtube.com/watch?v=cnJ5UgJJSkU"&gt;http://www.youtube.com/watch?v=cnJ5UgJJSkU&lt;/a&gt;. It is a dynamic file system based on Dokan.Net which is able to show a given configuration on a virtual "unit drive".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-7311421585125703088?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/7311421585125703088/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=7311421585125703088' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7311421585125703088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7311421585125703088'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2012/01/historystory-behind-transparent-scm.html' title='The history/story behind transparent scm'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6187366258501492907</id><published>2012-01-08T19:17:00.000+01:00</published><updated>2012-01-08T19:17:13.123+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='branching'/><title type='text'>The evolution of Plastic SCM branches</title><content type='html'>A long time ago in a galaxy far, far away.... first level branches were the kings. If you weren’t a plastiker yet then keep on reading because the true story about the empire of selectors is about to be revealed.&lt;h2&gt;All branches were born equal&lt;/h2&gt;When the first version of Plastic SCM was up and running (circa February 2006) all branches were “first level branches”. (If you’re interested on Plastic archeology check this &lt;a href="http://youtu.be/bn9vc7MRkSQ"&gt;http://youtu.be/bn9vc7MRkSQ&lt;/a&gt;). There was one branch to “rule them all” which was called “the main branch” which still survives as the ruler of the entire Plastic universe.&lt;h2&gt;The evil empire of selectors&lt;/h2&gt;All branches were created equal for a reason: you had your “main” branch, then you added content to it and later you were able to create a new empty “first level branch”. Then, based on selector rules, you were able to specify how to put content on it.&lt;p&gt;During this old period developers were forced to manually specify how the checkout process was going to happen. Look at the following selector:&lt;pre&gt;repository “coolcode”&lt;br /&gt;  path “/”&lt;br /&gt;    branch “/task001” checkout “/task001”&lt;br /&gt;  path “/”&lt;br /&gt;   branch “/main” checkout “/task001”&lt;/pre&gt;&lt;p&gt;Read through it in detail. What does it mean? There are two rules: the first one says: try to load the item from “/task001” and if you’ve loaded the item with this rule and you need to checkout, checkout to “/task001”.&lt;p&gt;Then there’s a second rule, which is the one performing the branching. This rule will only load items that were not loaded with the first rule (the selector rules are executed in priority order, top to bottom). So, at the beginning items will be on the “/main” branch only, so all will go through this rule.&lt;p&gt;If you check carefully you’ll see the second rule loads from “/main” but checkouts on “/task001”! This is how branching happened! On checkout, new revisions are placed on the new branch, then the first rule will be able to load them.&lt;h2&gt;Child branches to the rescue&lt;/h2&gt;As you can see, all started with really dark days, when just checking out a file forced all poor programmers to remind that “selectors rule”.&lt;p&gt;Then child branches were born and the following selector:&lt;pre&gt;repository “coolcode”&lt;br /&gt;  path “/”&lt;br /&gt;    branch “/main/task001” checkout “/main/task001”&lt;/pre&gt;&lt;p&gt;Was equivalent to the previous one. So, only one rule was needed to specify the “branching behavior” defined before.&lt;p&gt;A branch like “/main/task001” means: “get the content from task001 but if it doesn’t exist take it from main and place all checkouts in main”. It was an important step ahead back in the day.&lt;h2&gt;The age of smart branches&lt;/h2&gt;Later on (circa mid 2008) we launched “smart branches”. Basically to work on a branch you needed to “remember” the “starting point”. If “/main/task001” started from Label BL130 then you needed something like:&lt;pre&gt;repository “coolcode”&lt;br /&gt;  path “/”&lt;br /&gt;    branch “/main/task001” &lt;br /&gt;      label “BL130” &lt;br /&gt;    checkout “/main/task001”&lt;/pre&gt;&lt;p&gt;Otherwise “task001” would “inherit” from LAST on “main” which was the basis of the powerful “dynamic inheritance feature”.&lt;p&gt;Smart branches made things simpler because you were able to “set a base to a branch” and then your selector turned out to be something like the following:&lt;pre&gt;repository “coolcode”&lt;br /&gt;  path “/”&lt;br /&gt;    smartbranch “/main/task001”&lt;/pre&gt;&lt;p&gt;No need to specify the “label” nor the “checkout branch”.&lt;h2&gt;Branching in 4.0&lt;/h2&gt;Branches in 4.0 inherit from “smart branches” but simplify the whole thing: a branch starts from a changesets and upon checkin, adds changes to its initial configuration on the new branch. And that’s all.&lt;p&gt;Basically, in 4.0 a branch that starts from changest 1024 (on “main”) can be named “main/importantfix” if you want to highlight it is a “child” of the “main” branch, but you can easily create “importantfix” directly from cset 1024 too and they’ll behave exactly the same.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PMZKTJ6PEd0/TwndduxQ2kI/AAAAAAAABPk/BqUmFtDhi5s/s1600/firstlevelbranch.bmp" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="191" width="400" src="http://2.bp.blogspot.com/-PMZKTJ6PEd0/TwndduxQ2kI/AAAAAAAABPk/BqUmFtDhi5s/s400/firstlevelbranch.bmp" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;We kept the “child branch” concept in 4.0 because we think it introduces a “branching namespace” which is very good for existing Plastic SCM users (used to it for years) and also good to organize development for newcomers.&lt;p&gt;But remember that now all branches are equal, independently of whether they’re children or “first level” branches, unlike what happened in Plastic prior to 4.0.&lt;h2&gt;An image is worth…&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-paAFUY23IMI/TwndnfXyCMI/AAAAAAAABPw/isLIrxoCsdA/s1600/branchevolution.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="113" width="400" src="http://3.bp.blogspot.com/-paAFUY23IMI/TwndnfXyCMI/AAAAAAAABPw/isLIrxoCsdA/s400/branchevolution.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6187366258501492907?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6187366258501492907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6187366258501492907' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6187366258501492907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6187366258501492907'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2012/01/evolution-of-plastic-scm-branches.html' title='The evolution of Plastic SCM branches'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-PMZKTJ6PEd0/TwndduxQ2kI/AAAAAAAABPk/BqUmFtDhi5s/s72-c/firstlevelbranch.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-836083529689052848</id><published>2012-01-04T21:08:00.000+01:00</published><updated>2012-01-05T09:08:21.221+01:00</updated><title type='text'>Listening to the user voice</title><content type='html'>Happy 2012 everyone!&lt;p&gt;You know we listen to you and here’s a blog post focused on explaining what’s new in our latest BL237.7 build (4.0.237.7 version) and where does it came from.Remember we’re using &lt;a href="https://plasticscm.uservoice.com"&gt;“user voice”&lt;/a&gt; and we’re more than happy to receive your feedback there.&lt;h2&gt;The top one request: create branch from my checkouts&lt;/h2&gt;&lt;a href="https://plasticscm.uservoice.com/forums/15467-general/suggestions/2453408-create-branch-from-current-checkouts"&gt;You wanted it&lt;/a&gt; and here it is the result:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-44Ip6qm_uCk/TwSxQB6nhXI/AAAAAAAABPA/eu_UY7kWrXE/s1600/checkinchangestootherbranch.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="135" width="400" src="http://2.bp.blogspot.com/-44Ip6qm_uCk/TwSxQB6nhXI/AAAAAAAABPA/eu_UY7kWrXE/s400/checkinchangestootherbranch.png" /&gt;&lt;/a&gt;&lt;/div&gt;(The entry was introduced in “uservoice” only 20 days ago!)&lt;h2&gt;Gamer’s choice: undo unchanged&lt;/h2&gt;I got this one (again) &lt;a href="http://plasticscm.uservoice.com/forums/15467-general/suggestions/2470962-option-to-undo-checkouts-for-unchanged-files"&gt;during my “US Tour” about one month ago&lt;/a&gt;. Gaming companies seem to dramatically need it, and here it is! :)&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wfIOHbt8JhM/TwSxcNyLuhI/AAAAAAAABPM/hJ-XqKahVIw/s1600/undounchanged.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="107" width="400" src="http://2.bp.blogspot.com/-wfIOHbt8JhM/TwSxcNyLuhI/AAAAAAAABPM/hJ-XqKahVIw/s400/undounchanged.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Never miss the switch&lt;/h2&gt;Another “classic request”: you create a new branch, then you want to switch to it. &lt;a href="https://plasticscm.uservoice.com/forums/15467-general/suggestions/2452909-option-to-automatically-switch-workspace-when-crea"&gt;Why Plastic doesn’t have an option to do it in one step?&lt;/a&gt; Ok, here it goes.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-MroAWRn8a0o/TwSxpaL2rLI/AAAAAAAABPY/yx09ilDRRiw/s1600/createbranchandswitchtoit.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="331" src="http://2.bp.blogspot.com/-MroAWRn8a0o/TwSxpaL2rLI/AAAAAAAABPY/yx09ilDRRiw/s400/createbranchandswitchtoit.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;More requests&lt;/h2&gt;If you check BL237.7 release notes, you’ll find it is filled with requests and fixes. Just to mention a few:&lt;li&gt;New: Xlink creation from a label. Example: cm xlink codesecondrepo / lb:LB001@second@localhost:8084. I promised this one a few days ago on the forum, didn’t I?&lt;li&gt;Provide a way to “ignore changes” so that they’re only considered if they’re checked out! (Reminds me Salt Lake City! :P)&lt;li&gt;Branch explorer label menu: if there’s only one label, don’t show a sub-menu&lt;li&gt;Merge: able to specify “merge contributor” from a context menu&lt;li&gt;Merge: able to correctly merge (and visualize!) chmod protection changes&lt;li&gt;Enhance top level branch creation (top level branches were almost evil in 3.0, but they’re your friends now… I’ll blog about it soon)&lt;li&gt;New “rm-rep” trigger: new trigger available: before-rmrep and after-rmrep, executed when deleting an existing repository&lt;h2&gt;And fireworks to finish&lt;/h2&gt;This one deserves a post on its own: do you know that Visual Studio “move tracking” is greatly limited? If you move a file from one project to another within the same solution… it won’t work. Visual Studio can’t handle this and will incorrectly notify an add/delete pair instead of a move operation to the underlying version control. It was broken for infamous SCC and it is still broken now, including TFS.&lt;p&gt;Well… we fixed it! New 237.7 is able to deal with files moved between projects!! Cool, isn’t it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-836083529689052848?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/836083529689052848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=836083529689052848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/836083529689052848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/836083529689052848'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2012/01/listening-to-user-voice.html' title='Listening to the user voice'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-44Ip6qm_uCk/TwSxQB6nhXI/AAAAAAAABPA/eu_UY7kWrXE/s72-c/checkinchangestootherbranch.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1405975892129954374</id><published>2012-01-04T10:01:00.000+01:00</published><updated>2012-01-04T10:01:31.056+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='migration'/><title type='text'>Plastic SCM 3.0 to 4.0 migration notes</title><content type='html'>This guide will give you some hints about how to perform a migration from Plastic SCM 3.0 to version 4.0.&lt;h2&gt;Background&lt;/h2&gt;Plastic SCM 1.0 was first released in November 2006, and since then the basic underlying design has been evolving incrementally. During the development of version 4.0 we had to make some modifications to the core server structure in order to enable better distributed support, increased performance and an improved merge mechanism.&lt;p&gt;These core changes didn’t have a huge impact on the underlying database structure (if you look carefully you’ll note that the only difference is about the usage of the old “childrenitem” table, which entries were modified (visible on beta) and now have disappeared completely.&lt;p&gt;This important change made direct database upgrade (as we always did so far: just run the server and during start-up it upgrades the database) no longer feasible.&lt;p&gt;On the other hand, we have changed our “import strategy” and instead of developing specific “importers” (Subversion, CVS, Visual Source Safe) we’ve now standardized on the “fast-import / fast-export command suite”. This new “fast-export/import” allows us to provide import capabilities from a wider set of SCMs and also enable an easier “way out” for teams who need to feel they’ve a “way back” in case something fails during the move to a new SCM. It also allows us to provide a much better git interop.&lt;p&gt;We implemented the “fast-export” support for Plastic SCM 3.0 too (available on the latest releases) and then we’ve just decided to stick to this migration path to enable the move to 4.0. &lt;p&gt;In short:&lt;li&gt;Upgrade your 3.0 installation to the latest (3.0.187.33 -&gt; for migration purposes only, don't use it for normal production).&lt;li&gt;Upgrade your 4.0 installation to 4.0.237.7 (or newer).&lt;li&gt;Fast-export your repository from 3.0&lt;li&gt;Fast-import it on 4.0&lt;h2&gt;How to migrate from 3.0 to 4.0&lt;/h2&gt;&lt;li&gt;Perform the fast-export of the 3.0 target repository. This command will create a file that will be used by the fast-import. The first argument is the spec of the target repository. The second one is the output file.&lt;pre&gt;&lt;br /&gt;$ cm fast-export repo@localhost:8084 repo.fast-export &lt;br /&gt;&lt;/pre&gt;&lt;li&gt;Perform the fast-import of the exported repository. This command will create a 4.0 database with the imported data (previously exported from 3.0). The first argument is the spec of the target repository (this should be a non-existing repository or a recently created, empty one). The second one is the output file with the 3.0 data.&lt;pre&gt;&lt;br /&gt;$ cm fast-import repo@localhost:8087 repo.fast-export &lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;Restrictions due to branch inheritance&lt;/h2&gt;&lt;p&gt;There are some important changes between 3.0 and 4.0 underlying structure which will force the 3.0 fast-export command to “discard” some branches.&lt;p&gt;The reason is tightly related to the way in which 3.0 dynamic branch inheritance worked. In 4.0 each branch points to a changeset “head”, the latest changeset on the branch. So, switching to a branch is always equivalent to switching to the last changeset on the branch. Each changeset is statically resolved which means it simply points to a given source code tree, starting on the root directory of your repository and then to all its content (it doesn’t mean each changeset contains an entire copy of the repo!! Don’t worry about storage!).&lt;p&gt;Things were a little bit different with 3.0, where the selector rules were necessary in order to resolve a given tree. Remember you could have branches pointing to “last” which means switching to it would load your content on the branch and “combine it” (not merge, just combine the non-overlapping entries) with the latest on the parent branch.&lt;p&gt;There is a big difference between the changesets in 3.0 and 4.0. In 4.0, each changeset points to an entire, statically resolved tree. It wasn’t true in 3.0 for the changesets on branches inheriting from “last” since “last” would dynamically move.&lt;p&gt;What does it mean? Basically: branches inheriting from “last” won’t be exported by the 3.0 fast-export command and hence won’t be imported in 4.0. If this is a problem for you and prevents you to migrate to 4.0, please let us know.&lt;h2&gt;Merge tracking changes&lt;/h2&gt;Merge tracking has been deeply modified in 4.0. Merge tracking was implemented at the “item” level prior to 4.0 and has now been moved to “changeset” level.&lt;li&gt;Item level merge tracking: means that each time you merge a file or directory, there’s a new merge link created between the specific file or directory revisions. It provides some advanced functionalities (like partial merging: you can merge just part of a changeset and then merge the rest later keeping full tracking) but paying a high price for it: performance is poorer. Each item has its own “merge tree” that needs to be calculated and checked individually. Merging a big number of items tends to be slow.&lt;li&gt;Changeset level merge tracking: means that the merge links are created between changesets instead of items. (&lt;b&gt;Note&lt;/b&gt;: this is the way in which all the new DVCS work: Git, Hg, Plastic SCM…). Performance is much higher since merge calculation doesn’t depend on the number of items to be merged. Understanding the evolution is also simpler because you only have to take a look at the branch explorer to understand what was merged and what was not, instead of having to check each item individually. In 4.0 we didn’t only modify the “tracking” but also greatly improved the underlying merging mechanism supporting many merge cases that were simply not doable before (divergent move, change-delete conflicts and many more).&lt;p&gt;This important structural changes (tree + merge tracking) are the reasons why a “direct” migration wasn’t feasible so far, and also the reason why we decided to go through a “export-import” path.&lt;p&gt;The main risk migrating from 3.0 to 4.0 (and we’re currently working on it) is when a “partial merge link” is wrongly migrated as a full merge link (the only ones supported in 4.0) leading to potential merge calculation errors later on.&lt;h2&gt;Merge between branches with different bases&lt;/h2&gt;Check the following merge scenario created with 3.0:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-MnxLFo-Y6Vs/TwQUx9yA81I/AAAAAAAABO0/GV0gpgo0jMQ/s1600/basetracking.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="195" width="400" src="http://2.bp.blogspot.com/-MnxLFo-Y6Vs/TwQUx9yA81I/AAAAAAAABO0/GV0gpgo0jMQ/s400/basetracking.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The merge from &lt;i&gt;/main/task001&lt;/i&gt; to &lt;i&gt;/main/task002&lt;/i&gt; will only propose &lt;i&gt;/src/foo.c&lt;/i&gt; to be merged, because it was the only item modified in the branch. It means that &lt;i&gt;“/doc/plan.pdf”&lt;/i&gt; won’t be proposed to be merged to &lt;i&gt;“task002”&lt;/i&gt;. This was an important limitation on 3.0 and has been fixed in 4.0.But, if the merge was performed in 3.0, the merge link will be there but &lt;i&gt;“task002”&lt;/i&gt; won’t contain the modified &lt;i&gt;“plan.pdf”&lt;/i&gt;.&lt;p&gt;Now you migrate from 3.0 to 4.0 and decide to merge “task002” to “main”. The new merge system will check the differences between the source changeset and the base changeset and it will find that “plan.pdf” was modified (because “task002”, despite of the 3.0 merge, will still contain the “old plan.pdf”, and 4.0 doesn’t have (so far) a good way to know whether it was incorrectly merged on 3.0 or really modified.&lt;p&gt;At the end of the day, merging task002 will put the old “plan.pdf” on “main”, incorrectly, because the merge link between task001 and task002 is set by 3.0, and 4.0 can’t handles merge differently.&lt;p&gt;(The case is a little bit dense so feel free to contact us if you need further info).This is not a problem with the following type of merges:&lt;li&gt;It has been detected as branch rebase (the base of the branch was changed by the switchbranchbase command).&lt;li&gt;The source and destination of the merge are in the same branch.&lt;li&gt;The source of the merge is the main branch.&lt;li&gt;The destination branch of the merge is the branch base of the source branch.&lt;li&gt;The source branch of the the merge is the branch base of the destination branch.&lt;li&gt;The source &amp; destination branches have the same changeset/label as branch base.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1405975892129954374?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1405975892129954374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=1405975892129954374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1405975892129954374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1405975892129954374'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2012/01/plastic-scm-30-to-40-migration-notes.html' title='Plastic SCM 3.0 to 4.0 migration notes'/><author><name>Ruben</name><uri>http://www.blogger.com/profile/05840087631710682187</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-MnxLFo-Y6Vs/TwQUx9yA81I/AAAAAAAABO0/GV0gpgo0jMQ/s72-c/basetracking.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8843451747846730979</id><published>2011-12-30T10:53:00.009+01:00</published><updated>2011-12-30T11:55:07.005+01:00</updated><title type='text'>Active Directory - Work with huge AD trees</title><content type='html'>Recently we have experienced an issue when configuring the system authentication mode to Active Directory.  The Active Directory tree contained more than 3000 entries.&lt;br /&gt;&lt;br /&gt;By default,  Active Directory allows fetching only 1000 entries foreach search request to the Active Directory Domain. The main reasons of this limit are security and performance.&lt;br /&gt;&lt;br /&gt;If a search query to the Active Directory returns more than 1000 results, the ActiveDirectory throws an exception (sizelimitexception, LDAP error code 4).&lt;br /&gt;Plastic SCM catches the exception and shows the following warning message:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-LLJTgaejH64/Tv2L0liMJ3I/AAAAAAAAACA/k1Wz0uaUMMY/s1600/ad-ldap-1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 191px;" src="http://2.bp.blogspot.com/-LLJTgaejH64/Tv2L0liMJ3I/AAAAAAAAACA/k1Wz0uaUMMY/s320/ad-ldap-1.png" alt="" id="BLOGGER_PHOTO_ID_5691859239611148146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;At this point, there are three possible solutions to get a result:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Close the warning message and specify a filter on the "Filter" textbox from the User Selection dialog.&lt;br /&gt;Doing this, Plastic SCM will filter the query to the Active Directory domain, and will retrieve less results than before.&lt;br /&gt;&lt;br /&gt;Constraints:&lt;br /&gt;- The specified filter has to return less than 1000 results.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Specify a subdomain to the PlasticSCM server configuration instead of the entire Active Directory domain.&lt;br /&gt;Doing this, Plastic SCM server will query only for users and groups from the specified subdomain.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;If you currently have configured your PlasticSCM server ActiveDirectory's domain to:&lt;br /&gt;"mycompany.com"  (or "dc=mycompany,dc=com")&lt;br /&gt;Change it to:&lt;br /&gt;"developers.mycompany.com"  (or "dc=developers,dc=mycompany,dc=com")&lt;br /&gt;You can perform this change through the server configuration wizard.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-nUxVKed3li0/Tv2WiSgIwVI/AAAAAAAAACM/yR-WgyXyYr4/s1600/ad-ldap-2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 213px;" src="http://1.bp.blogspot.com/-nUxVKed3li0/Tv2WiSgIwVI/AAAAAAAAACM/yR-WgyXyYr4/s320/ad-ldap-2.png" alt="" id="BLOGGER_PHOTO_ID_5691871019892523346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Constraints:&lt;br /&gt;- All the PlasticSCM users must be contained on that subdomain&lt;br /&gt;- The list of users/group on the subdomain contains less than 1000 entries.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Change the Active Directory's limit. You can do that by following this guide from Microsoft's Knowledge base: &lt;a href="http://support.microsoft.com/kb/315071"&gt;http://support.microsoft.com/kb/315071&lt;/a&gt;&lt;br /&gt;(Sections: "Starting Ntdsutil.exe", "Viewing current policy settings" and "Modifying policy settings").&lt;br /&gt;&lt;br /&gt;Mainly, the steps are the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Run "Ntdsutil.exe" on the Active Directory machine.&lt;/li&gt;&lt;li&gt;At the "Ntdsutil.exe" command prompt, type "LDAP policies"&lt;/li&gt;&lt;li&gt;At the "LDAP policy" command prompt, type "connections"&lt;/li&gt;&lt;li&gt;At the "server connection" command prompt, type "connect to server MYHOST.mydomain.com"&lt;br /&gt;Examples:&lt;br /&gt;"connect to server localhost"&lt;br /&gt;"connect to server ldapserver.archgroup.com"&lt;/li&gt;&lt;li&gt;At the "server connection" command prompt, type "q"&lt;/li&gt;&lt;li&gt;At the "LDAP policy" command prompt, type "Set MaxPageSize to NEW_VALUE"&lt;br /&gt;Example:"Set MaxPageSize to 3000"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;At the "LDAP policy" command prompt, type "Commit Changes"&lt;/li&gt;&lt;li&gt;At the "LDAP policy" command prompt, type "q"&lt;/li&gt;&lt;li&gt;At the "Ntdsutil.exe" command prompt,type "q"&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-ULneDW2dRrU/Tv2YaeP6ghI/AAAAAAAAACY/wWgIH3RzZxw/s1600/ad-ldap-3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 160px;" src="http://3.bp.blogspot.com/-ULneDW2dRrU/Tv2YaeP6ghI/AAAAAAAAACY/wWgIH3RzZxw/s320/ad-ldap-3.png" alt="" id="BLOGGER_PHOTO_ID_5691873084630008338" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8843451747846730979?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8843451747846730979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8843451747846730979' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8843451747846730979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8843451747846730979'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/12/active-directory-work-with-huge-ad.html' title='Active Directory - Work with huge AD trees'/><author><name>Jesus</name><uri>http://www.blogger.com/profile/01680242678246559201</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-LLJTgaejH64/Tv2L0liMJ3I/AAAAAAAAACA/k1Wz0uaUMMY/s72-c/ad-ldap-1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6448670643435657937</id><published>2011-12-21T03:16:00.000+01:00</published><updated>2011-12-21T03:16:07.590+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scm'/><title type='text'>Move detection – advanced bits</title><content type='html'>&lt;a href="http://www.plasticscm.com/features/transparent-scm.aspx"&gt;Move detection&lt;/a&gt; is one of the big features in 4.0, as I’m sure you’re already aware of.&lt;p&gt;It has been implemented on top of the same underlying technology we use for &lt;a href="http://www.plasticscm.com/features/xmerge.aspx"&gt;Xdiff and Xmerge&lt;/a&gt;.&lt;p&gt;The point is: you just move a file on your workspace without issuing a “cm mv” operation (command line, GUI or through a plugin), and later Plastic is able to “detect” the move happened.&lt;h2&gt;How it works&lt;/h2&gt;The principles of move detection are quite easy: Plastic has a list of the files (stored under .plastic/plastic.wktree file on the workspace) that are “controlled” under the workspace. Then you decide to look for changes:&lt;li&gt;If a file on the workspace is not on the list: then it is proposed as an “added” candidate&lt;li&gt;If a file is on the list but not on the workspace: then it is proposed as a “deleted” candidate&lt;p&gt;How the “moves” are detected? The “added candidates” are matched with the “deleted candidates” and if they’re “similar enough” then they’re proposed as “moved”.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Y1HWLJF-W68/TvFAVb1c8mI/AAAAAAAABNg/uFeoU416PrQ/s1600/image00.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="278" width="400" src="http://1.bp.blogspot.com/-Y1HWLJF-W68/TvFAVb1c8mI/AAAAAAAABNg/uFeoU416PrQ/s400/image00.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Let’s make it more complicated&lt;/h2&gt;What if foo.c is something like the following?&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-1h6LqshGEOs/TvFAhRp-AFI/AAAAAAAABNs/HcpIrMZfJjM/s1600/image01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="160" width="298" src="http://3.bp.blogspot.com/-1h6LqshGEOs/TvFAhRp-AFI/AAAAAAAABNs/HcpIrMZfJjM/s400/image01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;And we rename it to bar.c and modify it this way:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3iySOXcU7C4/TvFAodGH8JI/AAAAAAAABN4/X7V_m9HkmhA/s1600/image02.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="132" width="278" src="http://4.bp.blogspot.com/-3iySOXcU7C4/TvFAodGH8JI/AAAAAAAABN4/X7V_m9HkmhA/s400/image02.png" /&gt;&lt;/a&gt;&lt;/div&gt;The file was so small that this little change will make the two versions less than 90% different, so “pending changes” view will look like this:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cequEgFOkHw/TvFAxQXhPTI/AAAAAAAABOE/9EmPUbuJask/s1600/image03.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="61" width="400" src="http://2.bp.blogspot.com/-cequEgFOkHw/TvFAxQXhPTI/AAAAAAAABOE/9EmPUbuJask/s400/image03.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;As you can see plastic detects a “potential add” and a “potential delete”.&lt;h2&gt;Matching manually&lt;/h2&gt;Right click on the “potentially added” file and select “search matches”:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Xm7_K_MqyrA/TvFA-U2vWtI/AAAAAAAABOQ/TeJV-ErqHqU/s1600/image04.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="163" width="270" src="http://4.bp.blogspot.com/-Xm7_K_MqyrA/TvFA-U2vWtI/AAAAAAAABOQ/TeJV-ErqHqU/s400/image04.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;And then the “matching” dialog will show up. You can slide the similarity bar until the candidate appears:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-kjLx2lcR6o8/TvFBFHryIdI/AAAAAAAABOc/YVewmd3KJEw/s1600/image05.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="127" width="400" src="http://2.bp.blogspot.com/-kjLx2lcR6o8/TvFBFHryIdI/AAAAAAAABOc/YVewmd3KJEw/s400/image05.png" /&gt;&lt;/a&gt;&lt;/div&gt;And once you “accept the selected match”, the “pending changes view” will reflect the move:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-3X6DzIcDBk8/TvFBKy2hy_I/AAAAAAAABOo/G1v5EjKFCRM/s1600/image06.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="109" width="245" src="http://4.bp.blogspot.com/-3X6DzIcDBk8/TvFBKy2hy_I/AAAAAAAABOo/G1v5EjKFCRM/s400/image06.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6448670643435657937?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6448670643435657937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6448670643435657937' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6448670643435657937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6448670643435657937'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/12/move-detection-advanced-bits.html' title='Move detection – advanced bits'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-Y1HWLJF-W68/TvFAVb1c8mI/AAAAAAAABNg/uFeoU416PrQ/s72-c/image00.png' height='72' width='72'/><thr:total>1</thr:total><georss:featurename>Seoul, South Korea</georss:featurename><georss:point>37.566535 126.9779692</georss:point><georss:box>37.365159 126.66211220000001 37.767911000000005 127.2938262</georss:box></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6285512069046769112</id><published>2011-12-09T18:33:00.000+01:00</published><updated>2011-12-09T18:33:15.126+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>plastic 700 sec – git 1200 sec – a c# development story</title><content type='html'>The short story: take a code tree of 192.818 files in 33.877 directories (overall size: 5.75GB) and check in on your favorite version control tool. Plastic SCM needs 713 secs, Git needs 1287 secs.Yes, we’re faster than Git!!!!!!And yes: a C# program can outperform a well-written C program by a 44%!!!(Ok, we’d be running cycles around “gitty” had we chosen C++ :P)&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3kqJvTGjReg/TuJFbsdmlHI/AAAAAAAABNM/zmEtpgrLg0k/s1600/cispeed.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="278" width="393" src="http://1.bp.blogspot.com/-3kqJvTGjReg/TuJFbsdmlHI/AAAAAAAABNM/zmEtpgrLg0k/s400/cispeed.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;The story – the beginning&lt;/h2&gt;We started plastic scm back in 2005 and we decided to go for C# because it was much faster to develop with than C/C++. I missed C++ for a while but “.net remoting” (I was a DCOM fan) changed my mind.&lt;p&gt;We only used C# because Mono existed. A true SCM must be multiplatform. Mono was there, so we went for C#.The first time we added a source tree to plastic was in September 2005 or so. It was the quake source code: 1200 files (about 30Mb). It took 11 hours to complete. (Yes, you read correctly, eleven hours!!!)&lt;p&gt;Then we removed NHibernate out of the picture and developed the “sql” datalayer (look for datalayersql assembly when you download plastic) we’re still using today (with a ton of improvements) and things started to speed up.&lt;p&gt;We released Plastic SCM 1.0 back in November 2006 in TechEd Developers in Barcelona. It wasn’t the fastest thing on earth but it already had some of the best branching and merging in town. (Check this for &lt;a href="http://www.facebook.com/media/set/?set=a.92999222524.96957.8260127524&amp;type=3"&gt;some historical plastic scm photos&lt;/a&gt;)&lt;h2&gt;You’ve to pay for your mistakes&lt;/h2&gt;And we did. The first thing was the design of the “communication layer” between the client and the server. We came up with a neat and supposedly well designed set of interfaces. Thanks to Mono.Remoting it was all like “invoking local methods”. Isn’t it good?&lt;p&gt;&lt;p&gt;NO.&lt;p&gt;&lt;a href="http://pragprog.com/book/kpiod/interface-oriented-design"&gt;Interface Oriented Design&lt;/a&gt; greatly explains why.Initially (for newbies) it can sound much better to have something like this:&lt;pre&gt;&lt;br /&gt;CheckinInterface&lt;br /&gt;{&lt;br /&gt;    void Checkin(File file);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Than this:&lt;pre&gt;&lt;br /&gt;CheckinInterface&lt;br /&gt;{&lt;br /&gt;    void Checkin(File[] files);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;But it is simply wrong. Over the network, the less roundtrips, the better.&lt;p&gt;Of course it wasn’t as simple as that, it meant really redesigning most operations to work “block based” instead of individually, something we finally put on stone back in Nov 2010 when we started Plastic SCM 4.0.&lt;p&gt;Now every data transfer is minimized (and there’s still work to do) and ready to work with “bulks”. So, the bigger the checkin op is, the faster we are compared to other systems out there.&lt;h2&gt;Being faster than Git&lt;/h2&gt;At the beginning we wanted to be &lt;a href="http://codicesoftware.blogspot.com/2006/08/faster-than-perforce.html"&gt;faster than Perforce&lt;/a&gt; and so we did: our “update” (downloading the code to a workspace, “checkout” in git/svn jargon) was faster than competitors long ago.&lt;p&gt;But, the folks at Perforce removed their “fast scm motto” once Git became mainstream (now they’re on a different party) and beating Perforce wasn’t fun anymore.&lt;p&gt;We &lt;a href="http://codicesoftware.blogspot.com/2010/07/version-control-scalability-shoot-out.html"&gt;focused on scalability due to business requirements&lt;/a&gt; for a while() and we still do! But beating all competitors on a single “speed up” test was sort of a goal.&lt;h2&gt;Changes on the database backend&lt;/h2&gt;Plastic stores all data and metadata on a database: it can be MySql, Firebird, SQLServer, SQLServer CE, Oracle and now also Postgresql.&lt;p&gt;In order to speed up we had to dramatically reduce the number of data transfers to the database. In SQL Server we did that using “bulk copy” selectively when possible (a huge checkin will activate it), so 8 months ago we were consistently beating git with the same data tree using SQL Server…&lt;p&gt;Yes!! It is possible to insert a tree of 200k items on SQL Server (using the network stack and everything) than putting it on git’s hidden directory (ok, database :P).&lt;h2&gt;The current test&lt;/h2&gt;The current test I’m writing about today was performed using:&lt;li&gt;Plastic  4.0.237.2 (sqlite backend)&lt;li&gt;git -&gt; 1.7.8.msysgit.0&lt;p&gt;We’re running on Windows 7 on a DELL XPS 13 laptop (2/3 years old) with 8GB RAM.&lt;p&gt;We’re using the sqlite backend, which is very good for distributed usage (I’m using it for more than 2 years now on my laptop) but doesn’t work well with concurrency.&lt;h2&gt;Future steps&lt;/h2&gt;We always wrote our data and metadata on SQL databases. They work simply great, even faster than the file system (http://codicesoftware.blogspot.com/2008/09/firebird-is-faster-than-filesystem-for.html) under certain circumstances.&lt;p&gt;But we’re considering a file system based backend (custom, closed, sort of what git/hg do today) to be used by distributed developers (main server can still be on SQL Server or MySql) and speed up some operations even more… (if possible! :P)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6285512069046769112?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6285512069046769112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6285512069046769112' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6285512069046769112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6285512069046769112'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/12/plastic-700-sec-git-1200-sec-c.html' title='plastic 700 sec – git 1200 sec – a c# development story'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-3kqJvTGjReg/TuJFbsdmlHI/AAAAAAAABNM/zmEtpgrLg0k/s72-c/cispeed.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8515850942078160138</id><published>2011-12-01T14:46:00.016+01:00</published><updated>2011-12-07T12:46:51.730+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><title type='text'>How to link repositories using Xlinks</title><content type='html'>&lt;div style="text-align: left;"&gt;Xlinks are one of the coolest new features in Plastic SCM 4.0.&lt;br /&gt;&lt;br /&gt;They're basically a way to link different "trees" together so that a "project" repository can have "versioned links" to other component repositories and then just switching to a branch on the "project" repo will set up all the code for you.&lt;br /&gt;&lt;br /&gt;For 3.0 users: instead of delving with complex multi-repository selectors, Xlinks enable a way to just link to repos and download them easily (developers on your team won't have to copy/paste complex selectors, just switch to the right branches).&lt;br /&gt;&lt;br /&gt;For Git users: Xlinks are "submodules" done right!&lt;br /&gt;&lt;br /&gt;I’m going to show you how easy is working with multiple repositories at the same time using Xlinks.&lt;/div&gt;&lt;div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;h2&gt;&lt;span lang="EN-US" style="font-size: small;"&gt;Scenario&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;We have several repositories, one for the source code, one for marketing stuff and the last one for third party tools.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;Core&lt;/div&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5681156654748194994" src="http://2.bp.blogspot.com/-cOMHKE9-xEo/TteF4J-c2LI/AAAAAAAAALA/r_gZ0FQ7QPM/s400/core.png" style="cursor: pointer; display: block; height: 234px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; width: 304px;" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center;"&gt;ThirdParty&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/-sLE19D5emyA/TteF7PC1YBI/AAAAAAAAALM/qb7e0Ug77xk/s1600/thirdparty.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5681156707648364562" src="http://3.bp.blogspot.com/-sLE19D5emyA/TteF7PC1YBI/AAAAAAAAALM/qb7e0Ug77xk/s400/thirdparty.png" style="cursor: hand; cursor: pointer; display: block; height: 169px; margin: 0px auto 10px; text-align: center; width: 305px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;Marketing&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5681156751770775362" src="http://4.bp.blogspot.com/-WcP7V335bE0/TteF9zab70I/AAAAAAAAALY/i9JF2qmwffg/s400/marketing.png" style="cursor: pointer; display: block; height: 196px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 304px;" /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Motivation&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;It’s a good idea to have your information divided into isolated repositories since they are independent sub-projects, but actually they are part of the same project, so many times they will need to evolve together and share their content. For example, the Core repository needs the ThirdParty repository to achieve a successful build.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;How can we mix these repositories and work with all of them at the same time? Xlinks.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;h2&gt;&lt;span lang="EN-US" style="font-size: small;"&gt;Solution&lt;/span&gt;&lt;/h2&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;We have to create a new repository that will be the one who is going to manage the Xlinks to external repositories. This will be our “Project” repository.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5681157530154090882" src="http://4.bp.blogspot.com/--W8NzKQhsqg/TteGrHHewYI/AAAAAAAAALk/mseu-OIhdJI/s400/repositories.png" style="cursor: pointer; display: block; height: 169px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 262px;" /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Create a new workspace working against the new repository, make three new directories, this will be the skeleton for the final structure.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/-sLE19D5emyA/TteF7PC1YBI/AAAAAAAAALM/qb7e0Ug77xk/s1600/thirdparty.png"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-sLE19D5emyA/TteF7PC1YBI/AAAAAAAAALM/qb7e0Ug77xk/s1600/thirdparty.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/-Quxw1jZYxiY/TteFvlvwErI/AAAAAAAAAK0/TtGuFskuSsQ/s1600/Skeleton.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5681156507583910578" src="http://4.bp.blogspot.com/-Quxw1jZYxiY/TteFvlvwErI/AAAAAAAAAK0/TtGuFskuSsQ/s400/Skeleton.png" style="cursor: hand; cursor: pointer; display: block; height: 196px; margin: 0px auto 10px; text-align: center; width: 324px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Now we create the Xlinks to our external repositories. You can find more info about how to create them issuing “cm xlink --help” but basically you just need to type ‘--w’ if you want to create a writable Xlink, where is going to be placed the external repository content, the external repository path that is going to be mounted and finally the starting changeset of the external repository.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;Sub-root paths will be supported in the future but from now you can only use the root path “/”.&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;a href="http://1.bp.blogspot.com/-NHBg4aYgWfk/TteHpwnoJcI/AAAAAAAAAL8/fSf1As4on_s/s1600/creatingXlinks.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5681158606446667202" src="http://1.bp.blogspot.com/-NHBg4aYgWfk/TteHpwnoJcI/AAAAAAAAAL8/fSf1As4on_s/s400/creatingXlinks.png" style="cursor: hand; cursor: pointer; display: block; height: 63px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: center;"&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="text-align: left;"&gt;&lt;span lang="EN-US"&gt;Now checkin ‘em all!!! You can use the pending changes view to do it.&lt;/span&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/-Vk5O9vzqCaA/TteILavgzsI/AAAAAAAAAMI/50i5E4O1VQ0/s1600/pendingChangesXlinks.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5681159184689712834" src="http://3.bp.blogspot.com/-Vk5O9vzqCaA/TteILavgzsI/AAAAAAAAAMI/50i5E4O1VQ0/s400/pendingChangesXlinks.png" style="cursor: hand; cursor: pointer; display: block; height: 208px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"&gt;When everything is inside the repository your Items view will be like image below, notice the small arrows over the icon means that they are Xlinks to external repositories.&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="color: #0000ee;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: 15px; line-height: 17px;"&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-7OovtUrU36M/TteIY9_Y65I/AAAAAAAAAMU/c6THQFj5Gic/s1600/XlinksAdded.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5681159417489845138" src="http://1.bp.blogspot.com/-7OovtUrU36M/TteIY9_Y65I/AAAAAAAAAMU/c6THQFj5Gic/s400/XlinksAdded.png" style="cursor: hand; cursor: pointer; display: block; height: 108px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;The last step to finally get the external content is perform an update operation, you can do it by right clicking on the workspace root item and Update.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-sjk6kIp98PU/TteIl1tKMnI/AAAAAAAAAMg/EP8gV5r6mJg/s1600/XlinkPostUpdate.png"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5681159638604198514" src="http://3.bp.blogspot.com/-sjk6kIp98PU/TteIl1tKMnI/AAAAAAAAAMg/EP8gV5r6mJg/s400/XlinkPostUpdate.png" style="cursor: hand; cursor: pointer; display: block; height: 269px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center" class="MsoNormal" style="text-align: center;"&gt;&lt;span lang="EN-US"&gt;&lt;span lang="EN-US" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; font-family: Arial, sans-serif; font-size: 10pt; line-height: 115%;"&gt;One repository to rule them all, One repository to find them.&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial, sans-serif; font-size: 10pt; line-height: 115%;"&gt;&lt;br /&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;One repository to bring them all and in the darkness bind them.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span lang="EN-US"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;h2&gt;&lt;span lang="EN-US"&gt;&lt;span lang="EN-US" style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Extra bonus&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;span lang="EN-US"&gt;  &lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;Do you remember that we created the Xlink with the “--w”? That means that they are writable! You can modify items under an Xlink, remove, move, merge, create branches, basically EVERYTHING.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US"&gt;With writable Xlinks you can evolve the 4 repositories at the same time, try to create a new branch on your Project repository, switch to it. Checkout a file inside an external repository, modify it a little bit and finally checkin it. PlasticSCM will automatically create a new branch on the remote repository to keep the change done!  And you don’t have to care about nothing it simply works!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8515850942078160138?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8515850942078160138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8515850942078160138' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8515850942078160138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8515850942078160138'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/12/how-to-link-repositories-using-xlinks.html' title='How to link repositories using Xlinks'/><author><name>Manu</name><uri>http://www.blogger.com/profile/16216075572494383120</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_Xqj1H4j2PWA/SNzH0nB162I/AAAAAAAAAAM/85w19DcUF3g/S220/yo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-cOMHKE9-xEo/TteF4J-c2LI/AAAAAAAAALA/r_gZ0FQ7QPM/s72-c/core.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2536373580439741657</id><published>2011-11-30T14:06:00.004+01:00</published><updated>2011-12-01T11:38:22.696+01:00</updated><title type='text'>How to install Plastic SCM 4.0 without system requirements restrictions</title><content type='html'>Hi, all:&lt;br /&gt;&lt;br /&gt;As you might already know, Plastic SCM 4.0 comes with SQLServer CE 4.0 as the default backend in Windows. We decided to replace our good-old friend Firebird with this one to avoid undesired collisions with  existing Plastic SCM 3.0 installations, since Plastic SCM 4.0 uses a different database schema that is not directly upgradeable.&lt;br /&gt;&lt;br /&gt;On the other hand, Plastic SCM 4.0 minimum software requirements have been lifted to meet those of SQLServer CE 4.0 (check this link:&lt;a href="http://www.microsoft.com/download/en/details.aspx?id=17876#system-requirements"&gt; http://www.microsoft.com/download/en/details.aspx?id=17876#system-requirements&lt;/a&gt;), which is a bit annoying, specially if you will customize your db.conf file to use a different backend after the installation / upgrade process.&lt;br /&gt;&lt;br /&gt;Strictly speaking, Plastic SCM 4.0 requirements still are .NET Framework 2.0 SP2 for the server and .NET Framework 2.0 for the client (we finally moved our client to .NET Framework 2.0, hurray!), so if you want to avoid all the system requirements just open a CMD console (or shell in Linux) and type the following in a single line:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:'courier new';"&gt;PlasticSCM-4.0.xxx.yyy-windows-installer.exe --nocheckrequirements true&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;where xxx.yyy is the release number you are trying to install. Please, take into account that if the system requirements are not met, Plastic SCM may not work correctly.&lt;br /&gt;&lt;br /&gt;Thanks for reading and enjoy Plastic SCM 4.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2536373580439741657?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2536373580439741657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=2536373580439741657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2536373580439741657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2536373580439741657'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/11/how-to-install-plastic-scm-40-without.html' title='How to install Plastic SCM 4.0 without system requirements restrictions'/><author><name>Luix</name><uri>http://www.blogger.com/profile/07097113195001698472</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp2.blogger.com/_7ogr8wNjLG4/SDCpP_C1POI/AAAAAAAAAGo/gxjmeNyHIu4/S220/buk16-02-2008+003.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-5569423476460506018</id><published>2011-11-24T00:32:00.001+01:00</published><updated>2011-11-24T00:36:39.756+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>4 3 2 1... launch</title><content type='html'>It has been an hectic season but we made it and released 4.0 last 17th.There has been several great things, but look at the videos: we had Robert C. Martin (of CleanCode and CleanCoders fame) and Steve Berczuk (THE Branching Patterns book) as keynote speakers!! Awesome, isn't it?http://www.plasticscm.com/plastic4launch/index-4.html&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/NZNhtYVb6H8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;Now looking forward talking, blogging and "demoing" the new release to the world! :)Thanks everyone for your support so far. We're a &lt;a href="http://www.plasticscm.com/company/team.aspx"&gt;small, highly committed team&lt;/a&gt; achieving great things! :) Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-5569423476460506018?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/5569423476460506018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=5569423476460506018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5569423476460506018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5569423476460506018'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/11/4-3-2-1-launch.html' title='4 3 2 1... launch'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/NZNhtYVb6H8/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8347073477209322299</id><published>2011-11-17T17:37:00.001+01:00</published><updated>2011-11-17T17:43:34.879+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='merging'/><title type='text'>Git merge vs the world</title><content type='html'>I’ll be talking about git merge system again, one of the strongest on the planet, and how a good merge system can unlock a new world of possibilities for developers facing complex refactors.And then, I’ll tell you how to break it. And what can be done.&lt;h2&gt;Refactor and merge&lt;/h2&gt;What does refactor have to do with merge? Aren’t merging and refactors on different planets?&lt;p&gt;Not at all: you’re working on a refactor and then you need to move Class.java to a new package. It happens, doesn’t it?&lt;p&gt;But while you’re working on your refactor, I’ll be tweaking Class.java.&lt;p&gt;Ok, now refactor has to do with merging, and if you’re avoiding this situation it only means one thing: you don’t have a proper SCM (we could argue but, ok, tell me you do not need a mouse, a good IDE…).&lt;h2&gt;The good, the bad and the ugly&lt;/h2&gt;Now you’ve to merge the previous scenario. What will happen?&lt;li&gt;Git (and of course my beloved Plastic SCM) will do the right thing: you get the rename plus the change. This IS what you expect.&lt;li&gt;SVN and the old fashioned pack (the bad and ugly) will, at best, end up with two files: the “old” Class.java with my changes plus yours, without my changes, on your destination location. Crazy.&lt;h2&gt;Let’s break it&lt;/h2&gt;Let’s do something else: you move and modify Class.java. But I do the same… moving it (of course!) to a different location.&lt;p&gt;Don’t do this at home with SVN: ok, the movie is over from the non-dvcs/non-merging scms, let’s focus on the real mergin machines.&lt;h2&gt;Git it!&lt;/h2&gt;How does Git handle it?&lt;pre&gt;&lt;br /&gt;$ git commit -a -m "initial"&lt;br /&gt;Created initial commit ced4e21: initial&lt;br /&gt; 1 files changed, 181 insertions(+), 0 deletions(-)&lt;br /&gt; create mode 100644 foo.cs&lt;br /&gt;&lt;br /&gt;$ git branch task001&lt;br /&gt;$ git checkout task001&lt;br /&gt;Switched to branch "task001"&lt;br /&gt;$ vi foo.cs&lt;br /&gt;$ git mv foo.cs bar.cs&lt;br /&gt;$ git commit -a -m "change on task001 + rename"&lt;br /&gt;Created commit d3c6970: change on task001 + rename&lt;br /&gt; 2 files changed, 181 insertions(+), 181 deletions(-)&lt;br /&gt; create mode 100644 bar.cs&lt;br /&gt; delete mode 100644 foo.cs&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;First move and change, let's go to the second.&lt;pre&gt;&lt;br /&gt;$ git checkout master&lt;br /&gt;Switched to branch "master"&lt;br /&gt;$ vi foo.cs&lt;br /&gt;$ git mv foo.cs moo.cs&lt;br /&gt;$ git commit -a -m "change on master + rename"&lt;br /&gt;Created commit 4644cb7: change on master + rename&lt;br /&gt; 2 files changed, 182 insertions(+), 181 deletions(-)&lt;br /&gt; delete mode 100644 foo.cs&lt;br /&gt; create mode 100644 moo.cs&lt;br /&gt;&lt;br /&gt;$ git merge task001&lt;br /&gt;CONFLICT (rename/rename):&lt;br /&gt;Rename "foo.cs"-&gt;"moo.cs" in branch "HEAD" &lt;br /&gt;rename "foo.cs"-&gt;"bar.cs" in "task001"&lt;br /&gt;Automatic merge failed; &lt;br /&gt;fix conflicts and then commit the result.&lt;br /&gt;&lt;/pre&gt;Ok, git nows about but... how does it handle it?&lt;pre&gt;&lt;br /&gt;$ git status&lt;br /&gt;# On branch master&lt;br /&gt;# Changed but not updated:&lt;br /&gt;#&lt;br /&gt;#       unmerged:   bar.cs&lt;br /&gt;#       unmerged:   foo.cs&lt;br /&gt;#       unmerged:   moo.cs&lt;br /&gt;#       modified:   moo.cs&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;no changes added to commit&lt;br /&gt;&lt;br /&gt;$ ls&lt;br /&gt;bar.cs  moo.cs&lt;br /&gt;&lt;/pre&gt;Ooooops! The files are not merged and you’ve to solve the conflict yourself!!!&lt;h2&gt;Plastic it!&lt;/h2&gt;Is there a better way?&lt;p&gt;Yes: the dvcs should:&lt;li&gt;ask you: which rename do you prefer? (or any other option)&lt;li&gt;help you solve the rename&lt;li&gt;merge the files&lt;p&gt;And that’s what Plastic SCM does.&lt;p&gt;I’m happy to say that we’re launching Plastic SCM 4.0 today at &lt;a href="www.plasticscm.com/launch"&gt;www.plasticscm.com/launch&lt;/a&gt;... Join now! Superheroes already did &lt;a href="http://plasticscm.com/heroestalk"&gt;http://plasticscm.com/heroestalk&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8347073477209322299?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8347073477209322299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8347073477209322299' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8347073477209322299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8347073477209322299'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/11/git-merge-vs-world.html' title='Git merge vs the world'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-95104630437179537</id><published>2011-10-05T16:01:00.000+02:00</published><updated>2011-11-22T23:59:35.786+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed'/><title type='text'>Connecting Plastic SCM to github</title><content type='html'>We’ve taught Plastic SCM to speak the 21th century SCM “lingua franca”: fast-import format as defined by git &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-fast-import.html"&gt;here&lt;/a&gt;.What does it mean? First, it means you can import or export a repo from git (so, an easy way to try and move to Plastic SCM, while keeping a safe exit   for the non-believers!).Since almost anything out there is able to be exported to “fast-import” format… it also means you can easily move to Plastic SCM from CVS, SVN, Git, Mercurial, ClearCase, Perforce… anything!&lt;h2&gt;Import a repo from github&lt;/h2&gt;First things first: how do you import from github?&lt;p&gt;Suppose you want to import the following repo: git://github.com/twopointzero/NUnit.git&lt;p&gt;First you clone it locally:&lt;pre&gt;$ git clone https://github.com/postmodern/ronin.git&lt;/pre&gt;&lt;p&gt;Then you fast-export it:&lt;pre&gt;$ git fast-export --all -C --tag-of-filtered-object=drop --signed-tags=strip &gt;   repo.fe&lt;/pre&gt;&lt;p&gt;And now you go and import it to plasticscm:&lt;pre&gt;$ cm mkrep myrepo@localhost:8084 (optionally create a new repo!!!)&lt;br /&gt;$ cm fast-import myrepo@localhost:80804 repo.fe&lt;/pre&gt;&lt;p&gt;And you’re done! Open the branch explorer in Plastic and... :)&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ZvXz7iRoqBk/ToxvcRB50-I/AAAAAAAABMk/nD1eVq7VSbY/s1600/GitRepository.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="203" width="400" src="http://1.bp.blogspot.com/-ZvXz7iRoqBk/ToxvcRB50-I/AAAAAAAABMk/nD1eVq7VSbY/s400/GitRepository.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Export from Plastic SCM&lt;/h2&gt;We’ve also implemented the “fast-export” command so exporting is as easy as:&lt;pre&gt;$ cm fast-export myrepo@localhost:80804 repo.fast-exported&lt;/pre&gt;&lt;p&gt;And again… you’re done!&lt;h2&gt;Incrementally synching with git&lt;/h2&gt;What if you needed  to work “incrementally” with git from Plastic SCM?&lt;p&gt;Such as  the following:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-V8RWD0Uc7Zo/ToxhpBhPvmI/AAAAAAAABMU/bi5MGkMs0cs/s1600/syncbigpicture.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="107" width="400" src="http://2.bp.blogspot.com/-V8RWD0Uc7Zo/ToxhpBhPvmI/AAAAAAAABMU/bi5MGkMs0cs/s400/syncbigpicture.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;Basically, you’ll need to take advantage of the incremental import/export provided by the fast-import/fast-export toolset using “marks”.&lt;p&gt;The following  diagram depicts the process and shows the commands :&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/--tkTHaw6zs0/Toxhwg-SjnI/AAAAAAAABMc/3izxFR85_Ig/s1600/syncposter.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="281" width="400" src="http://3.bp.blogspot.com/--tkTHaw6zs0/Toxhwg-SjnI/AAAAAAAABMc/3izxFR85_Ig/s400/syncposter.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2&gt;Initial export from git to plastic&lt;/h2&gt;Create the package on git&lt;pre&gt;$ git fast-export --all -C --tag-of-filtered-object=drop --signed-tags=strip \&lt;br /&gt;         --export-marks=marks.git  &gt; repo.fe&lt;/pre&gt;&lt;p&gt;And get it imported in Plastic SCM&lt;pre&gt;$ cm fast-import repo@localhost:80804 repo.fe \&lt;br /&gt;        --export-marks=marks.cm&lt;/pre&gt;&lt;p&gt;Make some changes on plastic and send them back&lt;p&gt;Send them back to git: &lt;pre&gt;$ cm fast-export repo@localhost:80804 repo.fe.00 --import-marks=marks.cm --export-marks=marks.cm&lt;/pre&gt;&lt;p&gt;And import them in git:&lt;pre&gt;$ cat repo.fe.00 | git fast-import --export-marks=marks.git  --import-marks=marks.git&lt;/pre&gt;&lt;h2&gt;More changes now from the git side and back to plastic&lt;/h2&gt;&lt;pre&gt;$ git fast-export --all -C --tag-of-filtered-object=drop --signed-tags=strip \&lt;br /&gt;         --export-marks=marks.git --import-marks=marks.git &gt; repo.fe.01&lt;br /&gt;&lt;br /&gt;$ cm fast-import repo@localhost:80804 repo.fe.01 \&lt;br /&gt;     --import-marks=marks.cm --export-marks=marks.cm&lt;/pre&gt;&lt;p&gt;Please note we’re always using the files “marks.cm” to hold the import/export marks from Plastic SCM and the file “marks.git” to contain the ones from git.&lt;p&gt;The “packages” have been named repo.fe first then the second is repo.fe.00 and repo.fe.01eventually.&lt;p&gt;The process can go on and on n.&lt;h2&gt;Limitations&lt;/h2&gt;By using “fast-import/export” there’s one limitation you must keep in mind: concurrent changes are not allowed.&lt;p&gt;I mean: if you make changes on “master” and at the same time you make changes on the corresponding “/main”, the system won’t be able to deal with it!&lt;p&gt;The current solution is able to handle the scenario if you make changes at one side at the time.&lt;p&gt;Using feature branches, for instance, get rids of the potential collisions anyway.&lt;h2&gt;What else is there in 4.0?&lt;/h2&gt;We’re currently working on “cm sync” the command which will be the “equivalent” to “git svn dcommit” and hence we will be able to deal with sync concurrent conflicts in git, svn and tfs.&lt;h2&gt;How to get this??&lt;/h2&gt;What to try this? Go to&lt;a href="http://www.plasticscm.com/labs/40-beta-1.aspx"&gt; http://www.plasticscm.com/labs/40-beta-1.aspx&lt;/a&gt; and download the 4.0 beta! :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-95104630437179537?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/95104630437179537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=95104630437179537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/95104630437179537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/95104630437179537'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/10/connecting-plastic-scm-to-github.html' title='Connecting Plastic SCM to github'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ZvXz7iRoqBk/ToxvcRB50-I/AAAAAAAABMk/nD1eVq7VSbY/s72-c/GitRepository.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2311587717508321205</id><published>2011-10-02T01:56:00.000+02:00</published><updated>2011-10-02T01:57:33.837+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed'/><title type='text'>work in progress: bidirectional sync</title><content type='html'>I'm working on "bi-directional sync" which is one of the reasons behind the move to Plastic SCM 4.0.&lt;p&gt;What is it?&lt;p&gt;Simple: a way to sync a branch with another scm and handle conflicting changes.&lt;p&gt;I'm writing down a very initial session below:&lt;h2&gt;Sync with Subversion - initial import&lt;/h2&gt;Here we go, first thing is to make myself admin of the repo due to a bug I still didn't fix on the import code (ouch!)&lt;pre&gt;&lt;br /&gt;  $ cm setowner -user=pablo repserver:localhost:8084&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Now launch the first sync, note I specify the branch in Plastic, the type of scm (svn, it could also be "tfs" now) and the scm url&lt;pre&gt;&lt;br /&gt;  $ cm sync main@default@localhost:8084 svn svn://localhost&lt;br /&gt;    Latest cset on foreign SCM: 6&lt;br /&gt;    Changesets to pull&lt;br /&gt;    1 - 01/10/2011 7:18:16 -  - trunk created&lt;br /&gt;    2 - 01/10/2011 7:19:30 -  - initial code import&lt;br /&gt;    3 - 01/10/2011 7:28:25 -  - hud.txt modified&lt;br /&gt;    4 - 01/10/2011 7:30:28 -  - trunk created&lt;br /&gt;    5 - 01/10/2011 8:00:04 -  - hello.txt added&lt;br /&gt;    6 - 01/10/2011 8:03:00 -  - modified hello.txt&lt;br /&gt;&lt;/pre&gt;Now a second hack due to another bug I still didn't fix&lt;pre&gt;&lt;br /&gt;  $ cm au pablo&lt;br /&gt;    User pablo has been successfully activated&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Then create a new workspace, update to get the code imported from SVN and so on&lt;pre&gt;&lt;br /&gt;  $ cm mkwk plasticwk .&lt;br /&gt;    Workspace plasticwk has been correctly created&lt;br /&gt;&lt;br /&gt;  $ cm update .&lt;br /&gt;    Copied c:\Users\pablo\wkspaces\testwkspaces\svnsync\plasticwk\hello.txt&lt;br /&gt;&lt;br /&gt;   $ cm ls&lt;br /&gt;            01/10/2011 08:03 dir    br:/main#6         .&lt;br /&gt;            01/10/2011 08:05 txt    br:/main#1         hello.txt&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;Make a change in Plastic and push it to SVN&lt;/h2&gt;Create a new file, checkin and push to SVN.&lt;pre&gt;&lt;br /&gt;   $ echo bye &gt; bye.txt&lt;br /&gt;&lt;br /&gt;   $ cm add bye.txt&lt;br /&gt;    The selected items are about to be added. Please wait ...&lt;br /&gt;    Item bye.txt was correctly added&lt;br /&gt;&lt;br /&gt;   $ cm ci -c="added bye.txt"&lt;br /&gt;    The selected items are about to be checked in. Please wait ...&lt;br /&gt;    Assembling checkin data&lt;br /&gt;    Validating checkin data&lt;br /&gt;    Uploading file data&lt;br /&gt;    Uploaded 6 bytes of 6 bytes (100%)&lt;br /&gt;    Confirming checkin operation&lt;br /&gt;    Modified c:\Users\pablo\wkspaces\testwkspaces\svnsync\plasticwk&lt;br /&gt;    Added c:\Users\pablo\wkspaces\testwkspaces\svnsync\plasticwk\bye.txt&lt;br /&gt;    Created changeset cs:7@br:/main@rep:default@repserver:TRISKELION:8084&lt;br /&gt;&lt;/pre&gt;Now launch the sync, please note I don't have to specify the type of remote scm anymore, and I don't have to type the svn url either because it gets "saved" after the first sync.&lt;pre&gt;&lt;br /&gt;  $ cm sync main&lt;br /&gt;    Last equivalence found 6 -&gt; 6&lt;br /&gt;    No new revisions to pull from the foreign SCM&lt;br /&gt;    Changesets to push&lt;br /&gt;    7 - 01/10/2011 8:06:19 - pablo - added bye.txt&lt;br /&gt;    Check commit&lt;br /&gt;    Committed changeset 7&lt;br /&gt;&lt;/pre&gt;Launch the sync again and it tells there are no changes to push or pull anymore.&lt;pre&gt;&lt;br /&gt;   $ cm sync main&lt;br /&gt;    Last equivalence found 7 -&gt; 7&lt;br /&gt;    No new revisions to pull from the foreign SCM&lt;br /&gt;    Branches are in sync. There are no changesets to push or pull&lt;br /&gt;&lt;/pre&gt;&lt;h2&gt;Concurrent change scenario&lt;/h2&gt;Now, the guy at the plastic and the svn sides make changes concurrently, what will it happen? Let's go.&lt;p&gt;Add a new file in plastic:&lt;pre&gt;&lt;br /&gt;   $ echo newest &gt; newest.txt&lt;br /&gt;&lt;br /&gt;   $ cm add newest.txt&lt;br /&gt;    The selected items are about to be added. Please wait ...&lt;br /&gt;    Item newest.txt was correctly added&lt;br /&gt;&lt;br /&gt;   $ cm ci -c="added newest.txt on plastic"&lt;br /&gt;    The selected items are about to be checked in. Please wait ...&lt;br /&gt;    Assembling checkin data&lt;br /&gt;    Validating checkin data&lt;br /&gt;    Uploading file data&lt;br /&gt;    Uploaded 9 bytes of 9 bytes (100%)&lt;br /&gt;    Confirming checkin operation&lt;br /&gt;    Modified c:\Users\pablo\wkspaces\testwkspaces\svnsync\plasticwk&lt;br /&gt;    Added c:\Users\pablo\wkspaces\testwkspaces\svnsync\plasticwk\newest.txt&lt;br /&gt;    Created changeset cs:8@br:/main@rep:default@repserver:TRISKELION:8084&lt;br /&gt;&lt;/pre&gt;Now we modify a different file in SVN, ok?&lt;p&gt;I launch the sync again, read the details&lt;pre&gt;&lt;br /&gt;   $ cm sync main&lt;br /&gt;    Last equivalence found 7 -&gt; 7&lt;br /&gt;    Latest cset on foreign SCM: 8&lt;br /&gt;    Changesets to pull&lt;br /&gt;    8 - 01/10/2011 8:08:12 -  - =modified bye.txt on svn&lt;br /&gt;    Changesets to push&lt;br /&gt;    8 - 01/10/2011 8:08:24 - pablo - added newest.txt on plastic&lt;br /&gt;    There are changesets to push and pull.&lt;br /&gt;    Will pull the remote changes then you'll have to merge them and push the changes back.&lt;br /&gt;&lt;/pre&gt;What happened?&lt;pre&gt;&lt;br /&gt;   $ cm find changeset&lt;br /&gt;    10       0        /main                01/10/2011 08:04:35 all      default Root dir&lt;br /&gt;    20       1        /main                01/10/2011 07:18:16 pablo    default trunk created&lt;br /&gt;    4348     2        /main                01/10/2011 07:19:30 pablo    default initial code import&lt;br /&gt;    4367     3        /main                01/10/2011 07:28:25 pablo    default hud.txt modified&lt;br /&gt;    4379     4        /main                01/10/2011 07:30:28 pablo    default trunk created&lt;br /&gt;    4384     5        /main                01/10/2011 08:00:04 pablo    default hello.txt added&lt;br /&gt;    4388     6        /main                01/10/2011 08:03:00 pablo    default modified hello.txt&lt;br /&gt;    4397     7        /main                01/10/2011 08:06:19 pablo    default added bye.txt&lt;br /&gt;    4405     8        /main                01/10/2011 08:08:24 pablo    default added newest.txt on plastic&lt;br /&gt;    4410     9        /main                01/10/2011 08:08:12 pablo    default =modified bye.txt on svn&lt;br /&gt;&lt;br /&gt;    Total: 10&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;The "remote" changeset from SVN has been pulled but since there's a conflict, I'll have to merge before pushing back to svn.&lt;pre&gt;&lt;br /&gt;   $ cm merge cs:9&lt;br /&gt;    The file /bye.txt#br:/main#1 was modified on source and will replace the destination version&lt;br /&gt;&lt;br /&gt;   $ cm merge cs:9 --merge&lt;br /&gt;    The file /bye.txt#br:/main#1 was modified on source and will replace the destination version&lt;br /&gt;    Merging c:\Users\pablo\wkspaces\testwkspaces\svnsync\plasticwk\bye.txt&lt;br /&gt;    The revision c:\Users\pablo\wkspaces\testwkspaces\svnsync\plasticwk\bye.txt@9 has been loaded&lt;br /&gt;&lt;br /&gt;   $ cm ci -c="merged from cs9 coming from svn"&lt;br /&gt;    The selected items are about to be checked in. Please wait ...&lt;br /&gt;    Assembling checkin data&lt;br /&gt;    Validating checkin data&lt;br /&gt;    Uploading file data&lt;br /&gt;    Confirming checkin operation&lt;br /&gt;    Modified c:\Users\pablo\wkspaces\testwkspaces\svnsync\plasticwk&lt;br /&gt;    Copied c:\Users\pablo\wkspaces\testwkspaces\svnsync\plasticwk\bye.txt&lt;br /&gt;    Created changeset cs:10@br:/main@rep:default@repserver:TRISKELION:8084&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Now I run the sync again. Plastic is going to push the new cset (the merged cset) that will contain the changes between the merged cset (10) and the imported cset from svn (9) hence the changes introduced in 8.&lt;pre&gt;&lt;br /&gt;   $ cm sync main --preview&lt;br /&gt;    Last equivalence found 9 -&gt; 8&lt;br /&gt;    No new revisions to pull from the foreign SCM&lt;br /&gt;    Changesets to push&lt;br /&gt;    10 - 01/10/2011 8:09:58 - pablo - merged from cs9 coming from svn&lt;br /&gt;&lt;br /&gt;   $ cm sync main&lt;br /&gt;    Last equivalence found 9 -&gt; 8&lt;br /&gt;    No new revisions to pull from the foreign SCM&lt;br /&gt;    Changesets to push&lt;br /&gt;    10 - 01/10/2011 8:09:58 - pablo - merged from cs9 coming from svn&lt;br /&gt;    Check commit&lt;br /&gt;    Committed changeset 9&lt;br /&gt;&lt;/pre&gt;Now, how does it look like from the SVN side?&lt;pre&gt;&lt;br /&gt;   $ svn diff -r 9:8&lt;br /&gt;    Index: newest.txt&lt;br /&gt;    ===================================================================&lt;br /&gt;    --- newest.txt  (revision 9)&lt;br /&gt;    +++ newest.txt  (revision 8)&lt;br /&gt;&lt;/pre&gt;The file "newest.txt" was added on changeset 8 in Plastic and is now in SVN!Great, isn't it? I expect to get it merged asap into the next 4.0 beta release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2311587717508321205?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2311587717508321205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=2311587717508321205' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2311587717508321205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2311587717508321205'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/10/work-in-progress-bidirectional-sync.html' title='work in progress: bidirectional sync'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2217381601662637388</id><published>2011-09-27T17:12:00.001+02:00</published><updated>2011-09-27T17:12:52.387+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merging'/><title type='text'>Merge recursive strategy</title><content type='html'>You’ve must heard about “git merge recursive strategy” which is the default algorithm that git uses when merging two branches.How does it work and why is it good?&lt;h2&gt;Basics – elements on a merge&lt;/h2&gt;You’ve got two branches you want to merge. The basic “players” to consider are:&lt;li&gt;The “source”: the changeset you’re merging from. Changeset 16 in our sample below.&lt;li&gt;The “destination”: the changeset you’re merging to. 15 in our case.&lt;li&gt;The “ancestor”: the changeset (or commit) which is the nearest parent of the “source” and the “destination”, which is “10” in our case.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-VSEPi7duuAE/ToHmVbdC8cI/AAAAAAAABLk/jKzHcE2s1fQ/s1600/basicmerge.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="193" width="400" src="http://3.bp.blogspot.com/-VSEPi7duuAE/ToHmVbdC8cI/AAAAAAAABLk/jKzHcE2s1fQ/s400/basicmerge.png" /&gt;&lt;/a&gt;&lt;/div&gt;So, we will merge 16 and 15 using 10 as ancestor. We DO need an ancestor to be used in “three-way” merges (more about it &lt;a href="http://codicesoftware.blogspot.com/2010/11/live-to-merge-merge-to-live.html"&gt;here&lt;/a&gt;).&lt;h2&gt;When is “merge recursive” needed?&lt;/h2&gt;But, sometimes the scenario is not that simple. What if we find “two common ancestors”? The picture below shows how in this example we have to possible “common ancestors”.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-gq8m7Pbfgb0/ToHmkWqbw-I/AAAAAAAABLs/s40XJ6R6hYk/s1600/twocommonancestors.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="228" width="400" src="http://4.bp.blogspot.com/-gq8m7Pbfgb0/ToHmkWqbw-I/AAAAAAAABLs/s40XJ6R6hYk/s400/twocommonancestors.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Please note&lt;/b&gt;: the example is a little bit forced since there’s not a good reason (initially) for the developer merging from changeset 11 into 16 instead of merging from changeset 15 (the latest from the branch “main” at the point of the merge). But let’s assume he has to do it for a reason (like cset:11 was stable and 13 and 15 weren’t at the time, for instance). The point is: between 15 and 16 there’s not a single unique ancestors but two ancestors at the same “distance”: 12 and 11.&lt;p&gt;While it won’t happen on a daily basis, it is really likely to happen with long lived branches or complex branch topologies (the case depicted above is the shortest one driving to the “multiple ancestor” problem, but it can happen too with several changesets and branches in between the “crossed” merges).&lt;p&gt;One solution is to “select” one of the ancestors as the valid one for the merge (which is the option Mercurial takes) but as we will see below, it has many drawbacks.&lt;h2&gt;How “merge recursive” works?&lt;/h2&gt;When more than one valid ancestor is found, the “recursive merge” strategy will create a new unique “virtual ancestor” merging the ones initially found. The following image depicts the algorithm:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-6gkRQ4jY5Hk/ToHm1aehixI/AAAAAAAABL0/wM1pJ-aMrIw/s1600/recursivemergeancenstorcalculation.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="252" width="400" src="http://2.bp.blogspot.com/-6gkRQ4jY5Hk/ToHm1aehixI/AAAAAAAABL0/wM1pJ-aMrIw/s400/recursivemergeancenstorcalculation.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;A new “ancestor 2” will be used as “ancestor” to merge the “src” and “dst”.&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-6n-K3nPFot4/ToHm7LDjTuI/AAAAAAAABL8/Ansbnz76zj0/s1600/recursivemergeusingvirtualasancestor.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="260" width="400" src="http://3.bp.blogspot.com/-6n-K3nPFot4/ToHm7LDjTuI/AAAAAAAABL8/Ansbnz76zj0/s400/recursivemergeusingvirtualasancestor.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The “merge recursive strategy” is able to find a better solution than just “selecting one of the two” as I’ll describe below.&lt;h2&gt;Why merge recursive is better – a step by step example&lt;/h2&gt;Let me use the following “notation” in thenext example: a file “foo.c” with three lines like these:&lt;pre&gt;&lt;br /&gt;b&lt;br /&gt;c&lt;br /&gt;d&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;It will be described as: /foo.c = bcd.&lt;p&gt;Of course, for the sake of simplicity I’ll be using “stupid lines” like “abc” but assume the example is valid for real code too.&lt;p&gt;Let’s take a look at the following case in the diagram below:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-meOjxAFb7Js/ToHnOCGa3-I/AAAAAAAABME/ZCLHNZ60lwQ/s1600/recursivemergesample00.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="188" width="400" src="http://2.bp.blogspot.com/-meOjxAFb7Js/ToHnOCGa3-I/AAAAAAAABME/ZCLHNZ60lwQ/s400/recursivemergesample00.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;I’ll try to describe it changeset by changeset:&lt;li&gt;0 -&gt; we had a file foo.c with content foo=bcd (three lines, first is “b”, second is “c” and third is “d”)&lt;li&gt;1 -&gt; we edit foo.c on a branch and add a new line so it ends up being foo=bcde&lt;li&gt;2 -&gt; we modify the second line of the file on “main”. Now the file is foo=bCd&lt;li&gt;3 -&gt; we create a new branch from cset “2” and add a new line at the beginning so it is now foo.c=abCd&lt;li&gt;4 -&gt; going back to “task001” we modify the line we just added: foo.c=bcdE&lt;li&gt;5 -&gt; we “undo” the change we just did on “main”: foo.c=bcd&lt;li&gt;6 -&gt; we MERGE “4” and “3” and create “6” as foo.c=abCdE (we combine the changes we made on “task002” (adding a new line at the beginning) with the ones in “task001” (adding “E” at the end) and also the change coming from “2” on /main.&lt;li&gt;7 -&gt; we now MERGED “4” and “5” introducing the change from “4” (last line added) into “main”: foo.c=bcdE&lt;p&gt;If we now merge “task002” on “main” (cset “7” and cset “6”) what should we get?&lt;p&gt;We should get the “addition” on “task002” (a new line “a” at the beginning) on top of “7”, isn’t it?&lt;p&gt;The expected result is: foo.c=abcdE.&lt;p&gt;We shouldn’t get the line “C” in uppercase as it is on “task002” because we fixed it afterwards on “main”.&lt;p&gt;As you can see on the diagram, I highlighted the changesets “4” and “2” because they’re the two possible common ancestors from “6” and “7”.&lt;p&gt;Which one should be choose?&lt;p&gt;Mercurial will choose “4” because its algorithm chooses the “deepest” ancestor in case that more than one is found.&lt;p&gt;What happens if we choose “4”?&lt;p&gt;We will merge 4=bcdE, 6=abCdE and 7=abcdE and the automatic result (by any 3-way merge tool will be):&lt;li&gt;First line -&gt; a (it’s there on 6 and 7)&lt;li&gt;Second line -&gt; b (it’s there on the three contributors)&lt;li&gt;Third line -&gt; C (changed on “6” but unchanged on “4” and “7”)&lt;li&gt;Fourth line -&gt; d (unchanged)&lt;li&gt;Fifth line -&gt; E (unchanged)&lt;p&gt;So, we automatically get foo=abCdE which is &lt;b&gt;WRONG!!&lt;/b&gt;&lt;p&gt;We took “C” instead of “c” due to the wrong ancestor selection.&lt;h2&gt;How recursive merge fixes the mess?&lt;/h2&gt;As I described above, the first thing “recursive merge” is going to do is to calculate a new “virtual ancestor” merging “4” and “2” as the following picture shows:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-qPK9Lf3Nqu0/ToHnlig-EVI/AAAAAAAABMM/Jl0ZmtZdKDQ/s1600/recursivemergesample01.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="189" width="400" src="http://4.bp.blogspot.com/-qPK9Lf3Nqu0/ToHnlig-EVI/AAAAAAAABMM/Jl0ZmtZdKDQ/s400/recursivemergesample01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;The result “cset X” is foo=bCdE.&lt;p&gt;Later, “cset X” is used as the “ancestor” of “6” and “7” and then we get:&lt;li&gt;Ancestor: foo=bCdeE&lt;li&gt;Source: foo=abCdE&lt;li&gt;Destination: foo=bcdE&lt;li&gt;Result: foo=abcdE -&gt; which is what we were looking for!&lt;p&gt;The calculated result takes into account the “fix” done in changeset “5” and hence the result is correct!&lt;h2&gt;Why it is so good?&lt;/h2&gt;If you have to deal with branching and merging and you don’t have a good merge algorithm, you can end up with broken files without notice!&lt;p&gt;In short: Git will do it correctly, Hg will break the result, and SVN and others will simply mess up the whole thing.&lt;p&gt;In Plastic SCM 4.0 we’ve also implemented “merge recursive” algorithm, so we are able to produce the same result (in fact, our algorithm is even more powerful, handling correctly cases that even Git is unable to deal with successfully).&lt;h2&gt;More cases&lt;/h2&gt;I focused on “file conflicts” today but it is easy to come up with examples affecting directory structures too. I’ll cover it in a follow up blog post.&lt;h2&gt;Wrapping up&lt;/h2&gt;Branching and merging are the two weapons you must have in your developer’s toolset… but make sure you have the best possible ones, the ones that really do the job.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2217381601662637388?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2217381601662637388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=2217381601662637388' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2217381601662637388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2217381601662637388'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/09/merge-recursive-strategy.html' title='Merge recursive strategy'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-VSEPi7duuAE/ToHmVbdC8cI/AAAAAAAABLk/jKzHcE2s1fQ/s72-c/basicmerge.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8742900892486537749</id><published>2011-09-16T16:45:00.012+02:00</published><updated>2011-09-16T17:26:12.992+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='plastic'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='backend'/><title type='text'>Plastic SCM release 3.0.30</title><content type='html'>&lt;p&gt;It has been a while announcing a blogpost for new 3.0.xx release, however, we have been releasing a bunch of them with bug fixes and usability improvements, and this one will highlight the most important bullets in the current release Plastic SCM 3.0.30.&lt;br /&gt;&lt;/p&gt;Full release notes: &lt;a href="http://www.plasticscm.com/download/releasenotes.aspx"&gt;http://www.plasticscm.com/download/releasenotes.aspx&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Download page: &lt;a href="http://www.plasticscm.com/download/login.aspx"&gt;http://www.plasticscm.com/download/login.aspx&lt;/a&gt;&lt;/p&gt;Third party integration matrix list: &lt;a href="http://www.plasticscm.com/infocenter/third-party-compatibility.aspx"&gt;http://www.plasticscm.com/infocenter/third-party-compatibility.aspx&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;New features:&lt;/h3&gt;&lt;h4&gt;Atlassian Bamboo integration:&lt;/h4&gt;&lt;p&gt;Plastic SCM now integrates and includes a plugin to integrate with Atlassian Bamboo Continues Integration (&lt;a href="http://www.atlassian.com/software/bamboo/"&gt;http://www.atlassian.com/software/bamboo/&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;Zutubi Pulse:&lt;/h4&gt;&lt;p&gt; Plastic SCM plugin is updated to support Zutubi Pulse 2.3&lt;/p&gt;&lt;h4&gt;Eclipse plugin:&lt;/h4&gt;&lt;p&gt;A checkbox has been added to include changed items on the sync view and the commit dialog.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-3czK9YmwCWw/TnNhpURhLtI/AAAAAAAAAHg/sLUJVHtkqYw/s1600/Eclipse_Changed_CB.PNG"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 249px;" src="http://4.bp.blogspot.com/-3czK9YmwCWw/TnNhpURhLtI/AAAAAAAAAHg/sLUJVHtkqYw/s400/Eclipse_Changed_CB.PNG" alt="" id="BLOGGER_PHOTO_ID_5652969319724822226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Mergetool standalone:&lt;/h4&gt;&lt;p&gt;A request from our Plastic SCM community to add Drag&amp;amp;Drop into our mergetool.exe when executed as a standalone diff / merge tool.&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-UOYk4OjJgT8/TnNhppY-9tI/AAAAAAAAAHo/YWlAq-h3gSI/s1600/MergeTool_DragDrop.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 255px;" src="http://2.bp.blogspot.com/-UOYk4OjJgT8/TnNhppY-9tI/AAAAAAAAAHo/YWlAq-h3gSI/s400/MergeTool_DragDrop.png" alt="" id="BLOGGER_PHOTO_ID_5652969325393278674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Filtering dialog Cloacked / ignored is sizable:&lt;/h4&gt;&lt;p&gt;Now the dialog is sizable, so users can see long rules.&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-CFxf-bHvw3k/TnNhptzRlAI/AAAAAAAAAHw/NrzUhPPJi5o/s1600/Ignore_Cloacked_fileter_dlg_sizable.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 174px;" src="http://1.bp.blogspot.com/-CFxf-bHvw3k/TnNhptzRlAI/AAAAAAAAAHw/NrzUhPPJi5o/s400/Ignore_Cloacked_fileter_dlg_sizable.png" alt="" id="BLOGGER_PHOTO_ID_5652969326577292290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;Support for big files &amp;gt; 2 Gb&lt;/h4&gt;&lt;p&gt;When a user checked in a file bigger than 2GB, the update failed. It did not download the entire file. There was an overflow with the size of the file.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Improvements and bug fixes (only most important mentioned below):&lt;/h3&gt;&lt;h4&gt;Visual Studio integration:&lt;/h4&gt;&lt;p&gt;The Plastic SCM plugin for visual studio has been reviewed a couple of time since we discovered that the support for solution folders added in release 3.0.19 needed to be revisited.&lt;/p&gt;&lt;p&gt;Duplicate project entries in Pending changes view.&lt;/p&gt;&lt;p&gt;Duplicate solution files .sln in Pending changes view&lt;/p&gt;&lt;p&gt;Fixed an invalid cast exception when trying to select items in the Solution Explorer of Visual Studio 2010. This bug happened occasionally. &lt;/p&gt;&lt;p&gt;When having a Windows Presentation Foundation project some checked-out files were not shown in the Pending changes view. The offline checkouts were not restored when Visual Studio was restarted.&lt;/p&gt;&lt;h4&gt;SQL server database backend:&lt;/h4&gt;&lt;p&gt;If during a label application a SQL command timeout fires, the rollback operation was not correctly performed, It could cause inconsistency in the databases between the tables marker realizations and object table. &lt;/p&gt;&lt;h4&gt;Installer for MAC:&lt;/h4&gt;&lt;p&gt;There was a problem when trying to start up the server in some configurations, related to the setup of the /Library/Startup directory.&lt;/p&gt;&lt;h4&gt;Installer for Plastic SCM Proxy:&lt;/h4&gt;&lt;p&gt;Proxy installer: problem solved related to a library not included in the installer.&lt;/p&gt;&lt;h4&gt;Plastic SCM Client / server version check:&lt;/h4&gt;&lt;p&gt;Compatibility check between client and server was not correctly handled&lt;br /&gt;when the authentication mode was LDAP. It has been fixed and improved.&lt;/p&gt;&lt;h4&gt;Text / binary filetypes recognition:&lt;/h4&gt;&lt;p&gt;When a text based file "an example: makefile" was read-only, the detection was binary, this has been fixed.&lt;/p&gt;&lt;h4&gt;cm help:&lt;/h4&gt;&lt;p&gt;An error in the cm help label fixed: to apply a label recursively from the current directory the command is: "&lt;strong&gt;cm lb lb:LB001 . -R&lt;/strong&gt;".&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And many other bug fixes and improvements, review release notes for full details.&lt;/p&gt;&lt;p&gt;We hope you enjoy this release.&lt;/p&gt;&lt;p&gt;Codice Software team&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8742900892486537749?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8742900892486537749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8742900892486537749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8742900892486537749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8742900892486537749'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/09/plastic-scm-release-3030.html' title='Plastic SCM release 3.0.30'/><author><name>Miller Auker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-3czK9YmwCWw/TnNhpURhLtI/AAAAAAAAAHg/sLUJVHtkqYw/s72-c/Eclipse_Changed_CB.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-7319717976652793123</id><published>2011-09-16T10:49:00.005+02:00</published><updated>2011-09-16T11:02:07.226+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='plastic'/><title type='text'>Plastic SCM new forum - online!</title><content type='html'>We are pleased to announce that we migrated our old forum which was based on "YAF - Yet Another Forum" to a much better one (IP.BOARD) from  &lt;a href="www.invisionpower.com"&gt;www.invisionpower.com&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt;The old link should be the same, since we redirect to the new forum, but just in case your link is still redirecting you to the old - non existent forum, try inserting &lt;a href="http://www.plasticscm.net"&gt;http://www.plasticscm.net&lt;/a&gt;  and update your bookmark.&lt;br /&gt;&lt;br /&gt;Users + password have been migrated, but with the new system, generating "requesting" a new password is a 1 minute job, fully automated.&lt;br /&gt;&lt;br /&gt;We hope you enjoy the new forum as we do, and feel free to share your ideas there with the Plastic SCM growing community.&lt;br /&gt;&lt;br /&gt;regards,&lt;br /&gt;miller&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-3fPos4qRj2M/TnMN5Tb6ODI/AAAAAAAAAHY/k8p0OH0UR3M/s1600/NewForum_IPBOARD.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 271px;" src="http://1.bp.blogspot.com/-3fPos4qRj2M/TnMN5Tb6ODI/AAAAAAAAAHY/k8p0OH0UR3M/s400/NewForum_IPBOARD.png" alt="" id="BLOGGER_PHOTO_ID_5652877235401144370" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-7319717976652793123?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7319717976652793123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7319717976652793123'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/09/plastic-scm-new-forum-online.html' title='Plastic SCM new forum - online!'/><author><name>Miller Auker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-3fPos4qRj2M/TnMN5Tb6ODI/AAAAAAAAAHY/k8p0OH0UR3M/s72-c/NewForum_IPBOARD.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6980141594730905115</id><published>2011-08-15T13:07:00.004+02:00</published><updated>2011-08-15T13:12:17.311+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed'/><title type='text'>This is how I use the synch view</title><content type='html'>Hi there,&lt;br /&gt;How is it going with the 4.0 beta?&lt;br /&gt;I’m going to start posting about what’s new in 4.0 and how you can use it to make things easier.&lt;br /&gt;Today I’m going to talk about the “sync view”.&lt;br /&gt;&lt;h2&gt;What’s the sync view all about?&lt;/h2&gt;&lt;br /&gt;The sync view is a very simple yet powerful functionality in 4.0 that enables you to connect two different repositories (which can “live” in different servers, separated by oceans, running on different OS, using different database backends… well, the usual) and check what’s need to be updated on each of them.&lt;br /&gt;&lt;h2&gt;How does the sync view work?&lt;/h2&gt;&lt;br /&gt;Very simple: you define a “source repository” which is the one you “connect to” to drive the process. For instance, if you’re working in a distributed way, your “source server” will be your laptop and your “source repo” the repository you want to work with.&lt;br /&gt;Then you define a “destination” repo as the place to synchronize with. Following with my disconnected scenario, your laptop will host your source repo and your company’s plastic server will host the “destination repo”.&lt;br /&gt;Is it clear? Once you’ve selected the two, the sync view will connect to them and figure out what changes need to be pulled (from dst to src) or pushed (from src to dst).&lt;br /&gt;Note: you know, if you just define the src repo and dst repo differently, the operation will have a different meaning.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Many scenarios supported&lt;/h2&gt;&lt;br /&gt;Well, as you read above the sync view is so simple and flexible that it is possible to support many different scenarios. We like to define them as follows:&lt;br /&gt;&lt;li&gt;Distributed developer: he will have his laptop or desktop as “source” and will typically have one “destination” server, the “master copy” (your office central server if you prefer). Optionally he could have more “destinations” to collaborate with other peers instead of restricting his pushing and pulling to a single server.&lt;br /&gt;&lt;li&gt;Multi-site environment: a company with two or more facilities, each of them running a plastic server. One of them will be the source and other the destination and sync will happen among them.&lt;br /&gt;&lt;li&gt;Distributed integrator: a network of distributed plastic servers (each of them running on each developer’s computer) and the sync view defined on the integrator’s machine as a way to be able to “pull” from all the contributors on a controlled way.&lt;br /&gt;&lt;br /&gt;As you can see, the “sync view” is a rather simple tool although it can enable really powerful business scenarios.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Having a mirror server&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;This is my case: I have a “master server” at the office, currently running on a W2k8 machine named “Diana” and with a SQL Server backend.&lt;br /&gt;I have other servers on my network and that’s why I have 3 different “sync configurations” as you can see below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-aqk-UNnR0_8/Tkj-jskjrqI/AAAAAAAABHM/B-gj9kJiIjE/s1600/servers00.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 385px; height: 201px;" src="http://4.bp.blogspot.com/-aqk-UNnR0_8/Tkj-jskjrqI/AAAAAAAABHM/B-gj9kJiIjE/s400/servers00.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5641038422494916258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have one to synch my laptop with “Diana”, a second one to synch “Diana” with an Oracle powered Plastic server, and the third one, the one I’ll be focusing on today, which syncs “Diana” with “Eunomia”, a Firebird embedded Plastic SCM server running on a tiny VM.&lt;br /&gt;Once I click on “Diana-Eunomia” sync config I can see the following details:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-bY93VoP3QA4/Tkj-srfrUaI/AAAAAAAABHU/X3ZtQjrbWn8/s1600/csets00.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 371px; height: 155px;" src="http://4.bp.blogspot.com/-bY93VoP3QA4/Tkj-srfrUaI/AAAAAAAABHU/X3ZtQjrbWn8/s400/csets00.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5641038576824832418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It tells me there are “outgoing” csets from “Diana” to “Eunomia”, which basically means “Eunomia” will need some sync.&lt;br /&gt;If I click to get the detailsl I see:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-NHcbh0AoEyk/Tkj-0LvHteI/AAAAAAAABHc/XMqXPCUtNYA/s1600/csets01.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 183px;" src="http://2.bp.blogspot.com/-NHcbh0AoEyk/Tkj-0LvHteI/AAAAAAAABHc/XMqXPCUtNYA/s400/csets01.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5641038705738626530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Which details the branches that will be synched during the process. Actually these branches are going to be “pushed” from “Diana” to “Eunomia”.&lt;br /&gt;Finally I can click on a given branch and view which changesets need to be pushed:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-ouQw_bqEUzw/Tkj-6OTmCKI/AAAAAAAABHk/gAjrAzPQ-e4/s1600/csets02.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 114px;" src="http://1.bp.blogspot.com/-ouQw_bqEUzw/Tkj-6OTmCKI/AAAAAAAABHk/gAjrAzPQ-e4/s400/csets02.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5641038809507694754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The good thing (excellent IMO) is that now you can click on a cset and check the differences… even when it is remote (you’re not directly connected to that server at all!). It enables “replication preview” which we all missed with 3.0… didn’t we?&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Wrapping up&lt;/h2&gt;&lt;br /&gt;There’s a real bunch of things on 4.0 but the sync view is really one of the important features, extremely simple, but really helpful and powerful. Enjoy.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6980141594730905115?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6980141594730905115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6980141594730905115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6980141594730905115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6980141594730905115'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/08/this-is-how-i-use-synch-view.html' title='This is how I use the synch view'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-aqk-UNnR0_8/Tkj-jskjrqI/AAAAAAAABHM/B-gj9kJiIjE/s72-c/servers00.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-3154133588910005430</id><published>2011-08-09T16:52:00.007+02:00</published><updated>2011-08-09T17:58:15.894+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Plastic SCM 4.0 Beta 1 is now out!!!</title><content type='html'>Hi Plastikers! The time has come and we’re very proud to announce that our first beta of Plastic SCM 4.0 is out!&lt;br /&gt;&lt;br /&gt;If you were already a subscriber you should be already enjoying the new version since we sent you a notification email a couple of days ago.&lt;br /&gt;&lt;br /&gt;And the rest of you... well,  please  check what’s new &lt;a href="http://www.plasticscm.com/labs/40-beta-1.aspx"&gt;here&lt;/a&gt;: we made for you by listening many developers like you and to read the evaluation guide we just developed to help you going through our first beta: &lt;a href="http://www.plasticscm.com/releases/4.0-beta/PlasticSCM-4.0-evaluationguide.pdf"&gt;http://www.plasticscm.com/releases/4.0-beta/PlasticSCM-4.0-evaluationguide.pdf&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold; "&gt;A lot more for you...&lt;/span&gt;&lt;br /&gt;Clearly the big question mark is: what’s in there for me?: a lot, is the answer, but  I’ll try to be specific and summarize:&lt;br /&gt;&lt;h2&gt;For current Plastic SCM 3.0 users&lt;/h2&gt;&lt;div&gt;&lt;p class="MsoNormal"&gt;We’ve been listening to your requests, your suggestions and wishes … and that’s a big part of what 4.0 is all about: &lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;a product that fit your needs!&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;table class="MsoTableLightShading" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-bottom-alt:solid black 1.0pt;  mso-border-bottom-themecolor:text1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-border-insideh:1.0pt solid black;mso-border-insideh-themecolor:text1"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes"&gt;   &lt;td width="253" style="width:189.7pt;border-top:solid black 1.0pt;mso-border-top-themecolor:   text1;border-left:none;border-bottom:solid black 1.0pt;mso-border-bottom-themecolor:   text1;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:5"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;Everything Much Faster&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border-top:solid black 1.0pt;mso-border-top-themecolor:   text1;border-left:none;border-bottom:solid black 1.0pt;mso-border-bottom-themecolor:   text1;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;4.0 is much faster,   switch to a new branch, label, merging… blazing fast as you wanted&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:   text1;mso-themeshade:191;mso-bidi-font-weight:bold"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:0"&gt;   &lt;td width="253" style="width:189.7pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:68"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;Improved Branch Explorer&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;All the things you wanted to have   including filtering, better improved searching, rearranging the diagram and   some extras like subdiagrams&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:1"&gt;   &lt;td width="253" style="width:189.7pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:4"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;Better Replication Support&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:text1;   mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Much better replication support, including the sync view&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:text1;   mso-themeshade:191"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:text1;   mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:2"&gt;   &lt;td width="253" style="width:189.7pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:68"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;Simplified Merge Operations&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Core changes to simplify merge   operations, branch creation and so on. Now changesets are kings and merge   tracking and history is based on them&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:3;mso-yfti-lastrow:yes"&gt;   &lt;td width="253" style="width:189.7pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:4"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;Transparent Change Tracking&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:text1;   mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Just change code and Plastic will take care of   everything, even tracking what you’ve moved&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:text1;   mso-themeshade:191"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:text1;   mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;For developers who never used  Plastic before&lt;/h2&gt;You’re interested in the new paradigm: Distributed Version Control (DVCS), aren’t you? But probably you don’t feel like dealing with Git, Mercurial and other tools specifically designed for open source projects. You you need a system designed for  enterprises or public institutions with the similar requirements . If that’s true, Plastic is for you.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;table class="MsoTableLightShading" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-bottom-alt:solid black 1.0pt;  mso-border-bottom-themecolor:text1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-border-insideh:1.0pt solid black;mso-border-insideh-themecolor:text1"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes"&gt;   &lt;td width="253" style="width:189.7pt;border-top:solid black 1.0pt;mso-border-top-themecolor:   text1;border-left:none;border-bottom:solid black 1.0pt;mso-border-bottom-themecolor:   text1;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:5"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;Reduced learning curve&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border-top:solid black 1.0pt;mso-border-top-themecolor:   text1;border-left:none;border-bottom:solid black 1.0pt;mso-border-bottom-themecolor:   text1;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Reduce the learning curve because everything is   visual and easy to use, which doesn’t mean it is not as powerful as it needs to be&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;b&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:0"&gt;   &lt;td width="253" style="width:189.7pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:68"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;One-click replication&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Push, pull branches (full   replication) with just a few clicks. Jump into the distributed age but with   the simplicity and effectiveness you’re used to&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes"&gt;   &lt;td width="253" style="width:189.7pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:4"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;Do use feature branching!&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:text1;   mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Step into the branching era creating feature branches in   seconds, switching to them… merging back. You know, boosting your performance   using the right tools, no magic, no “marketing buzz”, just the tools you need   to help you work on your daily programming tasks&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:text1;   mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height: normal"&gt;&lt;span style="font-size:12.0pt;font-family:&amp;quot;Georgia&amp;quot;,&amp;quot;serif&amp;quot;;mso-fareast-font-family: &amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;color:black"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2&gt;For managers&lt;/h2&gt;As a manager there are a few concerns you can’t remove from your mind: improving time to market, reducing development costs and increasing quality.&lt;br /&gt;&lt;br /&gt;Well, Plastic SCM is not a silver bullet, so only your hard work and coordination with your team will make things happen, but you know having the right tools help. If all you have is a hammer, everything looks like a nail, doesn't it? Fortunately Plastic is not only a hammer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h3&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;How can Plastic help you?&lt;/span&gt;&lt;/h3&gt;&lt;table class="MsoTableLightShading" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-bottom-alt:solid black 1.0pt;  mso-border-bottom-themecolor:text1;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-border-insideh:1.0pt solid black;mso-border-insideh-themecolor:text1"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:-1;mso-yfti-firstrow:yes"&gt;   &lt;td width="253" style="width:189.7pt;border-top:solid black 1.0pt;mso-border-top-themecolor:   text1;border-left:none;border-bottom:solid black 1.0pt;mso-border-bottom-themecolor:   text1;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:5"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;Improve visibility&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border-top:solid black 1.0pt;mso-border-top-themecolor:   text1;border-left:none;border-bottom:solid black 1.0pt;mso-border-bottom-themecolor:   text1;border-right:none;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:   text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Visibility is one of my main concerns and one of   the key points to improve since I first found it on Steve McConnel’s writings   a decade or more ago. &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Make sure you work in short iterations, you deliver   fast and you work on a feature oriented way, getting deliverable pieces of   integrations done. The usual “agile” way of thinking, isn’t it? &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Ok, Plastic   will help you implementing “branch per task”, the right tool to get “full   parallel development” up and running. There are other patterns too, of   course, and fortunately Plastic, all about branches, is the only one able to   support them all&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:   text1;mso-themeshade:191"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:1"&gt;&lt;span style="font-size:10.0pt;color:black;mso-themecolor:   text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:0;mso-yfti-lastrow:yes"&gt;   &lt;td width="253" style="width:189.7pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:68"&gt;&lt;b&gt;&lt;span style="font-size:12.0pt;font-family:&amp;quot;Georgia&amp;quot;,&amp;quot;serif&amp;quot;;   mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;   color:black"&gt;Enable collaboration between distant teams or “roaming   developers”&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="310" style="width:232.5pt;border:none;border-bottom:solid black 1.0pt;   mso-border-bottom-themecolor:text1;mso-border-top-alt:solid black 1.0pt;   mso-border-top-themecolor:text1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Nowadays having team members sitting   on different locations (whether it is at a different office or at home) is   pretty common. &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;Plastic SCM is distributed, fully distributed, and it means it   is the right tool for the job. &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; "&gt;There are other tools out there, but Plastic   is the only one designed for commercial use, for professional teams working   on commercial projects&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-bottom:0cm;margin-bottom:.0001pt;line-height:   normal;mso-yfti-cnfc:64"&gt;&lt;span style="font-size:10.0pt;color:black;   mso-themecolor:text1;mso-themeshade:191"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Learn more about what we have been working on&lt;/h2&gt;During the last months we’ve been writing a bunch of material to explain what we were doing with 4.0, I went through it and created a list below to help you go through the entire collection:&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Several &lt;a href="http://www.facebook.com/PlasticSCM"&gt;Facebook entries&lt;/a&gt;, sharing news about the development of 4.0 (screenshots and so on)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The making of &lt;a href="http://www.flickr.com/photos/plasticscm/sets/72157626193903187/"&gt;Plastic SCM 4.0 at Flickr&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Several entries &lt;a href="http://twitter.com/#!/plasticscm"&gt;at our twitter&lt;/a&gt;, including specific screenshots at TweetPic&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Blog post entry &lt;a href="http://codicesoftware.blogspot.com/2011/06/distributed-synchronization-view.html"&gt;"Distributed synchronization view... unveiled!"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Blog post entry &lt;a href="http://codicesoftware.blogspot.com/2011/05/pulling-remote-changes-with-dbrex.html"&gt;"Pulling remote changes with DBrEx"&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Blog post entry &lt;a href="http://codicesoftware.blogspot.com/2011/04/unscientific-40-benchmark-test.html"&gt;"unscientific 4.0 benchmark test"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Blog post entry &lt;a href="http://codicesoftware.blogspot.com/2011/03/dag-rendering-take-two.html"&gt;"DAG rendering, take two"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Blog post entry &lt;a href="http://codicesoftware.blogspot.com/2011/03/dag-rendering.html"&gt;"DAG rendering"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=hoxX_ffMV68"&gt;"Synch view explained"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=9LkkDBvt5Eg"&gt;"Synchronization view explained in detail"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=Vfg1-B19PWg"&gt;"Xdiff again"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=cz5ANeCKCP0"&gt;"Plastic SCM 4.0 feature branches"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=A_vaXEHS8GE"&gt;"Plastic SCM 4.0 beta 1 installation"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=zLPOfz2SnD4"&gt;"4.0 find renamed files"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=ai7uiAKk-DE"&gt;"4.0 small changes"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=RSJujydVt_o"&gt;"Plastic SCM 4.0 Distributed Branch Explorer preview"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=UgoJlykj23I"&gt;"Transparent SCM preview"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Video &lt;a href="http://www.youtube.com/watch?v=pYaoKjO9-ow"&gt;"Distributed Branch Explorer preview"&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-3154133588910005430?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/3154133588910005430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=3154133588910005430' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3154133588910005430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3154133588910005430'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/08/plastic-scm-40-beta-1-is-now-out.html' title='Plastic SCM 4.0 Beta 1 is now out!!!'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6829102715219162305</id><published>2011-06-24T01:11:00.002+02:00</published><updated>2011-06-24T01:18:44.945+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Distributed synchronization view... unveiled!</title><content type='html'>Here are the two screencasts I've just recorded showing one of the last features we've been working on during the last days: the distributed synch view.&lt;br /&gt;&lt;br /&gt;You all know that Plastic SCM is a DVCS (Distributed Version Control System) and that we're trying to release the most complete possible DVCS toolset with 4.0. Well, the "synch view" is another step ahead: yes, you can ask the new Distributed Branch Explorer (DBrEx) to render remote branches and then pull from there, but we thought it would be really useful to have a "tree view" displaying the changesets (and branches) you need to push or pull between two different remote repositories... and that's how we started with the sync view.&lt;br /&gt;&lt;br /&gt;It simplifies things so you see the branches you need to pull or push, the changesets on each of these branches, and you can even "diff" the csets to see what has been modified.&lt;br /&gt;&lt;br /&gt;'Cause a picture is worth 1000 words... probably a video is worth 2000 :P, so here it goes, the long detailed explanation:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/9LkkDBvt5Eg?hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/9LkkDBvt5Eg?hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;And a shorter one:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/hoxX_ffMV68?hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/hoxX_ffMV68?hl=en&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Remember &lt;a href="http://www.plasticscm.com/labs/40-beta-1.aspx"&gt;you can already sign up for the beta version&lt;/a&gt; and also follow us on &lt;a href="www.twitter.com/plasticscm"&gt;Twitter &lt;/a&gt;and &lt;a href="http://www.facebook.com/PlasticSCM"&gt;Facebook&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6829102715219162305?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6829102715219162305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6829102715219162305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6829102715219162305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6829102715219162305'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/06/distributed-synchronization-view.html' title='Distributed synchronization view... unveiled!'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8345608116507163748</id><published>2011-05-25T17:06:00.003+02:00</published><updated>2011-05-25T17:10:53.162+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='branch explorer'/><title type='text'>Pulling remote changes with DBrEx</title><content type='html'>The work on the upcoming 4.0 release continues, and as usual we try to keep you updated and also share how it is looking so far, so feel free to continue sending feedback, comments and so on. Remember you can see most of the 4.0 screenshots &lt;a href="http://www.flickr.com/photos/plasticscm/sets/72157626193903187/"&gt;here&lt;/a&gt;, and some videos here (www.youtube.com/codicesoftware).&lt;br /&gt;Since we’re already using 4.0 internally (remember, “eating our own dog’s food”), I wanted to share some of the new things that can be easily achieved with the new “branch explorer”, the “distributed branch explorer” or “DBrEx” as we name it internally.&lt;br /&gt;I’m currently working on a task that is on my local repository on my laptop, and I’m about to start a new one and hence create a new branch for it (remember, the &lt;a href="http://www.plasticscm.com/infocenter/quick-start/intro-task-driven-development.aspx"&gt;branch per task pattern&lt;/a&gt;). But, I’d like to start the task from the latest code on a certain branch, so I’d like to know if I have to “pull” some changes from the “master server” at the office.&lt;br /&gt;My situation right now is the following: I have all the changes in branch /main/DAG up to the changeset after BL199, but I’d like to know if there are newer csets on the remote server. Also, please note that the colors of the changesets are different: the “green ones” are csets created on my server, the blue ones changesets that have been “replicated”, hence create remotely (this is already a new feature on 4.0)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-8ZS2iQshZE4/Td0bQNjcW6I/AAAAAAAABGY/hCvNwU-zXck/s1600/dbrex00.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 253px;" src="http://4.bp.blogspot.com/-8ZS2iQshZE4/Td0bQNjcW6I/AAAAAAAABGY/hCvNwU-zXck/s400/dbrex00.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5610670676103682978" /&gt;&lt;/a&gt;&lt;br /&gt;In order to see “what’s new” on /main/DAG I’ll activate the “show remote changesets” option and grab data “for this branch only” from the main server. Plastic is “clever enough” to propose known repositories (repositories you’ve imported data from, in my case, only the main server so far). Activating it looks like the following:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-dPzpEbQSL1I/Td0bWg6ZUJI/AAAAAAAABGg/d67oy8iUcYk/s1600/dbrex01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 245px;" src="http://3.bp.blogspot.com/-dPzpEbQSL1I/Td0bWg6ZUJI/AAAAAAAABGg/d67oy8iUcYk/s400/dbrex01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5610670784379441298" /&gt;&lt;/a&gt;&lt;br /&gt;Once the “remote data” is retrieved, the “DBrEx” will render not only “data from the local server” but also data grabbed from the remote one. Look at the following screenshot to see how “remote changesets” are rendered: we use “dashed lines” to highlight remote csets (csets that are not on your repo).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-9VEQqFLpw0c/Td0bbx1IyoI/AAAAAAAABGo/zF-j2i0JhKY/s1600/dbrex02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 285px;" src="http://3.bp.blogspot.com/-9VEQqFLpw0c/Td0bbx1IyoI/AAAAAAAABGo/zF-j2i0JhKY/s400/dbrex02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5610670874820135554" /&gt;&lt;/a&gt;&lt;br /&gt;So, just a glance at the DBrEx and I know there are changes I’ve to “pull” from the remote server. In fact, I can do more than that, since I can right click on a remote changeset and “diff the changes”, which I think is a really neat feature (note to observers: yes, the options “merge from this changeset” and “create branch” shouldn’t be enabled on remote csets… that’s why this version is still internal, isn’t it???)&lt;br /&gt;One really interesting note: compare the two previous screenshots: do you see branch br:/main/DAG/SCM9472?? Ok, when I didn’t have “remote data” I wasn’t able to find that the branch was already “integrated” remotely into the parent branch /main/DAG, but rendering the remote data for /main/DAG doesn’t only show me the new changes but also tells me that the branch /main/DAG/SCM9472 has already been integrated into /main/DAG… remotely. Cool, isn’t it?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-2Y6xWGo-wDM/Td0brC3rROI/AAAAAAAABGw/Cx-T_pbu4Pw/s1600/dbrex03.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 211px;" src="http://3.bp.blogspot.com/-2Y6xWGo-wDM/Td0brC3rROI/AAAAAAAABGw/Cx-T_pbu4Pw/s400/dbrex03.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5610671137092224226" /&gt;&lt;/a&gt;&lt;br /&gt;Next thing is pulling the new changesets, and I’ll do the same I used to do in 3.0: just right click on the branch, go to replication and “pull this branch”. Easy.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-ubP9iWQrNEE/Td0by-qkXHI/AAAAAAAABG4/NSqOJx3sWTo/s1600/dbrex04.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 153px;" src="http://3.bp.blogspot.com/-ubP9iWQrNEE/Td0by-qkXHI/AAAAAAAABG4/NSqOJx3sWTo/s400/dbrex04.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5610671273402457202" /&gt;&lt;/a&gt;&lt;br /&gt;And then my DBrEx will get updated once the remote changesets have been “pulled” from the remote server, as you can see below. Now the changesets are “local” (although coming from a remote source (that’s why they are blue)) and they’re not rendered with “dashes” anymore…&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-7prM5ZsdfiA/Td0b3xI5seI/AAAAAAAABHA/yCmVDZJV704/s1600/dbrex05.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 48px;" src="http://4.bp.blogspot.com/-7prM5ZsdfiA/Td0b3xI5seI/AAAAAAAABHA/yCmVDZJV704/s400/dbrex05.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5610671355670933986" /&gt;&lt;/a&gt;&lt;br /&gt;So, as you can see, 4.0 is all about DVCS, and the DBrEx is the next step to render distributed version control information graphically… or, at least, that’s our goal! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8345608116507163748?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8345608116507163748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8345608116507163748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8345608116507163748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8345608116507163748'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/05/pulling-remote-changes-with-dbrex.html' title='Pulling remote changes with DBrEx'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-8ZS2iQshZE4/Td0bQNjcW6I/AAAAAAAABGY/hCvNwU-zXck/s72-c/dbrex00.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-7622933446682380572</id><published>2011-05-16T01:13:00.022+02:00</published><updated>2011-05-18T22:56:10.815+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><category scheme='http://www.blogger.com/atom/ns#' term='plastic'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><title type='text'>Setting up Plastic SCM with an external diff tool</title><content type='html'>&lt;!-- Written by Miller Auker - May-2011 --&gt;&lt;br /&gt;In this blogpost we will go through very few steps to setup an external diff tool to work with Plastic SCM. The tool we will use here is Beyond Compare from &lt;a href="http://www.scootersoftware.com/"&gt;Scooter Software&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Motivation&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Although Plastic SCM comes with a powerful diff tool, but there can be times were you want to use your preferred tool to diff some binary files of any type of your choice with your diff tool, an example here could be  Microsoft excel files, which are not supported by our diff tool but Beyond Compare which is a dedicated file compare tool can handle. &lt;br /&gt;&lt;br /&gt;The procedure described here to setup Plastic SCM with an external diff tool can be applied virtually to any other tool.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Lets start setting things up&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Find your favorite compare/diff tool and install it; in my case I installed  Beyond Compare to diff 2 excel files within Plastic Gui.&lt;br /&gt;&lt;br /&gt;Beyond Compare executable is called BCompare.exe and can be executed from the command line with c:\BCompare.exe file1excel.xlsx file2excel.xlsx, so basically when you setup Plastic SCM with Beyond Compare and diffing from Plastic SCM on a revision of a versioned excel file, Plastic will call the BCompare.exe and feed it with the two filenames (or revisions) needed to perform the diff.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To setup Plastic SCM with Beyond Compare diff tool:&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;In PlasticSCM client go to--&gt;Preferences--&gt;Diff tools--ADD &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-3-kq5R-LLJs/TdBeWTZKX6I/AAAAAAAAAGk/GSV55yhRAYY/s1600/Pref_Add_fig1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 366px;" src="http://2.bp.blogspot.com/-3-kq5R-LLJs/TdBeWTZKX6I/AAAAAAAAAGk/GSV55yhRAYY/s400/Pref_Add_fig1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5607085273332211618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li value="2"&gt;In the Define Diff tool configuration window choose:&lt;br /&gt;    &lt;ol&gt;&lt;br /&gt;      &lt;li&gt;External Diff tool&lt;/li&gt;&lt;br /&gt;      &lt;li&gt;Insert the full path to BCompare.exe with the needed arguments: &amp;quot;C:\Program Files\Beyond Compare\BCompare.exe&amp;quot; @sourcefile @destinationfile&lt;/li&gt;&lt;br /&gt;      &lt;li&gt;Choose &amp;quot;Use this tool for files with extension:&amp;quot; .xlsx&lt;/li&gt;&lt;br /&gt;    &lt;/ol&gt;&lt;br /&gt;  &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;  &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-3eiB5M5WOHw/TdBeWowKuzI/AAAAAAAAAGs/-81EEeCyJpA/s1600/DefineDiffTool_fig2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 291px;" src="http://3.bp.blogspot.com/-3eiB5M5WOHw/TdBeWowKuzI/AAAAAAAAAGs/-81EEeCyJpA/s400/DefineDiffTool_fig2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5607085279065848626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol&gt;  &lt;br /&gt;  &lt;li value="3"&gt;Push &amp;quot;Apply &amp;amp; OK&amp;quot; to close the window.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Place the Beyond Compare for *.xlsx files to be the first in the list.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-c8cZ2UmcbYE/TdBeWudlgGI/AAAAAAAAAG0/fUCEeePNTME/s1600/DefineDiffTool_fig3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 341px;" src="http://2.bp.blogspot.com/-c8cZ2UmcbYE/TdBeWudlgGI/AAAAAAAAAG0/fUCEeePNTME/s400/DefineDiffTool_fig3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5607085280598524002" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;ol&gt; &lt;br /&gt;  &lt;li value="5"&gt;In PlasticSCM client items view, mark your excel sheet, do a "diff with &lt;br /&gt;    previous" or "diff" with any other revision.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Beyond Compare will fire on the two excel revisions that you diffed within &lt;br /&gt;    PlasticSCM.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-ePRtTTeF6m4/TdBeW5QCSdI/AAAAAAAAAG8/J4WKWdVSq38/s1600/bc_External_diff_Excel_fig4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 252px;" src="http://4.bp.blogspot.com/-ePRtTTeF6m4/TdBeW5QCSdI/AAAAAAAAAG8/J4WKWdVSq38/s400/bc_External_diff_Excel_fig4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5607085283494480338" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-7622933446682380572?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/7622933446682380572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=7622933446682380572' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7622933446682380572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7622933446682380572'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/05/setting-up-plastic-scm-with-external.html' title='Setting up Plastic SCM with an external diff tool'/><author><name>Miller Auker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-3-kq5R-LLJs/TdBeWTZKX6I/AAAAAAAAAGk/GSV55yhRAYY/s72-c/Pref_Add_fig1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-4636455321228161732</id><published>2011-05-06T17:59:00.016+02:00</published><updated>2011-05-06T19:50:33.254+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integrations'/><category scheme='http://www.blogger.com/atom/ns#' term='annotate'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='plastic'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><title type='text'>Plastic SCM release 3.0.23</title><content type='html'>In the latest releases of Plastic SCM versions 3.0.20 to 3.0.23 we introduced a bunch of new features and bug fixes. Beside the full release notes &lt;a href="http://www.plasticscm.com/download/releasenotes.aspx"&gt;here&lt;/a&gt;, this blogpost will highlight some of them.&lt;br /&gt;Just in case you haven't downloaded this version yet you can do that &lt;a href="http://www.plasticscm.com/download/login.aspx"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Let's start with new features:&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;ReviewBoard 1.6 support&lt;/strong&gt;: &lt;/p&gt;&lt;br /&gt;Plastic SCM now integrates with  the latest &lt;strong&gt;ReviewBoard 1.6&lt;/strong&gt;. ReviewBoard is a web-based Code Review tool from &lt;a href="www.reviewboard.org"&gt;www.reviewboard.org&lt;/a&gt; and the current latest version of ReviewBoard is 1.6b1 and Plastic SCM is currently supported in this version and in the final release 1.6x&lt;br /&gt;&lt;p&gt;Review Board announcement: &lt;a href="http://www.reviewboard.org/news/2011/02/24/review-board-16-beta-1-released/"&gt;http://www.reviewboard.org/news/2011/02/24/review-board-16-beta-1-released/&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And Release Notes: &lt;a href="http://www.reviewboard.org/docs/releasenotes/dev/reviewboard/1.6-beta-1/"&gt;http://www.reviewboard.org/docs/releasenotes/dev/reviewboard/1.6-beta-1/&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-XTp--iSVcxc/TcQcZs_k9uI/AAAAAAAAAF0/6bCSUQuNPE8/s1600/ReviewBoard_PlasticSCM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 244px;" src="http://1.bp.blogspot.com/-XTp--iSVcxc/TcQcZs_k9uI/AAAAAAAAAF0/6bCSUQuNPE8/s400/ReviewBoard_PlasticSCM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5603635064255870690" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Bugzilla versions 3.6 and 4.0 support with Plastic SCM.&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;From Plastic SCM version 3.0.20 we support Bugzilla Bug tracking system from &lt;a href="www.bugzilla.org"&gt;www.bugzilla.org&lt;/a&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-9mOr4pvQ-eQ/TcQcZ26ArvI/AAAAAAAAAF8/dO0iExXnofk/s1600/buggie.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 95px; height: 125px;" src="http://2.bp.blogspot.com/-9mOr4pvQ-eQ/TcQcZ26ArvI/AAAAAAAAAF8/dO0iExXnofk/s400/buggie.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5603635066916876018" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Eclipse: Added Annotate in the Eclipse Plugin &lt;/strong&gt;&lt;/p&gt; &lt;br /&gt;In Release 3.0.23 we added the support for Annotate in the Eclipse Plugin&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-lLTnSCt9dDs/TcQcaGdEK0I/AAAAAAAAAGE/dY2J8JjfiAE/s1600/ECLIPSE_AnnotateExtMenu.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 398px; height: 400px;" src="http://3.bp.blogspot.com/-lLTnSCt9dDs/TcQcaGdEK0I/AAAAAAAAAGE/dY2J8JjfiAE/s400/ECLIPSE_AnnotateExtMenu.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5603635071090436930" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Eclipse plugin: "Import from Plastic SCM" wizard redesigned&lt;/strong&gt;&lt;/p&gt; &lt;br /&gt;The "Import from Plastic SCM" wizard dialog has been redesigned, to allow expanding the repositories to show the existing branches on each repository, so that users can select directly the desired branch to import.&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-gQNPhV3Wwr8/TcQcac3b0DI/AAAAAAAAAGM/zESvkELWbx8/s1600/Eclipse_ImportFromPlasticSCM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 297px;" src="http://3.bp.blogspot.com/-gQNPhV3Wwr8/TcQcac3b0DI/AAAAAAAAAGM/zESvkELWbx8/s400/Eclipse_ImportFromPlasticSCM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5603635077106618418" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Eclipse plugin: New menu option&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;diff with LAST revision on branch when right clicking on an item. This operation is available also in the Sync view.&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-YbzR5BZU6HE/TcQcamB_fYI/AAAAAAAAAGU/O99DHvn7KIw/s1600/Eclipse_DiffOnLatest.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 290px;" src="http://4.bp.blogspot.com/-YbzR5BZU6HE/TcQcamB_fYI/AAAAAAAAAGU/O99DHvn7KIw/s400/Eclipse_DiffOnLatest.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5603635079566818690" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Eclipse plugin: When creating a new workspace (from the Share Project dialog) it is also possible to create a repository.&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-x7qha3gVuug/TcQfRU5ND6I/AAAAAAAAAGc/L9W61BL-UC8/s1600/Eclipse_mkrepo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 259px;" src="http://1.bp.blogspot.com/-x7qha3gVuug/TcQfRU5ND6I/AAAAAAAAAGc/L9W61BL-UC8/s400/Eclipse_mkrepo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5603638218882617250" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Bugs fixed - most important:&lt;/h2&gt;&lt;br /&gt;&lt;strong&gt;Plastic SCM server:&lt;/strong&gt;&lt;p&gt;If the newest created repository was deleted and a new repository was created after restarting the server, the ID for the new repository was the ID of the last deleted repository and the operation failed. Now a new ID is generated and assigned to the new repository.&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Visual Studio integration:&lt;/strong&gt;&lt;p&gt; Fixed a bug related to open Plastic SCM views after adding a new solution to version control.&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Eclipse plugin:&lt;/strong&gt;&lt;p&gt; When the Eclipse workbench and the Plastic SCM were not in the same location and the project was multiproject, an update operation failed because Plastic SCM took the workbench root path as the workspace root path.&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;IntelliJ plugin: &lt;/strong&gt;&lt;p&gt;The comments specified on the checkin operation were not reflected on Plastic SCM.&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Team City plugin:&lt;/strong&gt;&lt;p&gt;There was a problem when several Windows drives were configured to be used.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Improvements, visible and behind the scene!&lt;/h2&gt;&lt;br /&gt;&lt;strong&gt;Performance improvement on copy merge operation:&lt;/strong&gt;&lt;p&gt;Although in the release notes this is mentioned as a bug, but in fact it is an improvement, In release 3.0.187.21 we improved the performance of copy merge operation when dealing with hundreds of files and directories.&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;The update report window improvements&lt;/strong&gt;&lt;p&gt; The update report dialog may show very long messages and require scrolling to view them. Now, the full message is shown, and can be  copied by right clicking on it and selecting "Copy error text".&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Eclipse plugin:&lt;/strong&gt;&lt;p&gt;Now branches and labels are loaded asynchronously; this way the Plastic SCM view is not blocked while the data is being loaded.&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;File types Recognition:&lt;/strong&gt;&lt;p&gt;Text files are automatically detected and set as "text" type files by reading the first bytes of the file.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Last but not least view the full release notes for the complete list of improvements and bug fixes in the last 3 releases &lt;a href="http://www.plasticscm.com/download/releasenotes.aspx"&gt;here&lt;/a&gt;, and we hope you enjoy the improvements!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-4636455321228161732?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/4636455321228161732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=4636455321228161732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4636455321228161732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4636455321228161732'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/05/plastic-scm-release-3023.html' title='Plastic SCM release 3.0.23'/><author><name>Miller Auker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-XTp--iSVcxc/TcQcZs_k9uI/AAAAAAAAAF0/6bCSUQuNPE8/s72-c/ReviewBoard_PlasticSCM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-3472639261746424345</id><published>2011-04-27T15:54:00.004+02:00</published><updated>2011-04-27T15:57:33.313+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Unscientific 4.0 benchmark test</title><content type='html'>As you all know by now we’re heavily working on Plastic SCM 4.0, the upcoming release where we’re trying to put together all the suggestions we got from our user base during the last years (specially the “big ones” which can’t easily be included in minor releases) together with a number of “hard-core” changes impacting the branching and merging engine and the replication (distributed) one.&lt;br /&gt;&lt;br /&gt;Hence 4.0 will come with a number of new features,&lt;a href="http://www.flickr.com/photos/plasticscm/sets/72157626193903187"&gt; including new GUI&lt;/a&gt; and new Distributed Branch Explorer but also heavily improving performance. And that’s exactly what I’ll be sharing today: how 4.0 performs in some simple ops against well-known DVCS.&lt;br /&gt;&lt;br /&gt;I asked to gather some numbers after reading the following tweet from Eric Sink (the brain behind &lt;a href="http://www.ericsink.com/entries/veracity_early.html"&gt;Veracity&lt;/a&gt; () and the &lt;a href="http://www.sourcegear.com"&gt;great Vault&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-rVgT-Yxl6Mg/Tbgger6sZWI/AAAAAAAABGA/ExMKp8wnhGc/s1600/ericsinktweet.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 62px;" src="http://1.bp.blogspot.com/-rVgT-Yxl6Mg/Tbgger6sZWI/AAAAAAAABGA/ExMKp8wnhGc/s400/ericsinktweet.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5600261848192279906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So, we tried a similar scenario on a Dell XPS 13 Laptop (4GB RAM, 7000rpm HD… well, you can find the full specs online, not a beast!) running Windows 7, using two different sets: a small repo (similar to the one used in the previous tweet) and a “huge” one (similar to the ones used in the gaming industry).&lt;br /&gt;And here you’ve the results: first the small one, add+commit 2752 files, 45MB: hg: 7.8s git 3.6 s plastic 3.4s&lt;br /&gt;&lt;br /&gt;It is a really tiny test but we’re happy to outperform the other DVCS already.&lt;br /&gt;We’re using: Plastic 4.0.192 (internal release) using SQLite backend, Hg 1.6.2,   Git 1.7.4.msysgit.0.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-jAGQyg5yhs0/TbggoFYJ_KI/AAAAAAAABGI/OC-T1tE0gts/s1600/smallrepo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 304px;" src="http://4.bp.blogspot.com/-jAGQyg5yhs0/TbggoFYJ_KI/AAAAAAAABGI/OC-T1tE0gts/s400/smallrepo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5600262009645563042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And now let’s give a try to a biggest test using 192k files and 33k directories and a total of 5.82GB. I’m happy to announce that under these circumstances Plastic is even better (our goal is to become the best DVCS handling big files): 192k files, 5.82GB: hg: 1563 s git 1256 s plastic 601 s&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-etl6S8GIN1s/TbggulRezzI/AAAAAAAABGQ/9pAAUrOAKTA/s1600/bigrepo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 304px;" src="http://3.bp.blogspot.com/-etl6S8GIN1s/TbggulRezzI/AAAAAAAABGQ/9pAAUrOAKTA/s400/bigrepo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5600262121286717234" /&gt;&lt;/a&gt;&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-3472639261746424345?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/3472639261746424345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=3472639261746424345' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3472639261746424345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3472639261746424345'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/04/unscientific-40-benchmark-test.html' title='Unscientific 4.0 benchmark test'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-rVgT-Yxl6Mg/Tbgger6sZWI/AAAAAAAABGA/ExMKp8wnhGc/s72-c/ericsinktweet.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8118258183979265421</id><published>2011-04-27T15:51:00.000+02:00</published><updated>2011-04-27T15:51:06.010+02:00</updated><title type='text'>New documentation: migrating from other popular SCM systems</title><content type='html'>Just a quick note to let you know that the main &lt;a href="http://www.plasticscm.com/infocenter/documentation.aspx"&gt;product documentation page&lt;/a&gt; on our Web site includes a new category, "Migrating from other SCMs". It contains writeups on migrating to Plastic SCM from these well-known systems: Microsoft Visual SourceSafe (VSS), CVS, Subversion, and Perforce.&lt;br /&gt;&lt;br /&gt;These writeups are not "marketing fluff" -- they are technical discussions, aimed at helping users who are transitioning to Plastic SCM (or just thinking about such a transition!). We welcome all comments on these migration documents.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8118258183979265421?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8118258183979265421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8118258183979265421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8118258183979265421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8118258183979265421'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/04/new-documentation-migrating-from-other.html' title='New documentation: migrating from other popular SCM systems'/><author><name>John Posner</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6867384964209461178</id><published>2011-03-21T21:47:00.000+01:00</published><updated>2011-03-21T21:47:45.504+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merging'/><title type='text'>Merge: contiguous automatic conflicts produce a non automatic conflict?</title><content type='html'>A few weeks ago, we received a support ticket showing a pretty specific merge case where our mergetool was prompting the user to resolve a non-automatic conflict. The changes on the source and destination revisions were on separate sets of lines, so at first sight they should be merged automatically. But the changes where contiguous.&amp;nbsp;Let me show you the case:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-p1dPpKXddQM/TYeO20EccfI/AAAAAAAABBc/QYoHtpXCwz4/s1600/mergetool.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="387" src="https://lh3.googleusercontent.com/-p1dPpKXddQM/TYeO20EccfI/AAAAAAAABBc/QYoHtpXCwz4/s640/mergetool.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The files I used are not related to the original question, but the case is the same.&amp;nbsp;The user pointed that p4merge was not detecting conflicts and performing the merge automatically:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-lL0kVja2QXg/TYeO8qxK__I/AAAAAAAABBg/uNnJ9sEVrvc/s1600/p4merge.png" imageanchor="1"&gt;&lt;img border="0" height="419" src="https://lh4.googleusercontent.com/-lL0kVja2QXg/TYeO8qxK__I/AAAAAAAABBg/uNnJ9sEVrvc/s640/p4merge.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;So p4merge is making your life a bit easier than Plastic's mergetool by doing some automatic operation for you, right? It's fine for a case like this. But let me show a similar example, this time with code.&lt;br /&gt;&lt;br /&gt;Here is p4merge, with changes in separate lines of code on the source and destination and&amp;nbsp;identifying&amp;nbsp;both of them as separate changes. The merge is automatic:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-NkfFlDWlwb8/TYeFqd9En-I/AAAAAAAABBU/_vKEKoxfzFQ/s1600/p4merge.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="387" src="https://lh5.googleusercontent.com/-NkfFlDWlwb8/TYeFqd9En-I/AAAAAAAABBU/_vKEKoxfzFQ/s640/p4merge.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;However, looking at the result file, the code there is not likely the intention of neither of the developers. Now let's see how Plastic's mergetool does it:&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-qRAiWM-8qho/TYeFr9f-1fI/AAAAAAAABBY/wAUNP8QQ6lU/s1600/Plastic-Mergetool.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="465" src="https://lh5.googleusercontent.com/-qRAiWM-8qho/TYeFr9f-1fI/AAAAAAAABBY/wAUNP8QQ6lU/s640/Plastic-Mergetool.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In this case, mergetool is again detecting a non automatic conflict, but in this case, this is a better option, since the incorrect automatic result would otherwise remain unnoticed.&lt;br /&gt;This is so because when dealing with code the context is important, and Plastic will check the context of the conflicts to determine if a situation can cause potential "merge pain". On that situation, the rule is "better ask than automatically resolve something potentially dangerous".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6867384964209461178?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6867384964209461178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6867384964209461178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6867384964209461178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6867384964209461178'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/03/merge-contiguous-automatic-conflicts.html' title='Merge: contiguous automatic conflicts produce a non automatic conflict?'/><author><name>Dave</name><uri>http://www.blogger.com/profile/01839507951800291038</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_-O_O8wZ7KPU/ShPx2jrI-PI/AAAAAAAAAuI/l6BIG-NCPns/S220/avatar256.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh3.googleusercontent.com/-p1dPpKXddQM/TYeO20EccfI/AAAAAAAABBc/QYoHtpXCwz4/s72-c/mergetool.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6315701114635155546</id><published>2011-03-21T18:03:00.002+01:00</published><updated>2011-03-21T18:05:58.487+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>New writings available</title><content type='html'>Check the latest "&lt;a href="http://www.cmcrossroads.com/cm-articles/cm-journal/13987-alm-tools-and-techniques"&gt;ALM Tools and Techniques&lt;/a&gt;" and there our writing about "&lt;a href="http://www.cmcrossroads.com/cm-articles/275-articles/13981-language-aware-scm"&gt;Language aware SCM&lt;/a&gt;", unveiling some of the root ideas behind the tools we're development.&lt;br /&gt;&lt;br /&gt;The first step was &lt;a href="http://www.plasticscm.com/features/xmerge.aspx"&gt;Xmerge &amp; Xdiff&lt;/a&gt;, then "&lt;a href="http://www.plasticscm.com/features/method-history.aspx"&gt;method history&lt;/a&gt;" but the best is still to be delivered :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6315701114635155546?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6315701114635155546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6315701114635155546' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6315701114635155546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6315701114635155546'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/03/new-writings-available.html' title='New writings available'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-7950441053617775881</id><published>2011-03-09T09:29:00.022+01:00</published><updated>2011-03-09T11:05:50.701+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scm'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='plastic'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><title type='text'>Plastic SCM release 3.0.19</title><content type='html'>In this latest release of Plastic SCM version 3.0.19 we introduced a bunch of new features and bug fixes,&lt;br /&gt;Beside the release notes &lt;a href="http://www.plasticscm.com/download/releasenotes.aspx"&gt;here&lt;/a&gt;, this blog will higlight some of the things we introduced/fixed in this release.&lt;br /&gt;Just in case you haven't downloaded this version yet you can do it &lt;a href="http://www.plasticscm.com/download/login.aspx"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Let's start with new features:&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;TEAM CITY CI&lt;/strong&gt;: &lt;/p&gt;&lt;br /&gt;Plastic SCM now integrates with &lt;strong&gt;Team City&lt;/strong&gt; Continues Integration&lt;br /&gt;from &lt;a href="http://www.jetbrains.com/teamcity/"&gt;JetBrains&lt;/a&gt; through our own plug in get it &lt;a href="http://www.plasticscm.com/download/login.aspx?r=%2fdownload%2feditions.en.aspx"&gt;here&lt;/a&gt; log in and download the Team City plug in&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-6i-U2steW-M/TXdHbrywWuI/AAAAAAAAAEs/DsXNfVW2sYU/s1600/TeamCity_PlasticSCM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 217px;" src="http://4.bp.blogspot.com/-6i-U2steW-M/TXdHbrywWuI/AAAAAAAAAEs/DsXNfVW2sYU/s400/TeamCity_PlasticSCM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5582008804086668002" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Mantis integration:&lt;/strong&gt;&lt;/p&gt; Now we support the latest Mantis 1.2.4&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Shell Extension:&lt;/strong&gt;&lt;/p&gt; Include the annotate view. when right clicking on an item,&lt;br /&gt;users will be able to annotate that item.&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-cX4DwMPwGkw/TXdH86tQ-qI/AAAAAAAAAE0/wnbbFamTaAM/s1600/Annotate_ShlEx.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 324px;" src="http://1.bp.blogspot.com/-cX4DwMPwGkw/TXdH86tQ-qI/AAAAAAAAAE0/wnbbFamTaAM/s400/Annotate_ShlEx.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5582009375025855138" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Visual Studio integration:&lt;/strong&gt;&lt;/p&gt; Added support for solution folders.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Check in dialog with task control now allows including recent comments:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;When Plastic SCM is configured to work with a task control on task on&lt;br /&gt;changeset mode, the check in dialog now allows including recent&lt;br /&gt;comments, as the usual check in dialog.&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-rcR02uw_3jk/TXdH9e3qkuI/AAAAAAAAAFM/dnvaBqe7vMg/s1600/Recent_Comments_TC.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 328px;" src="http://1.bp.blogspot.com/-rcR02uw_3jk/TXdH9e3qkuI/AAAAAAAAAFM/dnvaBqe7vMg/s400/Recent_Comments_TC.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5582009384733151970" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Bugs fixed - most important:&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Adding items from the GUI in Linux was not working:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;This was a Mono issue related to return the focus to the parent window when the Comments&lt;br /&gt;dialog was prompted.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;The diff now opens as a separate window when it is called from the merge dialog or the 3D tree:&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;When diffing items from the merge dialog or the tree, the difftool was opened embedded as a&lt;br /&gt;Plastic SCM view (when this setting was configured this way), which was not usable, since the&lt;br /&gt;difftool was opened behind the dialog.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Branch Explorer:&lt;/strong&gt;&lt;/p&gt; When the last two changesets on a branch had exactly the same date, the&lt;br /&gt;latest was drawn outside the branch.&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-7NdiNOavCcE/TXdH9GMHe6I/AAAAAAAAAE8/HNiN5dKs6L8/s1600/cs_out_brex.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 152px;" src="http://1.bp.blogspot.com/-7NdiNOavCcE/TXdH9GMHe6I/AAAAAAAAAE8/HNiN5dKs6L8/s400/cs_out_brex.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5582009378108046242" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Visual Studio integration:&lt;/strong&gt;&lt;/p&gt;There was a problem when the workspace that contains a solution binded to Plastic SCM was&lt;br /&gt;deleted. Then, when the solution was opened in Visual Studio and the user executed a Refresh Status operation a null was reported.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Add dir + file was not recursive:&lt;/strong&gt;&lt;/p&gt;Selecting a file and a directory and performing an add operation from&lt;br /&gt;the GUI did not add the directory recursively. Now the user can add recursively or non-recursively when a directory is selected.&lt;br /&gt;&lt;h2&gt;Improvements, visible and behind the scene!&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Active Directory authentication:&lt;/strong&gt;&lt;/p&gt;Although in the release notes this is mentioned as a bug, but in fact it is an improvement, Plastic&lt;br /&gt;SCM was directing all the user queries to the central server instead of a remote (local) one if existed. This was causing performance problems since users needed to be resolved.&lt;br /&gt;We where using an older method, now we use a new one GetDomainController method.&lt;br /&gt;You will need to update the server to 3.0.19 to benefit from this improved AD resolution.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Shell Extension:&lt;/strong&gt;&lt;/p&gt; Performance issues noticed on the Windows Explorer related to external&lt;br /&gt;drives (especially floppy drives) and network mapped drives when the Shell Extension was installed.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Improve search toolbar:&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;Search boxes in difftool, mergetool, code review and annotate view.&lt;br /&gt;Now not only the buttons are clickable, but also the labels area.&lt;br /&gt;&lt;p&gt;Before&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-6NJXWuDob5Q/TXdH9SrUAcI/AAAAAAAAAFU/Mb6eQ5twhG4/s1600/Search_ToolBar_b4.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 23px;" src="http://3.bp.blogspot.com/-6NJXWuDob5Q/TXdH9SrUAcI/AAAAAAAAAFU/Mb6eQ5twhG4/s400/Search_ToolBar_b4.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5582009381460115906" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;After &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-hQj100xM9AU/TXdICOlDg2I/AAAAAAAAAFc/UUNcBvl4yt4/s1600/Search_ToolBar_after.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 23px;" src="http://1.bp.blogspot.com/-hQj100xM9AU/TXdICOlDg2I/AAAAAAAAAFc/UUNcBvl4yt4/s400/Search_ToolBar_after.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5582009466259473250" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Improving some error messages:&lt;/strong&gt;&lt;/p&gt;The update report message "Can't load root item..." has been improved&lt;br /&gt;to include more information about the causes of the error. In addition to this, if the user clicked on 'retry update' an assert false was&lt;br /&gt;reported.&lt;br /&gt;&lt;p&gt;When diffing identical revisions a message with the caption "Error" was shown, now the caption is "Information".&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/--71B5ILn4bI/TXdH9PsGRMI/AAAAAAAAAFE/b6OiVGst73Q/s1600/Diff_same.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 314px;" src="http://4.bp.blogspot.com/--71B5ILn4bI/TXdH9PsGRMI/AAAAAAAAAFE/b6OiVGst73Q/s400/Diff_same.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5582009380658103490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;last but not least view the full release notes for the complete list of improvements and bug fixes in this release &lt;a href="http://www.plasticscm.com/download/releasenotes.aspx"&gt;here&lt;/a&gt;, and we hope you enjoy this one!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-7950441053617775881?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/7950441053617775881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=7950441053617775881' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7950441053617775881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7950441053617775881'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/03/plastic-scm-release-3019.html' title='Plastic SCM release 3.0.19'/><author><name>Miller Auker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-6i-U2steW-M/TXdHbrywWuI/AAAAAAAAAEs/DsXNfVW2sYU/s72-c/TeamCity_PlasticSCM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6667433874805257925</id><published>2011-03-08T23:07:00.009+01:00</published><updated>2011-03-08T23:17:49.668+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='branch explorer'/><title type='text'>DAG rendering - take two</title><content type='html'>A few days ago &lt;a href="http://codicesoftware.blogspot.com/2011/03/dag-rendering.html"&gt;I posted about some DAG rendering techniques&lt;/a&gt; we’re using in the new Plastic SCM release we’re working on.&lt;br /&gt;&lt;br /&gt;Today I’d like to go through the alternative rendering techniques, the pros and cons of each of them, and then try to grab some feedback about which one is better. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Motivation&lt;/h2&gt;&lt;br /&gt;One of the main consequences of &lt;a href="http://codicesoftware.blogspot.com/2010/11/version-control-timeline.html"&gt;the DVCS age&lt;/a&gt; is the huge number of branches repositories have to deal with. Previously SVN, CVS, VSS and others (and I’d include P4 and now TFS in this pack) avoided branching as hell. But now everyone is embracing branching, so a good way to draw an item’s history and  parallel evolution is required.&lt;br /&gt;&lt;br /&gt;I’ll describe how Mercurial diagrams work (inTortoise Hg 2.0), then will do the same for Git using GitK and GitHub network graphs.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Two rendering styles&lt;/h2&gt;&lt;br /&gt;There are basically two alternatives right now for displaying version control graph diagrams:&lt;br /&gt;&lt;li&gt;Vertical style: rendering nodes from top to bottom, top being the newest changes&lt;br /&gt;&lt;li&gt;Horizontal style: like the previous rotated 90 degrees clockwise&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Mercurial style&lt;/h2&gt;&lt;br /&gt;Mercurial (Hg) graph rendering uses the vertical style. The graph focuses on “commits” (or changesets/checkins, if you prefer) which are drawn top-down, starting with the more recent ones and going back in time as you scroll down.&lt;br /&gt;The basic elements are displayed in the following picture.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-DdFOgHIyY6M/TXapGsMNI2I/AAAAAAAABE4/BCj8DfHjfrQ/s1600/hgstyle.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 154px; height: 214px;" src="http://4.bp.blogspot.com/-DdFOgHIyY6M/TXapGsMNI2I/AAAAAAAABE4/BCj8DfHjfrQ/s400/hgstyle.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5581834720578970466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Commits are represented by circles, decorated differently depending on whether they’re simple, tagged, or loaded in the workspace. Each commit can have up to two parents. (In Hg every commit can only have one merge; multiple-merging is not supported.)&lt;br /&gt;&lt;br /&gt;One interesting feature here is that branches are “bent” to reuse horizontal space when another branch ends. The graphic tries to be as narrow as possible, shrinking or growing horizontally depending on the number of parallel branches.&lt;br /&gt;&lt;br /&gt;The next screenshot shows an actual image of a real repo, &lt;a href="http://tortoisehg.bitbucket.org/screenshots.html"&gt;taken from the release notes of Tortoise Hg 2.0&lt;/a&gt;. I’ve highlighted a merge.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-bd0pc81LC9c/TXapda5uiDI/AAAAAAAABFA/4-GuNlaYa40/s1600/hgscreenshotdetailed.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 226px;" src="http://4.bp.blogspot.com/-bd0pc81LC9c/TXapda5uiDI/AAAAAAAABFA/4-GuNlaYa40/s400/hgscreenshotdetailed.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5581835111075055666" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It is important to note that “merge links” are just lines between commits, with no special decoration. Of course, trained developers will immediately find them and recognize their meaning. “Branch terminators”, indicating that a Hg branch has been “closed”, appear as rectangles at the end of a branch.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Git(K) style&lt;/h2&gt;&lt;br /&gt;Let’s take a look at a GitK screenshot, maybe an overcomplicated one, extracted from &lt;a href="http://blog.spearce.org/2007/07/difficult-gitk-graphs.html"&gt;http://blog.spearce.org/2007/07/difficult-gitk-graphs.html&lt;/a&gt;. Fortunately not all GitK graphcs are this hard to follow!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-Y99dcDsHSl8/TXaprrV505I/AAAAAAAABFI/7OjSuPcr2OQ/s1600/gitkstyle.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 190px;" src="http://4.bp.blogspot.com/-Y99dcDsHSl8/TXaprrV505I/AAAAAAAABFI/7OjSuPcr2OQ/s400/gitkstyle.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5581835356006372242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It’s clear that horizontal space can be wasted if there are too many active parallel development lines (branches) at a given point. I’ve marked a merge and, as with Hg, there are no special symbols to draw merges, just a line between two commits.&lt;br /&gt;&lt;br /&gt;It is important to note that Git, unlike Mercurial, is able to handle multiple merges at the same time (a commit can have more than 2 parents).&lt;br /&gt;&lt;br /&gt;GitK follows the same “vertical pattern” that Tortoise Hg uses. I find Hg rendering style more polished but I guess it is a matter of taste.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Rotate: enter the GitHub network graph&lt;/h2&gt;&lt;br /&gt;The GitHub “network graph” follows a more “traditional” rendering approach: branches extend from left to right instead of top to bottom.&lt;br /&gt;&lt;br /&gt;It more closely resembles the kind of diagrams that most people draw on a blackboard when trying to explain how a project evolves.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-LcZhtfs-ghQ/TXap4Uc_AaI/AAAAAAAABFQ/wHaLYnaraZ0/s1600/githubviewer.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 254px;" src="http://1.bp.blogspot.com/-LcZhtfs-ghQ/TXap4Uc_AaI/AAAAAAAABFQ/wHaLYnaraZ0/s400/githubviewer.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5581835573200355746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You have to click on the commits to see the related information. This differs from the vertical style, where the comment, committer and date always appear on the right.&lt;br /&gt;&lt;br /&gt;As time passes, the graph evolves to the right, with the dates represented like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-Cc2h_ITCT8A/TXap94cGI0I/AAAAAAAABFY/tqij4dgSHEk/s1600/githubstyle-dates.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 381px; height: 183px;" src="http://2.bp.blogspot.com/-Cc2h_ITCT8A/TXap94cGI0I/AAAAAAAABFY/tqij4dgSHEk/s400/githubstyle-dates.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5581835668759651138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Vertical style – pros &amp; cons&lt;/h2&gt;&lt;br /&gt;Using a GitK screenshot taken on a Mac OS X machine (see &lt;a href="http://effectif.com/git/making-gitk-look-good-on-mac"&gt;http://effectif.com/git/making-gitk-look-good-on-mac&lt;/a&gt;), I’ll summarize the pros &amp; cons of the vertical style. BTW, feel free to send comments/suggestions.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-FJC2C9YMhsI/TXaqIAjcoGI/AAAAAAAABFg/POwle34QayQ/s1600/verticallayoutprosandcons.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 247px;" src="http://1.bp.blogspot.com/-FJC2C9YMhsI/TXaqIAjcoGI/AAAAAAAABFg/POwle34QayQ/s400/verticallayoutprosandcons.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5581835842736660578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pros&lt;/h3&gt;&lt;br /&gt;&lt;li&gt;Scrolling down to move back in time is quite natural since we’re all used to it thanks to similar controls, such as list views. In fact, the entire graph is just a modified list view.&lt;br /&gt;&lt;li&gt;Branch lines are bent (Hg) or moved left (GitK) in order to reduce the graph width as much as possible. Following a branch over time is a simple “vertical trip”; you have to check if the branch moved left or right depending on changes made on other branches.&lt;br /&gt;&lt;h3&gt;Cons&lt;/h3&gt;&lt;br /&gt;&lt;li&gt;These days, most display screens are much wider than they are tall, so the vertical style does not make the best use of the available screen real estate.&lt;br /&gt;&lt;li&gt;When there are many open parallel branches, too many vertical lines make the graph hard to follow.&lt;br /&gt;&lt;li&gt;With GitK, the vertical space is even more constrained, since the graph usually occupies the top half of the overall window. (You can resize, but then you lose the bottom half of the window.)&lt;br /&gt;&lt;li&gt;Colorblind people might easily get lost, depending on the colors (this also applies to the horizontal style)&lt;br /&gt;&lt;h3&gt;And some notes:&lt;/h3&gt;&lt;br /&gt;&lt;li&gt;Merges are not drawn as different parent links, which could make the graph easier to understand. (We took care to do this in the Plastic SCM BranchExplorer.)&lt;br /&gt;&lt;li&gt;There is no specific representation of branches; branches are just rendered as lines between commits. (This is probably a controversial point for DVCS purists, since branches in Git and Hg, while extremely useful, are not as “strong” as they are in other SCM systems. (That is, the important concept is the “commit”, and the branch tends to be secondary. In fact, Hg is able to do “anonymous” branching.)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Horizontal style - pros &amp; cons&lt;/h2&gt;&lt;br /&gt;The horizontal style is the one I’m more used to, because it’s the one we use (so far) in the Plastic SCM BranchExplorer. It also resembles quite naturally what we normally draw on a blackboard to depict releases, branching patterns on a project, and so on. The following picture shows a hand-made branching (or release) diagram. It seems more natural to draw it this way, because people are more used to graphs in which time is on the horizontal axis than on the vertical axis…&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-mWBVjXJFk74/TXaqgYKSovI/AAAAAAAABFo/Yfun6sV1YjA/s1600/handmadereleasediagram.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 266px;" src="http://4.bp.blogspot.com/-mWBVjXJFk74/TXaqgYKSovI/AAAAAAAABFo/Yfun6sV1YjA/s400/handmadereleasediagram.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5581836261390459634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pros&lt;/h3&gt;&lt;br /&gt;&lt;li&gt;Better use of modern ”landscape”-style display screens.&lt;br /&gt;&lt;li&gt;More natural, since the graph better resembles blackboard diagrams of branching structures.&lt;br /&gt;&lt;h3&gt;Cons&lt;/h3&gt;&lt;br /&gt;&lt;li&gt;When there are tons of parallel lines (lots of open branches). you might have to scroll down to find your branch.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Conclusion, questions and thoughts&lt;/h2&gt;&lt;br /&gt;First some questions and thoughts:&lt;br /&gt;&lt;li&gt;None of the Git or Hg tools display “merge links” as such. Do you miss this information? (I ask this because I always draw it manually on the blackboard and we implemented it this way in our BranchExplorer).&lt;br /&gt;&lt;li&gt;I’m not aware of zooming capabilities on GitK or Tortoise Hg to deal with the branching diagram. Do you think it is useful?&lt;br /&gt;&lt;li&gt;Finding the perfect rendering technique seems to be difficult. For instance when repositories are big enough there will always be a ton of branches and commits (changesets), so rendering all of them can make the graphic confusing. One of the things we’re working on is having an option to render “relevant commits only” (only changesets that are involved in a merge or are at the beginning or end of a branch  ):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-xGZL13wxnhw/TXaqxvRX_WI/AAAAAAAABFw/8TSZPGc9IiM/s1600/relevantchanges.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 344px;" src="http://2.bp.blogspot.com/-xGZL13wxnhw/TXaqxvRX_WI/AAAAAAAABFw/8TSZPGc9IiM/s400/relevantchanges.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5581836559651962210" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;li&gt;Neither Hg nor Git displays “branches” as such, as elements. What do you think about it? I’m totally biased here towards what we do with the BranchExplorer but I’m more used to the following where branches are depicted as “first class citizens”:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-od59Z5EVSJ8/TXaq38A8xgI/AAAAAAAABF4/KWrb_JypR1Q/s1600/dbrex.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 228px;" src="http://4.bp.blogspot.com/-od59Z5EVSJ8/TXaq38A8xgI/AAAAAAAABF4/KWrb_JypR1Q/s400/dbrex.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5581836666151945730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In conclusion: drawing branch diagrams (or release diagrams, if you prefer) is not an easy task, because everything looks great when there are only a few branches and changesets involved, but easily becomes hell with real projects with tons of branching and merging. &lt;br /&gt;&lt;br /&gt;Filtering – the ability to temporarily suppress the display of branches you’re not currently interested in – might be the best option to keep things under control .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6667433874805257925?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6667433874805257925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6667433874805257925' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6667433874805257925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6667433874805257925'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/03/dag-rendering-take-two.html' title='DAG rendering - take two'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-DdFOgHIyY6M/TXapGsMNI2I/AAAAAAAABE4/BCj8DfHjfrQ/s72-c/hgstyle.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1098827586715820189</id><published>2011-03-03T00:39:00.006+01:00</published><updated>2011-03-03T00:46:37.715+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>DAG rendering</title><content type='html'>If you don’t know what DAG means … lucky you! You’re probably a happy developer focusing on solving your own software problems, instead of delving into nitty-gritty version control details.&lt;br /&gt;&lt;br /&gt;But if you’ve been in the coding community for the last 3 years or so, you’ve probably heard of “DAG oriented” distributed version control systems, such as Git. (I won’t include Mercurial here since it is, theoretically, a delta-based system according to the now famous &lt;a href="http://www.slideshare.net/chacon/getting-git"&gt;"Getting Git" from Scott Chacon&lt;/a&gt; .) &lt;br /&gt;&lt;br /&gt;DAG, which stands for “Directed Acyclic Graph”, is the underlying data structure that Git, and other SCMs, use to store the different versions you create.&lt;br /&gt;&lt;br /&gt;While the DAG concept applies to the underlying structure, if you diagram the way changesets (“commits” in Git jargon) evolve, you’ll also get a beautiful tree that is… hey, acyclic too!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Painting trees&lt;/h2&gt;&lt;br /&gt;We’re working hard on the upcoming Plastic SCM 4.0 release, with a bunch of features under consideration -- from core changes to an even better merge to new visual tools, including a new BranchExplorer.&lt;br /&gt;&lt;br /&gt;Today I’m going to share some of the concepts we’re using to render the evolution of the repository, the “changeset evolution” (or “commit evolution” if you prefer). This will help you understand the differences from Plastic SCM 3.0 and also illuminate the best way to render DAG-based version history.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;It all started here&lt;/h2&gt;&lt;br /&gt;The diagrams below show some of our ideas for simplifying the display of version history, so that “what you draw on a blackboard to communicate with your colleagues” can become an interactive diagram, our BranchExplorer.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-ONL36UxYe7Q/TW7VxBWMUoI/AAAAAAAABEI/Olh5ulalKWk/s1600/initialconcept.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 277px;" src="http://1.bp.blogspot.com/-ONL36UxYe7Q/TW7VxBWMUoI/AAAAAAAABEI/Olh5ulalKWk/s400/initialconcept.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5579632026510447234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Since a good number of our new users have Git and Mercurial backgrounds, we thought that  diagrams like these would make them feel more “at home”. Plastic SCM 4.0 will introduce some of these display strategies, which are similar to those of  the most used DVCSs out there.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;From paper to pixels – take 0&lt;/h2&gt;&lt;br /&gt;Here is one of the initial screenshots, similar to the conceptual diagrams above, but now implemented as an interactive graphic.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-1GSME4LePSc/TW7V_r-a1RI/AAAAAAAABEQ/ZtMfD1BSx6M/s1600/renderingdags.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 167px;" src="http://1.bp.blogspot.com/-1GSME4LePSc/TW7V_r-a1RI/AAAAAAAABEQ/ZtMfD1BSx6M/s400/renderingdags.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5579632278471628050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Zooming out, you can see a wider diagram in “DAG mode” (not a high-quality rendering, though):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-6Zx6BpDHhr8/TW7WGZNcsLI/AAAAAAAABEY/p9KBXZx_xMs/s1600/daginplastic.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 229px;" src="http://2.bp.blogspot.com/-6Zx6BpDHhr8/TW7WGZNcsLI/AAAAAAAABEY/p9KBXZx_xMs/s400/daginplastic.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5579632393693474994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Painting labels (or tags)&lt;/h2&gt;&lt;br /&gt;We’re also playing with some ideas to render labels in a more visible and interactive way than in Plastic SCM 3.0:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-N5tfd-OHoOI/TW7WOFxPRAI/AAAAAAAABEg/0VQkX02O-uE/s1600/labeldag.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 142px;" src="http://4.bp.blogspot.com/-N5tfd-OHoOI/TW7WOFxPRAI/AAAAAAAABEg/0VQkX02O-uE/s400/labeldag.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5579632525913834498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In Plastic SCM 4.0, labels will be fully clickable. Wewill also render them in such a way that you get some additional information even before clicking, such as when the same “changeset” has more than one label.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Going distributed&lt;/h2&gt;&lt;br /&gt;I don’t want to unveil all the details yet, so consider the next two as “spy photos” like the ones that show up on car magazines when a new model is still under development. (You know, you can get most of the details if you look carefully :P)&lt;br /&gt;&lt;br /&gt;Right now I’ll just show some alternatives we’re working on with very preliminary screen shots. The following screen shot (which looks quite arcane to me now) includes some of the new labeled-changeset display along with information about different replication sources.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-GtAB3hjAd5M/TW7WbdmlxyI/AAAAAAAABEo/_koL37QNP78/s1600/dbrex.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 170px;" src="http://3.bp.blogspot.com/-GtAB3hjAd5M/TW7WbdmlxyI/AAAAAAAABEo/_koL37QNP78/s400/dbrex.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5579632755649922850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And finally, a much more polished screen shot quite evolved from the previous one (but we’re still not finished with BranchExplorer development!).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-H8DVMDVlYdI/TW7WjbRXi5I/AAAAAAAABEw/NS0Fy0Gs-Ek/s1600/dbrex-remote.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://1.bp.blogspot.com/-H8DVMDVlYdI/TW7WjbRXi5I/AAAAAAAABEw/NS0Fy0Gs-Ek/s400/dbrex-remote.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5579632892462992274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Wrapping up&lt;/h2&gt;&lt;br /&gt;In future posts, coming soon, long-term Plastikers will discover a bunch of forthcoming changes, while newcomers will still be able to see (and comment on!) some alternatives for diagramming repository evolution for a  distributed version control system.&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-1098827586715820189?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1098827586715820189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=1098827586715820189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1098827586715820189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1098827586715820189'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/03/dag-rendering.html' title='DAG rendering'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ONL36UxYe7Q/TW7VxBWMUoI/AAAAAAAABEI/Olh5ulalKWk/s72-c/initialconcept.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6349118904043778101</id><published>2011-02-25T22:14:00.002+01:00</published><updated>2011-02-25T22:18:37.021+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>git interop</title><content type='html'>Last December &lt;a href="http://codicesoftware.blogspot.com/2010/12/welcome-to-jungle.html"&gt;we launched “Git Jungle”&lt;/a&gt; a Git repository visualization tool for Git based on Plastic SCM code.&lt;br /&gt;&lt;br /&gt;A few weeks later we released &lt;a href="http://codicesoftware.blogspot.com/2011/01/method-history-for-subversion-is-here.html"&gt;“Method history for Subversion”&lt;/a&gt; another step ahead in SCM interop (ok, this time just sharing some of our core features with other systems).&lt;br /&gt;&lt;br /&gt;We’re working on the next big Plastic SCM release, 4.0, and one of the key goals will be SCM interop. We plan to have (we’re working on it) bi-directional synch with Git and SVN and then eventually add other systems.&lt;br /&gt;&lt;br /&gt;We’re developing a Git fast-import and fast-export support which opens the doors to full import/export from Plastic to Git and hence conforms to the format that is growing as the “lingua franca” in the SCM world.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;A little bit of jungle&lt;/h2&gt;&lt;br /&gt;Take a look at the &lt;a href="https://github.com/git/git.git"&gt;git repository&lt;/a&gt; rendered by GitJungle.&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="576" height="450" src="http://www.youtube.com/embed/osTmHFQX7fo?hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;And a sneak-preview of 4.0&lt;/h2&gt;&lt;br /&gt;And now the same repository after being fast-exported and fast-imported into Plastic (cm fast-import) and already showing some of the new (still unveiled :P) Branch Explorer features.&lt;br /&gt;&lt;br /&gt;&lt;iframe title="YouTube video player" width="576" height="450" src="http://www.youtube.com/embed/pYaoKjO9-ow?hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Enjoy and send us feedback!! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6349118904043778101?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6349118904043778101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6349118904043778101' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6349118904043778101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6349118904043778101'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/02/git-interop.html' title='git interop'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/osTmHFQX7fo/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6563510117520516430</id><published>2011-01-11T23:55:00.004+01:00</published><updated>2011-01-12T00:01:20.042+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='backend'/><title type='text'>Upgrading Plastic SCM to Firebird Server</title><content type='html'>When you install Plastic SCM on Window it will work with an embedded Firebird database. Firebird is very good in terms of performance for small teams, but sometimes you will need to upgrade to something faster, specially if you detect some operations are slow. Let's see how to do a very easy move: set up a Firebird server instead of an embedded one.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Motivation&lt;/h2&gt;&lt;br /&gt;If you see your update operation is too slow... then more often than not you're experiencing a slow backend. Sometimes it can also be due to the disk IO performance so do a quick test: go to your workspace and type:&lt;br /&gt;&lt;br /&gt;cm update . --timer --stats --noparallel&lt;br /&gt;&lt;br /&gt;And check the "SolveSelector" line. If it's bigger than, let's say, 3-5 seconds and your server is on the LAN... you've a perf issue!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Installing Firebird&lt;/h2&gt;&lt;br /&gt;At the time of writing this we just recommend to go for Firebird 2.1.3, so go to this page and download it: &lt;a href="http://www.firebirdsql.org/index.php?op=files&amp;id=engine_213"&gt;http://www.firebirdsql.org/index.php?op=files&amp;id=engine_213&lt;/a&gt;. Installing it is just a matter of a few clicks.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Setting up Plastic to use a Firebird server&lt;/h2&gt;&lt;br /&gt;Really easy: stop the plastic service and then create a db.conf file on the server's directory location with the following contents:&lt;br /&gt;&lt;br /&gt;(Remember: the entire "connection string" in a single line!!!!)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;DbConfig&amp;gt;&lt;br /&gt;  &amp;lt;ProviderName&amp;gt;firebird&amp;lt;/ProviderName&amp;gt;&lt;br /&gt;  &amp;lt;ConnectionString&amp;gt;ServerType=0;User=SYSDBA;&lt;br /&gt;      Password=masterkey;Database={0};Pooling=true;&lt;br /&gt;      connection lifetime=60;Charset=UNICODE_FSS;&lt;br /&gt;  &amp;lt;/ConnectionString&amp;gt;&lt;br /&gt;  &amp;lt;DatabasePath&amp;gt;&amp;lt;/DatabasePath&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/DbConfig&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Restart the Plastic server and you're done!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6563510117520516430?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6563510117520516430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6563510117520516430' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6563510117520516430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6563510117520516430'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/01/upgrading-plastic-scm-to-firebird.html' title='Upgrading Plastic SCM to Firebird Server'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8761514921495396074</id><published>2011-01-03T22:51:00.006+01:00</published><updated>2011-01-04T07:25:11.020+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Method history for Subversion is here!</title><content type='html'>Simply put: right click on a C# method in Visual Studio and find its history instead the entire file history: &lt;a href="http://www.plasticscm.com/labs/method-history-for-subversion.aspx"&gt;we called it method history for SVN&lt;/a&gt;!!&lt;br /&gt;&lt;br /&gt;Yes, here it is: if you’re a Visual Studio programmer using Subversion (Eclipse developers will have to wait a few more weeks…) and C# you can start using our plugin right now: it provides a new context menu command:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TSJFb1NBPOI/AAAAAAAABDw/LCG2noU4aS0/s1600/picture00.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 358px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TSJFb1NBPOI/AAAAAAAABDw/LCG2noU4aS0/s400/picture00.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5558081234569084130" /&gt;&lt;/a&gt;&lt;br /&gt;This command launches a window that displays the most recent revisions of the file containing the method. Then you will be able to navigate the different revisions and be able to filter the ones that contain the method and the ones where the method has been modified. It doesn’t matter how heavily you refactored your code, the plugin will locate it!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TSJFkWIkVzI/AAAAAAAABD4/me-KpDIkkR8/s1600/methodhistorysvn01b.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 238px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TSJFkWIkVzI/AAAAAAAABD4/me-KpDIkkR8/s400/methodhistorysvn01b.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5558081380847736626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;How to get it&lt;/h2&gt;&lt;br /&gt;&lt;a href="http://www.plasticscm.com/labs/method-history-for-subversion.aspx"&gt;Download the plugin here&lt;/a&gt;. It installs in just a few seconds and then a new menu option will show up on your context menu on Visual Studio. Testing it can’t be easier.&lt;br /&gt;&lt;h2&gt;Action&lt;/h2&gt;&lt;br /&gt;Watch it live here:&lt;br /&gt;&lt;object width="480" height="377"&gt;&lt;param name="movie" value="http://www.youtube.com/v/AbWmOvYGm4E?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/AbWmOvYGm4E?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="377"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;h2&gt;Motivation&lt;/h2&gt;&lt;br /&gt;95% of the time you check the history of a file you’re looking for the changes you’ve done to a given method, aren’t you? Then you have to diff the files and locate the method yourself. It becomes a real nightmare if the method has been moved around in the file or if it has been heavily refactored.&lt;br /&gt;&lt;br /&gt;We developed “method history” as part of our &lt;a href="http://www.plasticscm.com"&gt;Plastic SCM&lt;/a&gt; version control system. Now we’re sharing it with Subversion users to enhance their day to day operations and also introduce them to our technology.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Send us feedback!&lt;/h2&gt;&lt;br /&gt;“Method history for Subversion” is still in beta so we really appreciate feedback through our forum (http://www.plasticscm.net).&lt;br /&gt;&lt;br /&gt;Right now it only works for C# code, but we will be adding Visual Basic and Java support soon.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What’s next??&lt;/h2&gt;&lt;br /&gt;“Method history for Subversion” is just in its first release and only available from Visual Studio. The next steps we’re considering are:&lt;br /&gt;&lt;li&gt;Add support for VB and Java and later C++.&lt;br /&gt;&lt;li&gt;Improve current C# support (it doesn’t work for properties yet).&lt;br /&gt;&lt;li&gt;Improving method search (being able to track renamed methods).&lt;br /&gt;&lt;li&gt;Eclipse plugin.&lt;br /&gt;&lt;li&gt;Git support!&lt;br /&gt;&lt;h2&gt;Note for Plastic SCM users&lt;/h2&gt;&lt;br /&gt;If you’re a Plastic SCM user (you’re using the Visual Studio plugin) and want to give a try to the SVN methodhist… contact us first because the two plugins collide and can’t be used on the same Visual Studio session (you’ve to use one, then close, then use another one). For SVN users… it doesn’t collide with ankhsvn!! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8761514921495396074?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8761514921495396074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8761514921495396074' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8761514921495396074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8761514921495396074'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2011/01/method-history-for-subversion-is-here.html' title='Method history for Subversion is here!'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_z6qpykplUvI/TSJFb1NBPOI/AAAAAAAABDw/LCG2noU4aS0/s72-c/picture00.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6842712599871759987</id><published>2010-12-28T19:54:00.005+01:00</published><updated>2010-12-29T00:00:11.753+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Designing a better user experience</title><content type='html'>A few days ago we were working on the new "method history" functionality and then we were making fun about the error message to pop-up when a user clicks in the middle of two methods (it doesn't find any method then) and tries to find the history of the "non-selected" method (well, we're the ones to blame here because probably a disabled menu would work better :P)&lt;br /&gt;&lt;br /&gt;But, you know, sometimes you would like to come up with very, very strong error messages... wouldn't you? :)&lt;br /&gt;&lt;br /&gt;So, considering today is the equivalent to April Fool's day down here... what about having some fun?? :)&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/QyvJI2nch24?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/QyvJI2nch24?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Ok, and now the &lt;span style="font-weight:bold;"&gt;real&lt;/span&gt; video (remember it is already available in the latest Plastic version, yes, history of a method!!):&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/v6BpEfjrnDI?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/v6BpEfjrnDI?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6842712599871759987?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6842712599871759987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6842712599871759987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6842712599871759987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6842712599871759987'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/designing-better-user-experience.html' title='Designing a better user experience'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-7827687296387895881</id><published>2010-12-28T16:00:00.003+01:00</published><updated>2011-06-13T12:14:08.101+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssl'/><title type='text'>SSL Enabled Plastic Connections - Reborn!</title><content type='html'>NOTE: This article is updated and maintained at this link &lt;a href="http://www.plasticscm.com/infocenter/technical-articles/kb-how-to-configure-plastic-scm-with-ssl-connectivity.aspx"&gt;here&lt;/a&gt;&lt;br /&gt;Here are the instructions on how to configure Plastic SCM release 3.0.187.x&lt;br /&gt;(x &gt; 0) to communicate using a secure SSL channel between the client and server.&lt;br /&gt;First download and unzip the following package. &lt;a href="http://www.plasticscm.com/externalcontent/PlasticSCM_SSL_ConfigFiles.zip"&gt;PlasticSCM_SSL_ConfigFiles.zip.&lt;/a&gt; Next we are going to copy these files to specific locations.&lt;br /&gt;&lt;h2&gt;Server setup:&lt;/h2&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Stop the Plastic SCM server service from windows services&lt;br /&gt;&lt;/li&gt;&lt;ol type="a"&gt;&lt;br /&gt; &lt;li&gt;In Windows goto Start-&amp;gt;Run-&amp;gt;type "services.msc" and find the Plastic Server service and stop it.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;li&gt;Navigate to your Plastic SCM server installation folder and rename your current remoting.conf file to remoting.conf.bck.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;From the zip file server folder extract the new remoting.conf to the Plastic server installation folder.&lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;The provided remoting.conf file will configure your server to use the default TCP port 8084 for non-SSL client connections and TCP port 8085 for SSL connections.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You can change the Listening ports above by editing the remoting.conf file.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;li&gt;A &lt;b&gt;plastic.key&lt;/b&gt; and a &lt;b&gt;plastic.cert&lt;/b&gt; files should be generated for the SSL to work, these files should be placed in the Plastic SCM server folder.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;to generate the files, we will use a certificate generator tool makecert.exe obtainable from the .NET SDK:&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bfsktky3%28VS.80%29.aspx"&gt;&lt;br /&gt;http://msdn.microsoft.com/en-us/library/bfsktky3%28VS.80%29.aspx&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;use the following command from within .NET SDK command Prompt: c:\&gt;&lt;b&gt;hostname&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;record the above hostname to use it in the following command to generate the certification files:&lt;/li&gt;&lt;br /&gt;&lt;li&gt;c:\&gt; &lt;b&gt;makecert -r -pe -eku 1.3.6.1.5.5.7.3.1 -n "CN=hostname" -sv c:\plastic.key c:\plastic.cert&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;see Figure 1&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Zniltlv3T1s/TFglByuhfxI/AAAAAAAAABM/wUeK_LAqSVM/s1600/fig1.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 87px;" src="http://3.bp.blogspot.com/_Zniltlv3T1s/TFglByuhfxI/AAAAAAAAABM/wUeK_LAqSVM/s320/fig1.jpg" alt="" id="BLOGGER_PHOTO_ID_5501187657560063762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;br /&gt; &lt;li value="6"&gt;If a pop up window “create Private Key password” is shown, choose None as illustrated in Figure 2&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Zniltlv3T1s/TFgemlpfEOI/AAAAAAAAAAs/vSzuAVOhYjc/s1600/fig2.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 351px; height: 242px;" src="http://4.bp.blogspot.com/_Zniltlv3T1s/TFgemlpfEOI/AAAAAAAAAAs/vSzuAVOhYjc/s400/fig2.jpg" alt="" id="BLOGGER_PHOTO_ID_5501180593123037410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;br /&gt; &lt;li value="7"&gt;Copy the generated plastic.cert and plastic.key from c:\ to the plastic scm server folder.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Edit the &lt;b&gt;remoting.conf&lt;/b&gt; file for the plastic server to point to the above generated certificate files; find the section and update it as illustrated below.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt; &lt;pre&gt;&amp;lt;channel type=&amp;quot;Codice.Channels.PlasticSecuredTcpChannel, &lt;br /&gt; plastictcpchannel&amp;quot; port=&amp;quot;8087&amp;quot; &lt;br /&gt; &lt;b&gt;sslCertificateFile=&amp;quot;C:\Program files\PlasticSCM\server\plastic.cert&amp;quot; &lt;br /&gt; sslPrivateKeyFile=&amp;quot;C:\Program files\PlasticSCM\server\plastic.key&amp;quot&lt;/b&gt;; &lt;br /&gt; name=&amp;quot;secured&amp;quot;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;Start the Plastic server, and check the connections on the server machine to verify that server is listening on the right TCP ports, executing the following command from a command-prompt c:\&gt;&lt;b&gt;netstat –na –p TCP&lt;/b&gt; as illustrated on Figure 3&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Zniltlv3T1s/TFgfnUDb-2I/AAAAAAAAAA0/Tejd5qMJ1PM/s1600/fig3.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 176px;" src="http://3.bp.blogspot.com/_Zniltlv3T1s/TFgfnUDb-2I/AAAAAAAAAA0/Tejd5qMJ1PM/s400/fig3.jpg" alt="" id="BLOGGER_PHOTO_ID_5501181705091545954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Client setup:&lt;/h2&gt;&lt;br /&gt;To enable the Plastic SCM client to connect to the Plastic SCM server using SSL, first extract from client folder within the zip file, the file remoting.conf that should be extracted and placed in the Plastic SCM client installation folder.&lt;br /&gt;Complete the setup following the below steps:&lt;br /&gt;&lt;ol&gt;&lt;li value="6"&gt;re-run the Client configuration wizard, and point to the port that is used for SSL, in our case port 8085.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;edit the client.conf file adding the following line:&lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;&lt;strong&gt;&amp;lt;ServerProtocol&amp;gt;ssl&amp;lt;/ServerProtocol&amp;gt;&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;see Figure 4&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Zniltlv3T1s/TFgfxeougJI/AAAAAAAAAA8/377_EX2PZ1c/s1600/fig4.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 142px;" src="http://2.bp.blogspot.com/_Zniltlv3T1s/TFgfxeougJI/AAAAAAAAAA8/377_EX2PZ1c/s400/fig4.jpg" alt="" id="BLOGGER_PHOTO_ID_5501181879730995346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol&gt;&lt;li value="8"&gt;if you want to use the previous non SSL connection, you must remove the above added line in the client.conf file and re-run the Client configuration wizard, and point to the port that is used for non-SSL connections, in the default case port 8084.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The makecert.exe program is part of the Windows SDK, so Windows developers probably already have it. We found some easy instructions on doing this on another &lt;a href="http://pages.infinit.net/ctech/20041129-0607.html"&gt;blog post here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-7827687296387895881?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/7827687296387895881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=7827687296387895881' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7827687296387895881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7827687296387895881'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/08/ssl-enabled-plastic-connections-reborn.html' title='SSL Enabled Plastic Connections - Reborn!'/><author><name>Miller Auker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Zniltlv3T1s/TFglByuhfxI/AAAAAAAAABM/wUeK_LAqSVM/s72-c/fig1.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1900231001570293156</id><published>2010-12-24T05:39:00.013+01:00</published><updated>2010-12-27T16:16:12.928+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='configuration'/><title type='text'>Setting up two Plastic SCM installations on the same machine</title><content type='html'>A single machine can host multiple Plastic SCM installations -- that is, multiple instances of a repository server process, each with its own set of repositories. In this post, I'll address a specific case:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You have already installed Plastic SCM on a Windows machine. Now, you want to create a second Plastic SCM installation on that machine.&lt;/li&gt;&lt;/ul&gt;Here's the recipe:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;To provide a home for the second repository server process, "clone" the &lt;b&gt;server&lt;/b&gt; subdirectory within the Plastic SCM installation directory. For example, you can use Windows Explorer to Copy the &lt;b&gt;server&lt;/b&gt; directory, then Paste it in the same location. Rename the new "clone" to &lt;b&gt;server2&lt;/b&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You need to reconfigure the repository server process to listen on a different IP port (say, 8085). In the &lt;b&gt;server2&lt;/b&gt; directory, run the &lt;b&gt;configureserver&lt;/b&gt; program to make this change.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You might need to reconfigure Plastic SCM's connection to its database back-end, so that the second installation uses a different set of database files. Still in the &lt;b&gt;server2&lt;/b&gt; directory, see whether file &lt;b&gt;db.conf&lt;/b&gt; exists. If so, add a &lt;b&gt;&amp;lt;DatabaseSuffix&amp;gt;&lt;/b&gt; subelement to this XML-format file. For example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;DbConfig&amp;gt;   ...   &amp;lt;DatabaseSuffix&amp;gt;_s2&amp;lt;/DatabaseSuffix&amp;gt;   ...&amp;lt;/DbConfig&amp;gt;&lt;/pre&gt;&lt;br /&gt;If no &lt;b&gt;db.conf&lt;/b&gt; file exists, the repository server is using the default database back-end, Firebird, which is embedded in the repository server and requires no configuration file. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;You need to create a new Windows service for the second instance of the repository server process. Open a command prompt window in the &lt;b&gt;server2&lt;/b&gt; directory, and run this command:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;plasticd --installservice --servicename=PlasticServer2&lt;/pre&gt;&lt;br /&gt;Alternative: use the Windows command-line tool &lt;b&gt;sc&lt;/b&gt; ("service control"). Be sure to enter the entire command on a single line, and to leave a SPACE after each "=" character. For example:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;sc create PlasticServer2&lt;br /&gt;   binPath= "C:\Program Files\PlasticSCM"\server2\plasticd.exe&lt;br /&gt;   DisplayName= "Plastic Server 2"&lt;br /&gt;   start= auto&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Start the second repository server process:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;net start PlasticServer2&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Use Plastic SCM client software to remove the "cloned" repositories from the second Plastic SCM installation. (This is necessary &lt;i&gt;only&lt;/i&gt; if you're using Firebird embedded or SQLite and your databases are in the server's directory!!)  For example, using the CLI's command for removing a repository:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;cm rmrep myoldrepo@mymachine:8085&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1900231001570293156?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1900231001570293156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=1900231001570293156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1900231001570293156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1900231001570293156'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/setting-up-two-plastic-scm.html' title='Setting up two Plastic SCM installations on the same machine'/><author><name>John Posner</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-9126089270434380779</id><published>2010-12-23T20:00:00.005+01:00</published><updated>2011-04-03T21:34:28.549+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integrations'/><title type='text'>Plastic SCM Plug-in for Hudson CI</title><content type='html'>In this blog post we will go through the very basic steps to setup Plastic SCM Plug in for Hudson CI and do some builds.&lt;br /&gt;&lt;br /&gt;The Plastic SCM plug in developed for Hudson CI is basically an .hpi file which will be included in the HUDSON repository (working on it).&lt;br /&gt;&lt;br /&gt;However, you can download the plug in from this link: &lt;a href="http://updates.jenkins-ci.org/download/plugins/plasticscm-plugin/"&gt;Download_PlasticSCM_Plugin_for_Hudson&lt;/a&gt;&lt;br /&gt;Just unzip the hpi file into .hudson/plugins, restart the server, and it should work.&lt;br /&gt;For this Blog post my setup involves the following software:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;OpenSuse 11.1_x86&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Plastic SCM version 3.0.187.22&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hudson CI ver. 1.384 (also tried it with 1.398)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;gcc-c++ ver. 4.3 (use it for compiling the Hello World sample with Hudson)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Test files you can download from this link: &lt;a href="http://www.plasticscm.com/externalcontent/Blog/Hudson/TestFilesForHudsonBlog.zip"&gt;Download_Test_Files&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Create a Plastic workspace and extract the test files into the directory of the workspace.&lt;br /&gt;The test files are basically two files, a helloworld.cpp and a script file BuildHello that calls the g++ compiler and compiles helloworld.cpp. Add the files to Plastic SCM so they are controlled, as illustrated in figure1.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Zniltlv3T1s/TQZ9Ce6lrCI/AAAAAAAAADE/AW_pTBvMfQg/s1600/PlasticSCM_1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_Zniltlv3T1s/TQZ9Ce6lrCI/AAAAAAAAADE/AW_pTBvMfQg/s320/PlasticSCM_1.png" alt="" id="BLOGGER_PHOTO_ID_5550261072392727586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 1&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Now into Hudson:&lt;/strong&gt;&lt;br /&gt;Log into Hudson, in my setup: http://localhost:8080/&lt;br /&gt;&lt;br /&gt;Navigate to Manage Hudson--&gt;Manage plugins--&gt;Installed (choose Installed Tab)&lt;br /&gt;Illustrated in figure2&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Zniltlv3T1s/TQZ9ffJewiI/AAAAAAAAADM/7xo46V05daY/s1600/PlasticSCM_2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_Zniltlv3T1s/TQZ9ffJewiI/AAAAAAAAADM/7xo46V05daY/s320/PlasticSCM_2.png" alt="" id="BLOGGER_PHOTO_ID_5550261570671395362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 2&lt;/p&gt;Plastic SCM Plug in should be in the list and enabled. (double checking here :-))&lt;br /&gt;Plastic SCM plug in does not differ much from the other Hudson Plug ins, so let us create a project and do some builds.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New Job--&gt;Job name: PlasticSCM_prj1--&gt;Build a free-style software project--&gt;OK&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Illustrated on figure 3&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Zniltlv3T1s/TQZ9fn2A-xI/AAAAAAAAADU/vPSt8ikvY7Y/s1600/PlasticSCM_3.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_Zniltlv3T1s/TQZ9fn2A-xI/AAAAAAAAADU/vPSt8ikvY7Y/s320/PlasticSCM_3.png" alt="" id="BLOGGER_PHOTO_ID_5550261573005671186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 3&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Next page we will configure Source Code Managment--&gt;Plastic SCM--&gt;Selector (Insert Plastic SCM workspace selector, fig 4+5)&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Selector can be obtained by many ways, this is just one of them.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;CD to your workspace directory ex.cd \millerwks\prj1\&lt;/li&gt;&lt;br /&gt;&lt;li&gt;execute &lt;strong&gt;cm showselector (cm ss)&lt;/strong&gt; ex.&lt;strong&gt; \&lt;/strong&gt;millerwks\prj1\&lt;strong&gt;cm ss&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Selector will be printed and could look like this example:&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;repository "default"&lt;br /&gt;path "/"&lt;br /&gt;br "/main"&lt;br /&gt;co "/main"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;On the same page under the &lt;strong&gt;Build&lt;/strong&gt;--&gt;Execute shell--&gt;Command (Insert the name of the shell script BuildHello, fig 6)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Save&lt;/li&gt;&lt;/ul&gt;Illustrated in  the next figures&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Zniltlv3T1s/TQZ9f9P6eyI/AAAAAAAAADc/EHc_TXUKYxE/s1600/PlasticSCM_4.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_Zniltlv3T1s/TQZ9f9P6eyI/AAAAAAAAADc/EHc_TXUKYxE/s320/PlasticSCM_4.jpg" alt="" id="BLOGGER_PHOTO_ID_5550261578751441698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 4&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Zniltlv3T1s/TQZ98S3cW1I/AAAAAAAAADk/d2o3XYptMHo/s1600/PlasticSCM_5.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_Zniltlv3T1s/TQZ98S3cW1I/AAAAAAAAADk/d2o3XYptMHo/s320/PlasticSCM_5.png" alt="" id="BLOGGER_PHOTO_ID_5550262065590721362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 5&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Zniltlv3T1s/TQZ98mS7jbI/AAAAAAAAADs/Z7WqGs4JvNw/s1600/PlasticSCM_6.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_Zniltlv3T1s/TQZ98mS7jbI/AAAAAAAAADs/Z7WqGs4JvNw/s320/PlasticSCM_6.png" alt="" id="BLOGGER_PHOTO_ID_5550262070806285746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 6&lt;/p&gt;&lt;br /&gt;And now we are ready to do a "manual build" without triggers, so go ahead and push the button Build Now as indicated in fig 7.&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Zniltlv3T1s/TQZ-lFEAZ0I/AAAAAAAAAD0/3uk_uA6FoVQ/s1600/PlasticSCM_7.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_Zniltlv3T1s/TQZ-lFEAZ0I/AAAAAAAAAD0/3uk_uA6FoVQ/s320/PlasticSCM_7.png" alt="" id="BLOGGER_PHOTO_ID_5550262766259955522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 7&lt;/p&gt;&lt;br /&gt;Well, after pushing the Build Now (for many times), I get Build failed which is not cool! lets try to find out what is causing the failing of this build.&lt;br /&gt;In the Build History on the left I entered into the latest build, and clicked on Concole Output. see fig 8.&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Zniltlv3T1s/TQZ-lToPE6I/AAAAAAAAAD8/hlhPFoV2KzA/s1600/PlasticSCM_8.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_Zniltlv3T1s/TQZ-lToPE6I/AAAAAAAAAD8/hlhPFoV2KzA/s320/PlasticSCM_8.png" alt="" id="BLOGGER_PHOTO_ID_5550262770170008482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 8&lt;/p&gt;&lt;br /&gt;Ok, cannot find the build script Buildhello, checking figure 1 with figure 6, I inserted the name of the script wrongly, Buildhello instead of the correct Build&lt;strong&gt;H&lt;/strong&gt;ello. So I go to the configuration of the project within Hudson and fix the name, as in fig 9.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Zniltlv3T1s/TQZ-l9rjEmI/AAAAAAAAAEE/gBvNuvR2i-k/s1600/PlasticSCM_9.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_Zniltlv3T1s/TQZ-l9rjEmI/AAAAAAAAAEE/gBvNuvR2i-k/s320/PlasticSCM_9.png" alt="" id="BLOGGER_PHOTO_ID_5550262781458190946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 9&lt;/p&gt;&lt;br /&gt;A manual build now and things looks much better, fig 10 + 11&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Zniltlv3T1s/TQZ_IxEd54I/AAAAAAAAAEM/hBUB8bgl8M4/s1600/PlasticSCM_10.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_Zniltlv3T1s/TQZ_IxEd54I/AAAAAAAAAEM/hBUB8bgl8M4/s400/PlasticSCM_10.png" alt="" id="BLOGGER_PHOTO_ID_5550263379368470402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 10&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Zniltlv3T1s/TQZ_bDdljVI/AAAAAAAAAEU/w-1mYLfL4AA/s1600/PlasticSCM_11.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_Zniltlv3T1s/TQZ_bDdljVI/AAAAAAAAAEU/w-1mYLfL4AA/s400/PlasticSCM_11.png" alt="" id="BLOGGER_PHOTO_ID_5550263693543312722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 11&lt;/p&gt;&lt;br /&gt;And it is by time we try if our hello program built correctly as illustrated in fig 12.&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Zniltlv3T1s/TQZ_bbPeCXI/AAAAAAAAAEc/UasCYEM7dqc/s1600/PlasticSCM_12.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_Zniltlv3T1s/TQZ_bbPeCXI/AAAAAAAAAEc/UasCYEM7dqc/s400/PlasticSCM_12.png" alt="" id="BLOGGER_PHOTO_ID_5550263699926550898" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;Figure 12&lt;/p&gt;&lt;br /&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-9126089270434380779?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/9126089270434380779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=9126089270434380779' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/9126089270434380779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/9126089270434380779'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/plastic-scm-plug-in-for-hudson-ci.html' title='Plastic SCM Plug-in for Hudson CI'/><author><name>Miller Auker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Zniltlv3T1s/TQZ9Ce6lrCI/AAAAAAAAADE/AW_pTBvMfQg/s72-c/PlasticSCM_1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-5902967138862437618</id><published>2010-12-23T00:18:00.004+01:00</published><updated>2010-12-23T00:52:11.665+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Announcing "method history"</title><content type='html'>We’re very happy to announce our newest Plastic SCM release (3.0.13) including one of the features we’re most proud of: method-based history!&lt;br /&gt;&lt;br /&gt;You can now select a method within Visual Studio, right click to show the context menu, and select “method history”. Plastic SCM will go through the file history and analyze the evolution of that specific method!!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Motivation&lt;/h2&gt;&lt;br /&gt;We have the impression that 95% of the time that you go through a file’s history, the reason is to check a specific method. That’s why we came up with this new feature. In fact “method history” is one of those things we’ve always wanted to implement, but of course we had to cover the SCM basics first. But, finally, it is here!&lt;br /&gt;&lt;br /&gt;“Method history” is our first step into a “programming language aware SCM”, a path we will be walking during the next months. We have a bunch of ideas to combine the “method history” parsing technology with &lt;a href="http://codicesoftware.blogspot.com/2010/07/move-support-in-diff.html"&gt;XDiff&lt;/a&gt; and &lt;a href="http://codicesoftware.blogspot.com/2008/08/xmerge-tool-to-handle-refactors.html"&gt;XMerge&lt;/a&gt;, to come up with a new line of Plastic SCM functionality in 2011.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Action, please!&lt;/h2&gt;&lt;br /&gt;First, here’s a short explanation of what “method history” is about, with graphics:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TRKH6tlLFSI/AAAAAAAABDM/1YxH3FgoJL8/s1600/methodhistexplained.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 362px; height: 400px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TRKH6tlLFSI/AAAAAAAABDM/1YxH3FgoJL8/s400/methodhistexplained.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553650733238916386" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Plastic  will look for the method in every revision of the item. Right now the search has some limitations (remember this is beta software):&lt;br /&gt;&lt;li&gt;We only parse C# code (Java is ready but not deployed;  VB and C++ will be next)&lt;br /&gt;&lt;li&gt;We don’t consider constructors yet (but we’re on it!)&lt;br /&gt;&lt;li&gt;We locate the method by name: next step will be finding renames too!.&lt;br /&gt;&lt;br /&gt;A few screenshots to see it in action:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TRKID7J9qcI/AAAAAAAABDU/Be34JOwwt3g/s1600/vstudio00.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 358px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TRKID7J9qcI/AAAAAAAABDU/Be34JOwwt3g/s400/vstudio00.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553650891501709762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TRKIHiP8iII/AAAAAAAABDc/KlpwbAtL2us/s1600/vstudio01.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 334px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TRKIHiP8iII/AAAAAAAABDc/KlpwbAtL2us/s400/vstudio01.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5553650953535391874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And finally a video (available in HD!):&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/v6BpEfjrnDI?fs=1&amp;amp;hl=en_US&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/v6BpEfjrnDI?fs=1&amp;amp;hl=en_US&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How to try&lt;/h2&gt;&lt;br /&gt;Simple: download the new release and install the Visual Studio "package" (not SCC, the newest package) and simply give it a try.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What's next?&lt;/h2&gt;&lt;br /&gt;As I mentioned, a ton of new stuff:&lt;br /&gt;&lt;li&gt; Being able to invoke "methodhistory" from the "annotate" views in the GUI&lt;br /&gt;&lt;li&gt; Eclipse support&lt;br /&gt;&lt;li&gt; Multiple language support + improved C#&lt;br /&gt;&lt;li&gt; Tracking refactored (moved) code between files... (wow! yes, we're on it! :P)&lt;br /&gt;&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-5902967138862437618?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/5902967138862437618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=5902967138862437618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5902967138862437618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5902967138862437618'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/announcing-method-history.html' title='Announcing &quot;method history&quot;'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/TRKH6tlLFSI/AAAAAAAABDM/1YxH3FgoJL8/s72-c/methodhistexplained.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6119842007309374085</id><published>2010-12-16T11:28:00.008+01:00</published><updated>2010-12-16T12:02:06.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='merging'/><category scheme='http://www.blogger.com/atom/ns#' term='branching'/><title type='text'>Why merge tracking matters</title><content type='html'>My goal with this blog post is to explain why merge tracking is so huge for all the Subversion, CVS and VSS users out there who still think “hey, I don’t care about the new SCM systems, I don’t need distributed development!”&lt;br /&gt;&lt;br /&gt;I know the &lt;a href="http://www.github.com"&gt;GitHubbers&lt;/a&gt; and &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial users&lt;/a&gt; and &lt;a href="http://www.plasticscm.com"&gt;Plastikers&lt;/a&gt; out there know what I’m talking about, but for the sake of clarity: the new DVCS systems are not only good because they’re distributed, but specially because they’re able to handle merging correctly. (Yes, I hear SVN users shouting: “we do have merge tracking after 1.5”, I know, I know, and I still say… switch to another system! :P.)&lt;br /&gt;&lt;br /&gt;So, I will try to explain why merge tracking is so important with a very simple scenario. Let’s go.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Change my code&lt;/h2&gt;&lt;br /&gt;I start with the following piece of code. We’re going to modify, in parallel, the fragment that is highlighted in blue.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TQnwTsQqqrI/AAAAAAAABCM/hLg3e2kKhIs/s1600/initialcode.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 393px; height: 246px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TQnwTsQqqrI/AAAAAAAABCM/hLg3e2kKhIs/s400/initialcode.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5551232236800092850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Basically we’re going to do what the next image shows: one of the developers is going to make a change to the code on the “main” branch (“master” in Git jargon) branch and the other coder will modify it on “featurebranch” branch. You can visualize your Git repo history using &lt;a href="http://codicesoftware.blogspot.com/2010/12/welcome-to-jungle.html"&gt;GitJungle&lt;/a&gt; which displays graphics exactly like this.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TQnwkP79GtI/AAAAAAAABCU/iRs97O7bIps/s1600/branchingscenario.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 399px; height: 377px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TQnwkP79GtI/AAAAAAAABCU/iRs97O7bIps/s400/branchingscenario.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5551232521254804178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Merging nightmare&lt;/h2&gt;&lt;br /&gt;Let’s go now and merge “featurebranch” back into “main”. This time we’re facing a “manual merge” because we’ve created &lt;a href="http://codicesoftware.blogspot.com/2010/11/live-to-merge-merge-to-live.html"&gt;a non-automatic conflict&lt;/a&gt;. It isn’t a very tough conflict to resolve, because only a small code fragment is involved. But in the real world, you sometimes have to deal with heavily modified files, and the merge isn’t so easy.&lt;br /&gt;&lt;br /&gt;Almost every 3-way merge tool out there works in the way pictured below (whether you’re using KDiff 3, WinMerge, Araxis Merge, Guiffy or the great Scooter Software’s BeyondCompare!).&lt;br /&gt;&lt;br /&gt;As you can see you’ll have to deal with the “base” (or common ancestor) and the two “contributors”. In our case: the file as it was at the beginning (base) and the two parallel changes made on different branches (destination, the revision made on  “main” and source, the revision made on “featurebranch”). &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TQnw1t7OaFI/AAAAAAAABCc/lPYa_edNrjc/s1600/mergetoolhowto.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TQnw1t7OaFI/AAAAAAAABCc/lPYa_edNrjc/s400/mergetoolhowto.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5551232821362583634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Because we modified exactly the same code, the 3-way merge tool shows something like the following:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TQnw-Txs0aI/AAAAAAAABCk/SL9bpxLLQh4/s1600/conflict.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 64px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TQnw-Txs0aI/AAAAAAAABCk/SL9bpxLLQh4/s400/conflict.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5551232968962134434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You, the developer or integrator, have to decide what goes into the result file. In this case the desired result is the following: we keep the new method introduced on “main” and the new loop variables introduced on “featurebranch”. And, the most important thing is: check the “merge arrow” that now is coming from “featurebranch” into “master”. It means the underlying SCM “knows” the branch is already merged. That’s the key.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TQnxFEeOT7I/AAAAAAAABCs/_rHGH_tQbWA/s1600/merged.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 273px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TQnxFEeOT7I/AAAAAAAABCs/_rHGH_tQbWA/s400/merged.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5551233085112995762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;And the fun starts when you merge again&lt;/h2&gt;&lt;br /&gt;What if know you need to make a new change on the same file on the “featurebranch”? Suppose the “merge” wasn’t so trivial and it took you quite a few minutes to figure out how to resolve it. I bet you wouldn’t like to go through it again, would you?&lt;br /&gt;&lt;br /&gt;Well, the magic of “merge tracking” is that it will allow you to make a new change on “featurebranch”, on the same file, and merge it again but without having to merge again the conflicts you already resolved! That’s the key and that’s something you didn’t have with older systems (and probably the main reason why you used to hate branching and merging before…).&lt;br /&gt;&lt;br /&gt;The following image shows how you’ve introduced a new change on the branch, and then it will be time to merge again.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TQnxP8XOSqI/AAAAAAAABC0/HYMT5AstEHM/s1600/newchange.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 194px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TQnxP8XOSqI/AAAAAAAABC0/HYMT5AstEHM/s400/newchange.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5551233271914711714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Common  ancestors – finding the root of all revisions&lt;/h2&gt;&lt;br /&gt;So, what will happen now when you try to merge from “featurebranch” back into “master”? Well, thanks to the “merge link” the system created before, some things will change.&lt;br /&gt;&lt;br /&gt;Look at the situation before doing our first merge. The contributors and the ancestor are highlighted. As you can see, the changeset (commit) tagged as BL189 is the common ancestor.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TQnxgPePDYI/AAAAAAAABC8/98csyz7FTFM/s1600/commonancestorfirstmerge.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 217px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TQnxgPePDYI/AAAAAAAABC8/98csyz7FTFM/s400/commonancestorfirstmerge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5551233551922302338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But now, when you’re going to merge again, the common-ancestor calculation will be different.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TQnxk-gF1EI/AAAAAAAABDE/k67UCvW_OjA/s1600/commonancestorsecondmerge.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 274px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TQnxk-gF1EI/AAAAAAAABDE/k67UCvW_OjA/s400/commonancestorsecondmerge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5551233633266029634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now the newly calculated “common ancestor”  for the merge is the recent changeset on the “featurebranch” (the contributor to the first merge). And the results of the first merge, including all the difficult-to-resolve conflicts, are recorded in the “main” branch contributor. With all the complicated work behind it, the merge algorithm can deal only with the new changes on “featurebranch”, and merge automatically for you.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Wrapping up&lt;/h2&gt;&lt;br /&gt;So, well, that’s all: I’m sure you’ve faced a situation like the above. Only having full merge tracking will save the day!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6119842007309374085?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6119842007309374085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6119842007309374085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6119842007309374085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6119842007309374085'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/why-merge-tracking-matters.html' title='Why merge tracking matters'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_z6qpykplUvI/TQnwTsQqqrI/AAAAAAAABCM/hLg3e2kKhIs/s72-c/initialcode.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6281576751293959987</id><published>2010-12-15T19:16:00.001+01:00</published><updated>2010-12-15T19:20:53.357+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>New manual: Introduction to Plastic SCM</title><content type='html'>I'm happy to announce that a new manual, &lt;b&gt;Introduction to Plastic SCM&lt;/b&gt;, has joined the product documentation set. It's available as a PDF, at&amp;nbsp;&lt;a href="http://www.plasticscm.com/releases/3.0.1/plastic_intro.pdf"&gt;http://www.plasticscm.com/releases/3.0.1/plastic_intro.pdf&lt;/a&gt; . This new "Intro" goes wide, but not deep. It's intended to give you a feel for what you can do with Plastic SCM, and for how (and how easily) you can accomplish SCM tasks with this great product!&lt;br /&gt;&lt;br /&gt;For the most part, this manual replaces the &lt;b&gt;Plastic SCM User's Guide&lt;/b&gt; (which also was called the "Introduction" in some places). But there &lt;i&gt;is&lt;/i&gt; some reference-level material, such as the details of the configuration language for the workspace's selector, that is not included in the new manual. So don't get rid of your "User's Guide" bookmark just yet!&lt;br /&gt;&lt;br /&gt;We love to get feedback on all our work, so please don't hesitate to send questions, complaints, and compliments to &lt;a href="mailto:doc@codicesoftware.com"&gt;doc@codicesoftware.com&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6281576751293959987?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6281576751293959987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6281576751293959987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6281576751293959987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6281576751293959987'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/new-manual-introduction-to-plastic-scm.html' title='New manual: Introduction to Plastic SCM'/><author><name>John Posner</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6217567961684690174</id><published>2010-12-11T16:04:00.008+01:00</published><updated>2010-12-13T09:45:50.829+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>A plugable Plastic SCM server</title><content type='html'>Yesterday I got a &lt;a href="http://www.plugcomputer.org"&gt;SheevaPlug development kit&lt;/a&gt; and the first idea that came to my mind was “hey, let’s put a Plastic server here!” I’m involved in a small robotics project at the university (I’m an associate professor in Computer Science, although robotics is not my area) and we’re evaluating different alternatives to use as the robot brain. But yes, before moving some engines I wanted to check if it was possible to set it up as a Plastic server.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The look and feel&lt;/h2&gt;&lt;br /&gt;Well, I just took a few pictures of the “pluggable computer” today, close to my BlackBerry so you can see how small it is.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TQXdJtJtc0I/AAAAAAAABBk/hMEGyejpLHs/s1600/kit.png"&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/TQXdJtJtc0I/AAAAAAAABBk/hMEGyejpLHs/s400/kit.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5550085274612888386" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Start up&lt;/h2&gt;&lt;br /&gt;First thing is to go and plug the “thing”. Then it is supposed to start up and get an IP address from your router. That’s what I did, then went to my router configuration and checked that a new box was online!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TQOTm5NxChI/AAAAAAAABBE/g4r6slFkq8c/s1600/dhcptable.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 162px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TQOTm5NxChI/AAAAAAAABBE/g4r6slFkq8c/s400/dhcptable.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5549441462253455890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then I followed the &lt;a href="http://plugcomputer.org/plugwiki/index.php/New_Plugger_How_To"&gt;instructions here&lt;/a&gt; to connect using ssh and log in. Cool!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Setting up&lt;/h2&gt;&lt;br /&gt;Follow the instructions step by step, all of them, including the one related to the time and date settings because otherwise you’ll end up in trouble when installing packages. It takes just a few seconds to go through all the commands. (I didn’t set the date at the beginning and jumped into mono installation and… ouch! Didn’t work!)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TQOT06pGMbI/AAAAAAAABBM/7IGxup-wYL8/s1600/cpuinfo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 366px; height: 400px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TQOT06pGMbI/AAAAAAAABBM/7IGxup-wYL8/s400/cpuinfo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5549441703154692530" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Installing mono&lt;/h2&gt;&lt;br /&gt;Again, really simple and &lt;a href="http://plugcomputer.org/plugwiki/index.php/Running_.Net_and_ASP.Net_applications"&gt;well documented here&lt;/a&gt;. It’s an old 2.0 Mono (so I will try to come up with a newer 2.8 in the coming days, but just stayed with this one for the initial tests).&lt;br /&gt;&lt;br /&gt;$ apt-get install mono-2.0-devel&lt;br /&gt;&lt;br /&gt;And then don’t forget to install the following one too (otherwise you won’t have remoting and Plastic won’t work!)&lt;br /&gt;&lt;br /&gt;$ apt-get install libmono-system-runtime2.0-cil&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TQOUBi5f2GI/AAAAAAAABBU/gWRu5fnSCTM/s1600/monoversion.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 106px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TQOUBi5f2GI/AAAAAAAABBU/gWRu5fnSCTM/s400/monoversion.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5549441920119330914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Copying Plastic&lt;/h2&gt;&lt;br /&gt;I just copied the Plastic SCM server binaries into /root/plastic/server and then run:&lt;br /&gt;&lt;br /&gt;$ mono plasticd.exe –console&lt;br /&gt;&lt;br /&gt;But… it didn’t work!&lt;br /&gt;&lt;br /&gt;First thing I hit was that the SQLite libraries installed by default on the box were not ok to work with the Mono wrapper.&lt;br /&gt;&lt;br /&gt;Ok, first things first. Here’s my db.conf to use a SQLite backend:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;DbConfig&amp;gt;&lt;br /&gt;  &amp;lt;ProviderName&amp;gt;sqlite&amp;lt;/ProviderName&amp;gt;&lt;br /&gt;  &amp;lt;ConnectionString&amp;gt;Data Source={0};Pooling=true&amp;lt;/ConnectionString&amp;gt;&lt;br /&gt;&amp;lt;/DbConfig&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Installing SQLite&lt;/h2&gt;&lt;br /&gt;First I got the package and then installed gcc and make&lt;br /&gt;&lt;br /&gt;$ apt-get install wget&lt;br /&gt;$ apt-get install gcc&lt;br /&gt;$ apt-get install make&lt;br /&gt;$ wget http://67.18.92.124/sqlite-autoconf-3070400.tar.gz&lt;br /&gt;&lt;br /&gt;Then I built the sources with the following flags:&lt;br /&gt;&lt;br /&gt;$ CFLAGS=-DSQLITE_ENABLE_COLUMN_METADATA=1 ./configure &amp;&amp; make&lt;br /&gt;&lt;br /&gt;Then I just added the .libs path inside the SQLite src dir to the LD_LIBRARY_PATH (hey! I know it is not clean but I’m just doing a quick test!)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Starting up Plastic&lt;/h2&gt;&lt;br /&gt;I typed:&lt;br /&gt;&lt;br /&gt;$ LD_LIBRARY_PATH=/root/sqlite/sqlite-autoconf-3070400/.libs:/usr/lib:/root/plastic/server: mono plasticd.exe --console&lt;br /&gt;&lt;br /&gt;And it … started up!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TQOUZiLNQTI/AAAAAAAABBc/leL9Rj2V7JM/s1600/plasticstartedup.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 67px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TQOUZiLNQTI/AAAAAAAABBc/leL9Rj2V7JM/s400/plasticstartedup.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5549442332242034994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But then I connected from another machine and got a beautiful zlib related error. Why? Because Plastic wasn’t correctly loading zlib, so I did the following “fix” (from the server’s path):&lt;br /&gt;&lt;br /&gt;$ ln -s /usr/lib/libz.so.1 libz.so&lt;br /&gt;&lt;br /&gt;And then I restarted and everything worked!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Ideas&lt;/h2&gt;&lt;br /&gt;Well, I really love the idea of the “pluggable Plastic SCM server”. I’m using this one as a “spare mirror server” where I automatically push my changes from my laptop on checkin. The “plug” doesn’t have a lot of “disk space” (flash) but an external card can be plugged in or even an external hard drive. Or, even better, I’ll give it a try connecting the Plastic SCM server on it to an external MySQL database… Cool, isn’t it? I mean, for $99 you can have a really cheap mirror server (unless you’re a team with 100 developers or more but, hey!, then don’t be so cheap and buy a real backup!! :P)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6217567961684690174?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6217567961684690174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6217567961684690174' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6217567961684690174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6217567961684690174'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/plugable-plastic-scm-server.html' title='A plugable Plastic SCM server'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_z6qpykplUvI/TQXdJtJtc0I/AAAAAAAABBk/hMEGyejpLHs/s72-c/kit.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1345901581753125366</id><published>2010-12-10T14:13:00.006+01:00</published><updated>2010-12-10T16:05:32.658+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Welcome to the jungle!</title><content type='html'>Note to readers: I strongly recommend reading this post while listening &lt;a href="http://www.youtube.com/watch?v=4ioIylqRPXU"&gt;this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And now... for those about to Git… we salute you!  We’ve just released &lt;a href="http://www.plasticscm.com/labs/gitjungle.aspx"&gt;GitJungle&lt;/a&gt;, a small, beautiful Git repository browser using our &lt;a href="http://www.plasticscm.com/features/visualization.aspx"&gt;Plastic SCM Branch Explorer&lt;/a&gt; (BrEx) visualization technology that basically lets you look at your Git repo from… well, a different angle.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How to download it&lt;/h2&gt;&lt;br /&gt;Simply go to our just released &lt;a href="http://www.plasticscm.com/labs/gitjungle.aspx"&gt;labs page&lt;/a&gt;, read a little bit more about it and then download the binaries (remember you will need Mono installed if you’re a Linux or Mac OS X user).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How to use it&lt;/h2&gt;&lt;br /&gt;I feel I don’t have to explain you how to clone a git repo but for the sake of completeness here are the instructions to view a repo from GitJungle:&lt;br /&gt;&lt;br /&gt;$ git clone https://github.com/jquery/jquery.git&lt;br /&gt;$ cd jquery.git&lt;br /&gt;$ gitjungle .&lt;br /&gt;&lt;br /&gt;And you get the beautiful graphics!!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TQIoDGw6XNI/AAAAAAAABAs/qy8T2uAybro/s1600/junglelinux.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 322px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TQIoDGw6XNI/AAAAAAAABAs/qy8T2uAybro/s400/junglelinux.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5549041724694355154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Action not words!&lt;/h2&gt;&lt;br /&gt;Watch it here:&lt;br /&gt;&lt;br /&gt;&lt;object width="470" height="364"&gt;&lt;param name="movie" value="http://www.youtube.com/v/bMuMipNM_mY?fs=1&amp;amp;hl=en_US&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/bMuMipNM_mY?fs=1&amp;amp;hl=en_US&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="470" height="364"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Warning - experiment zone ahead!&lt;/h2&gt;&lt;br /&gt;We've &lt;span style="font-weight:bold;"&gt;just released&lt;/span&gt; the GitJungle beta!  It's an experiment, it looks cool, it's usable, but it's not free of issues. If you find any… tell us!&lt;br /&gt;&lt;br /&gt;We've also used the same core technology behind the Plastic Branch Explorer, which shows history in a horizontal way instead of the vertical way GitK and other UIs use. Suggestions, hard critics and applauses are welcome!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Why are we releasing a Git tool?&lt;/h2&gt;&lt;br /&gt;We develop and sell &lt;a href="http://www.plasticscm.com"&gt;Plastic SCM&lt;/a&gt;, the most powerful commercial DVCS to date, the one with the best visualizations, multiple database backends, integrated ACL security, superior branching and merging support… ok, let's cut the marketing speech!!&lt;br /&gt;&lt;br /&gt;Yes, we do focus on Plastic.  However, developing GitJungle only took us a few days so, why not share it?&lt;br /&gt;&lt;br /&gt;But, answering the question - we're working on the next version of Plastic SCM and our goal is to make it more interoperable than ever, and two-way synchronization with Git will be one of the key features there.&lt;br /&gt;&lt;br /&gt;Also, Plastic SCM is a DVCS for companies and Git is totally focused on OSS projects, so why not collaborate? Git is teaching branching and merging concepts.  Also, it’s educating the entire world about distributed development.  This is fantastic for Plastic since we can expand and elaborate on these same concepts and practices while at the same time release a tool for software development companies based on these concepts (note: no, Plastic is not based on Git, we had a lot of hard work developing our own core, our own database layer, merge algorithms, security and all the funny things!).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TQIor-OFMWI/AAAAAAAABA0/YBdWV8ZPBuU/s1600/junglelinux2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 322px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TQIor-OFMWI/AAAAAAAABA0/YBdWV8ZPBuU/s400/junglelinux2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5549042426775417186" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1345901581753125366?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1345901581753125366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=1345901581753125366' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1345901581753125366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1345901581753125366'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/welcome-to-jungle.html' title='Welcome to the jungle!'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_z6qpykplUvI/TQIoDGw6XNI/AAAAAAAABAs/qy8T2uAybro/s72-c/junglelinux.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8884013475033080465</id><published>2010-12-09T23:34:00.006+01:00</published><updated>2010-12-09T23:44:20.682+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>Plastic Themes</title><content type='html'>Today I'll come up with a small tip and no, it won't be related to &lt;a href="http://codicesoftware.blogspot.com/2010/11/fixing-bug-branch-per-task-way.html"&gt;branching&lt;/a&gt;, &lt;a href="http://codicesoftware.blogspot.com/2010/11/fixing-bug-branch-per-task-way.html"&gt;merging&lt;/a&gt;, &lt;a href="http://codicesoftware.blogspot.com/2010/12/dvcs-for-everyone.html"&gt;replicas &lt;/a&gt;or &lt;a href="http://codicesoftware.blogspot.com/2010/11/linus-on-branching.html"&gt;patterns from the Linux kernel&lt;/a&gt;... promised!&lt;br /&gt;&lt;br /&gt;An easy one for a Thursday, cool?&lt;br /&gt;&lt;br /&gt;Ok, I'd love to have something as cool as the &lt;a href="https://tools.google.com/chrome/intl/en/themes/index.html"&gt;Chrome Theme Gallery&lt;/a&gt; but let's start small: do you know your current Plastic SCM GUI client is able to change the top banner so you can customize it and look cooler than any of your colleagues?&lt;br /&gt;&lt;br /&gt;Look, suppose you want to give your GUI a more Christmas-time style:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TQFapWu5XHI/AAAAAAAABAM/A7pMUUoHP94/s1600/howtochange.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 207px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TQFapWu5XHI/AAAAAAAABAM/A7pMUUoHP94/s400/howtochange.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548815882420575346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cool, isn't it?&lt;br /&gt;&lt;br /&gt;Ok, in order to change your banner:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; Create a beautiful png image (500x56 aprox)&lt;br /&gt;&lt;li&gt; Save it as banner.png at your Plastic client location&lt;br /&gt;&lt;li&gt; Restart the Plastic GUI and... you're done!&lt;br /&gt;&lt;br /&gt;In case you want to give a try to the Christmas banner, just download this one:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TQFbUQAdMpI/AAAAAAAABAc/VKWYH8AmjRU/s1600/banner.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 337px; height: 40px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TQFbUQAdMpI/AAAAAAAABAc/VKWYH8AmjRU/s400/banner.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548816619349553810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And now a quick look at my own private banner gallery... ;)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TQFbl5tlrzI/AAAAAAAABAk/3O3GvJHviGs/s1600/bannergallery.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 307px; height: 400px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TQFbl5tlrzI/AAAAAAAABAk/3O3GvJHviGs/s400/bannergallery.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548816922602483506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Well, I know you're all very busy "pros" doing important stuff with Plastic but... maybe you can give it a try, or even better, design and share your own!! :)&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-8884013475033080465?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8884013475033080465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8884013475033080465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8884013475033080465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8884013475033080465'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/plastic-themes.html' title='Plastic Themes'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/TQFapWu5XHI/AAAAAAAABAM/A7pMUUoHP94/s72-c/howtochange.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1156766377282405665</id><published>2010-12-07T22:46:00.009+01:00</published><updated>2010-12-07T22:58:10.495+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed'/><title type='text'>DVCS for everyone</title><content type='html'>Or, an illustrated guide to DVCS...&lt;br /&gt;&lt;br /&gt;As you’ve probably realized, I’ve started writing a series of blog posts, trying to be as “educational” as possible, and covering topics that range from &lt;a href="http://codicesoftware.blogspot.com/2010/11/version-control-timeline.html"&gt;the history of SCM&lt;/a&gt; to &lt;a href="http://codicesoftware.blogspot.com/2010/12/dvcs-explained-working-disconnected.html"&gt;branching patterns&lt;/a&gt; to the way in which the &lt;a href="http://codicesoftware.blogspot.com/2010/11/linus-on-branching.html"&gt;folks working on the Linux kernel make the best use of branching patterns&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My challenge for today is to try to turn the distributed development tiger into a friendly cat, unable to scare anyone. I know a good fraction of the readers are not really scared of DVCS at all (you Git, Hg, Plastic and Bazaar coders out there!) but since we released our &lt;a href="http://codicesoftware.blogspot.com/2010/11/building-plastic-scms-community-with.html"&gt;free version one month ago&lt;/a&gt; I receive more and more emails from people saying things like “hey, yes, I need better branching and merging but… what’s all this noise about being distributed?”.&lt;br /&gt;&lt;br /&gt;So here goes, I’ll try to give you a very easy explanation.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Version control scenarios&lt;/h2&gt;&lt;br /&gt;The main scenario you’ve been using while getting your hands dirty with Subversion, CVS, Perforce, Team Foundation Server or any of the beautiful version control systems out there is something like the following:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TP6rkEh5e9I/AAAAAAAAA-8/HaDrKeUVYP4/s1600/00centralized.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 280px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TP6rkEh5e9I/AAAAAAAAA-8/HaDrKeUVYP4/s400/00centralized.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548060427146591186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One server handling version control and a bunch of coders “checking in” to it. Easy and comfortable, isn't it?&lt;br /&gt;&lt;br /&gt;Then you’ve heard of “distributed development” at places like &lt;a href="http://www.github.com"&gt;github.com&lt;/a&gt; or at any of the open source projects that have migrated away from Subversion to Git during the last two years (like Ruby or Mono, just to mention a couple).&lt;br /&gt;&lt;br /&gt;If you’re a hard core OSS guy, you probably don’t have doubts about what it looks like, but if you’re working in a different environment (maybe small companies, corporations with tight rules and so on) maybe it is not so clear. The first idea that comes to my mind is something like the following:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TP6ruHtnBxI/AAAAAAAAA_E/E_Vu1KYPp44/s1600/01distributed.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 245px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TP6ruHtnBxI/AAAAAAAAA_E/E_Vu1KYPp44/s400/01distributed.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548060599799711506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The big change is that instead of having a central server, now everyone is “running his own version control system” (whether it is a real server or just a .git directory sitting on your working copy is not really important at this stage) and exchanging commits (checkins) in a peer-to-peer way.  If you want to, you can unplug from the network, leaving all those internet connection and speed issues behind. (Yes, I know is 2010 but we developers hate waiting and speed is never enough for us, is it?)&lt;br /&gt;But, for the more “centralized-all-under-control” of you out there… I bet this will look like a total mess! I hear you crying “what are you talking about? No central location? Are you crazy?”.&lt;br /&gt;&lt;br /&gt;Well, give me a second. Pure DVCS is about … well, about being totally distributed. But reality is a little bit different, so behind the &lt;a href="http://codicesoftware.blogspot.com/2010/03/dvcs-buzz.html"&gt;DVCS buzz&lt;/a&gt; we all end up having a “central copy” somewhere (or a “master copy” if you prefer). Kernel developers rely on Linus having the “real thing” and the rest of open source projects… well, rely on github.com or something similar, as the following figure shows:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TP6sUEvnvwI/AAAAAAAAA_M/E32mOms3Bc0/s1600/02distributed.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 245px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TP6sUEvnvwI/AAAAAAAAA_M/E32mOms3Bc0/s400/02distributed.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548061251837869826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So… don’t panic! There will be a master copy of your beloved source code!&lt;br /&gt;&lt;br /&gt;Developers can continue exchanging modifications in a peer-to-peer way, but at the end of the day they’ll be pushing their changes to the central location.&lt;br /&gt;&lt;br /&gt;In fact, if you think about it, the different “servers” around won’t be exact copies of each other (not required at least) but the important stuff will be safely stored on the master and replicated among the “developers” for greater safety. (An experimental branch will be only on your computer, or maybe shared by one of your colleagues. But the changes for 3.0 release will be shared by everyone and stored on the master server.)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Networking is key&lt;/h2&gt;&lt;br /&gt;If you look at the centralized vs distributed scenarios, you’ll clearly see there’s a big difference in terms of the networks where they operate. Centralized is great on LANs, speed is high, latency is low and…well, everything is great with a gigabit-per-second cable plugged to your laptop, isn’t it?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TP6sfdg4JoI/AAAAAAAAA_U/EnvRH888CSo/s1600/03centralvsdistributednetwork.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 295px; height: 400px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TP6sfdg4JoI/AAAAAAAAA_U/EnvRH888CSo/s400/03centralvsdistributednetwork.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548061447465477762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Distributed development grew up because developers always need to work faster than the available network supports. Face it, working against a local repository on your machine is faster than accessing an office server, whether it’s LAN-based or Internet-based.&lt;br /&gt;&lt;br /&gt;(There are  a bunch of other reasons, too, basically related to branching and merging as I always try to explain, but, ok, speed plays its role.)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Don’t let them fool you...&lt;/h2&gt;&lt;br /&gt;You know what marketers do best… yes, try to fool all of us ;). I hope none of my marketing friends is listening but, you know, nowadays “distributed development” is a big word and everyone is trying to hop aboard the “distributed ship”.&lt;br /&gt;&lt;br /&gt;Let me explain: there are a few truly distributed version control systems out there: Git, Mercurial, Bazaar, Darcs from the Open Source world (yes, I know I’m missing your favorite one, &lt;a href="http://codicesoftware.blogspot.com/2010/11/version-control-timeline.html"&gt;I always do...&lt;/a&gt; ); and BitKeeper and Plastic SCM in the commercial dimension. (My beloved Plastic can work in centralized mode too… hey, yes, we’re flexible.). Period.&lt;br /&gt;&lt;br /&gt;But, “distributed” is cool, so a guy from the marketing department at company X stands up and says “we’re distributed too” without even changing a line of code of their ancient system. And I find myself having to explain why my system is distributed and the other is not… crazy!&lt;br /&gt;&lt;br /&gt;Well, a picture is worth a thousand words:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TP6syNy429I/AAAAAAAAA_c/R2HhI0_53VU/s1600/04stillcentralized.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 398px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TP6syNy429I/AAAAAAAAA_c/R2HhI0_53VU/s400/04stillcentralized.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548061769663568850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you take a centralized system and make it listen on a TCP port for clients connecting over the Internet… it is still a centralized system! Period. Ok, I feel better now.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Multi-site development&lt;/h2&gt;&lt;br /&gt;Well, some of you are probably thinking now “God! I just wanted to link some offices together, what is this guy talking about?”.&lt;br /&gt;&lt;br /&gt;And if you’re thinking that… you’ve probably heard about “multi-site”, haven’t you? Remember the extremely expensive ClearCase Multi-Site functionality? Wasn’t it great? Well, I’ve to admit I’d like to be able to charge as much as Rational did for it but, you know, we’re not in the 90s anymore. What good-old CC was able to do for a fortune is now available, for free or at a moderate cost.&lt;br /&gt;&lt;br /&gt;If you’ve got several teams working on different sites, then you’re most likely used to the following picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TP6s-9VNiaI/AAAAAAAAA_k/-GvHPafDIHI/s1600/05multisitecentral.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 315px; height: 400px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TP6s-9VNiaI/AAAAAAAAA_k/-GvHPafDIHI/s400/05multisitecentral.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548061988582427042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Just to clarify: the “cloud” is “The Internet” not a super-cool cloud computing thing.&lt;br /&gt;&lt;br /&gt;Well, here are the challenges: while developers at “Site A” enjoy the full speed of their LAN connection to their central server, the developers at “Site B” are jealous because they must access the server using slower connections, theyhave to wait… (and to make things even more dramatic, I drew the diagram using single-monitor desks for the folks at Site B… :D).&lt;br /&gt;&lt;br /&gt;Unless the two sites are connected by some sort of super-cool-fast connection, this setup will end up causing problems. It happened in the past, it happens today and it will happen tomorrow. And connections, nowadays, never seem to be fast or reliable enough. (ok, now I’m waiting for the comment from some guy at “mega-corp”, saying they have a trillion-bps connection that only costs half a million a year and everything just works. Thanks. Yes, we know you’re sooo rich.)&lt;br /&gt;&lt;br /&gt;The good news is that the same “technology” used to create distributed teams over the Internet (DVCS) is available to connect your distant offices and moving the “Site B” developers to the “premier league”.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TP6tH3DPyNI/AAAAAAAAA_s/dFl30QQYLf0/s1600/06multisite.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 260px; height: 400px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TP6tH3DPyNI/AAAAAAAAA_s/dFl30QQYLf0/s400/06multisite.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548062141515286738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Each site will have its own “central server” and then communication between sites will only happen when the “central servers” replicate changes back and forth. It can be done on demand, it can be done once a day, or it can be done continuously. The point is that “it can be done”.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Distributed is for you… yes it is!&lt;/h2&gt;&lt;br /&gt;If you’re still thinking distributed “is not for me”, let me try once more. Suppose you’re working on your centralized team with a centralized server but one day you feel like working from home (or going at the customer’s site to fix this really urgent bug -- you know, the kind of things real coders do). Then you’ll be like the guy in the following picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TP6tRmkqdaI/AAAAAAAAA_0/rwsde8WiREQ/s1600/07centralizedoninternet.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 367px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TP6tRmkqdaI/AAAAAAAAA_0/rwsde8WiREQ/s400/07centralizedoninternet.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548062308890736034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What’s the problem here? Well, you’ll be facing the same “slow-downs” that the folks at “Site B” had. Can you live with it? Ok, fine, but, wouldn’t it be better to use something better?&lt;br /&gt;&lt;br /&gt;(Please note I gave you a joystick so you can have some fun while waiting for the SCM to finish pushing bits through the Internet :P).&lt;br /&gt;&lt;br /&gt;Even on a centralized team it would be great to have the freedom to go offline sometimes, wouldn’t it? And that’s basically what the next picture is all about:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TP6tY2ecHPI/AAAAAAAAA_8/wQ-E-2OwM_Q/s1600/08distributedcoder.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 375px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TP6tY2ecHPI/AAAAAAAAA_8/wQ-E-2OwM_Q/s400/08distributedcoder.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548062433418681586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You’ll end up checking in locally, being able to create branches, check differences, walk the history and so on. And you’ll push changes back to the central server only when you feel like doing it… (maybe while you try the latest GT5 after a long day of work… ok, just kidding!).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Short guide through DVCS essentials&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;I won’t try to come up with a full description about distributed version control operations because I’ve already done that in the past (check &lt;a href="http://codicesoftware.blogspot.com/2010/03/distributed-development-for-windows.html"&gt;http://codicesoftware.blogspot.com/2010/03/distributed-development-for-windows.html&lt;/a&gt; and &lt;a href="http://codicesoftware.blogspot.com/2008/07/distributed-software-development.html"&gt;http://codicesoftware.blogspot.com/2008/07/distributed-software-development.html&lt;/a&gt;). But I think is a good idea to wrap up with a quick explanation of the main operations, so that newcomers to distributed feel it is not hard at all.&lt;br /&gt;&lt;br /&gt;While the main “version control” operations are “checkin” and then probably “branch and merge”, the main distributed operations are: clone, pull and push. And they’re depicted in the following diagram:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TP6tnEpvrGI/AAAAAAAABAE/C8AEW9Xd4PY/s1600/09shortguide.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 384px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TP6tnEpvrGI/AAAAAAAABAE/C8AEW9Xd4PY/s400/09shortguide.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5548062677742365794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Basically, you start with an empty repository and then clone it from somewhere else.&lt;br /&gt;&lt;br /&gt;Then you’d like to get the new changes someone put on the central server, wouldn’t you? You’ll use a “pull” for that.&lt;br /&gt;&lt;br /&gt;And finally you’d like to make your changes available on the central server, too (or some peer’s copy). You’ll use “push” for that.&lt;br /&gt;&lt;br /&gt;I definitely skipped the funny part here: what happens if two developers made concurrent changes in two “replicas”? For now just consider they’ll be able to fix them before doing a “push” because the system will detect it and ask you to merge the changes. This should be enough until you fully jump into the gory details...&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-1156766377282405665?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1156766377282405665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=1156766377282405665' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1156766377282405665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1156766377282405665'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/dvcs-for-everyone.html' title='DVCS for everyone'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/TP6rkEh5e9I/AAAAAAAAA-8/HaDrKeUVYP4/s72-c/00centralized.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2660605717871914599</id><published>2010-12-07T14:50:00.064+01:00</published><updated>2011-06-12T23:55:51.804+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integrations'/><title type='text'>Plastic SCM Plug-In for Zutubi Pulse CI 2.0.x</title><content type='html'>This article is written as a guide to setup Plastic SCM version 3.0 with Pulse 2.0.x (x= 48 - 51)&lt;br /&gt;This article is updated and maintained at this link &lt;a href="http://www.plasticscm.com/infocenter/technical-articles/kb-how-to-configure-plastic-scm-with-zutubi-pulse.aspx"&gt;here&lt;/a&gt;&lt;br /&gt;We will go step by step through the process to setup Pulse, Plastic SCM and nant.exe to successfully make continues builds.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Installing&lt;br /&gt;&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Install Zutubi Pulse 2.0.x.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Install NAnt 1.90.&lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;Setup nant.exe to be in the PATH environment.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;li&gt;Install Plastic SCM 3.0&lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;While installing Plastic SCM, remember to choose to install Zutubi' Pulse Plug-In as illustrated in Figure 1.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Zniltlv3T1s/TP52PJgK7YI/AAAAAAAAAB0/gwfOT2rhwAw/s1600/FIG1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 238px;" src="http://3.bp.blogspot.com/_Zniltlv3T1s/TP52PJgK7YI/AAAAAAAAAB0/gwfOT2rhwAw/s320/FIG1.png" alt="" id="BLOGGER_PHOTO_ID_5548001793587998082" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 1: Plastic SCM zutubi Pulse Plug-in&lt;/p&gt;&lt;br /&gt;&lt;li&gt;Choose the Data folder of Pulse as illustrated in Figure 2 &lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;Default folder would be: c:\Documents and Settings\user\.pulse2\data&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Zniltlv3T1s/TP52mY1-0UI/AAAAAAAAAB8/QBbUZw6fHGU/s1600/FIG2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 238px;" src="http://4.bp.blogspot.com/_Zniltlv3T1s/TP52mY1-0UI/AAAAAAAAAB8/QBbUZw6fHGU/s320/FIG2.png" alt="" id="BLOGGER_PHOTO_ID_5548002192843002178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 2: Pulse Data path&lt;/p&gt;&lt;br /&gt;&lt;li&gt;After successfully installing the above programs, start Plastic Client and create a workspace.&lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;We will use the default repository that is created with the installer.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h2&gt;Setup the system&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;Plastic SCM&lt;br /&gt;&lt;/h2&gt;&lt;li&gt;Copy the Plastic SCM client cionfiguration file client.conf &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;From:&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;In Windows XP:&lt;/li&gt;&lt;br /&gt;&lt;p&gt;C:\Documents and Settings\&amp;lt;LoggedInUser&amp;gt;\Local Settings\Application Data\plastic&lt;/p&gt;&lt;br /&gt;&lt;li&gt;In Windows VISTA / 7:&lt;/li&gt;&lt;br /&gt;&lt;p&gt;C:\Users\&amp;lt;LoggedInuser&amp;gt;\AppData\Local\plastic&lt;/p&gt;&lt;/ol&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;To:&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;li&gt;C:\ProgramFiles\PlasticSCM\client&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;h2&gt;Pulse&lt;br /&gt;&lt;/h2&gt;&lt;li&gt;Start Pulse2 log-in and Add new Project. See Figure 3&lt;/li&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Zniltlv3T1s/TP523R8djSI/AAAAAAAAACE/iqClLDgr0pc/s1600/FIG3.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 146px;" src="http://3.bp.blogspot.com/_Zniltlv3T1s/TP523R8djSI/AAAAAAAAACE/iqClLDgr0pc/s320/FIG3.png" alt="" id="BLOGGER_PHOTO_ID_5548002483048910114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 3: Pulse add new project&lt;/p&gt;&lt;br /&gt;&lt;li&gt;Add new child template as illustrated in Figure 4&lt;/li&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Zniltlv3T1s/TP523q5661I/AAAAAAAAACM/e2BrwIzkCaA/s1600/FIG4.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 91px;" src="http://1.bp.blogspot.com/_Zniltlv3T1s/TP523q5661I/AAAAAAAAACM/e2BrwIzkCaA/s320/FIG4.png" alt="" id="BLOGGER_PHOTO_ID_5548002489749138258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 4: Pulse add new child project&lt;/p&gt;&lt;br /&gt;&lt;li&gt;Name the project as desired, and push next. See Figure 5&lt;/li&gt;&lt;br /&gt;&lt;li&gt;In select SCM Type page, select Plastic SCM, and push next. See Figure 6&lt;/li&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Zniltlv3T1s/TP5230zW_WI/AAAAAAAAACU/ZYvwRw6Rzys/s1600/FIG5.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 172px;" src="http://2.bp.blogspot.com/_Zniltlv3T1s/TP5230zW_WI/AAAAAAAAACU/ZYvwRw6Rzys/s320/FIG5.png" alt="" id="BLOGGER_PHOTO_ID_5548002492405972322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 5: Pulse project name&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Zniltlv3T1s/TP53iTDlmhI/AAAAAAAAACc/7g8Vmsai8yg/s1600/FIG6.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 128px;" src="http://3.bp.blogspot.com/_Zniltlv3T1s/TP53iTDlmhI/AAAAAAAAACc/7g8Vmsai8yg/s320/FIG6.png" alt="" id="BLOGGER_PHOTO_ID_5548003222081608210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 6: pulse choose Plastic SCM&lt;/p&gt;&lt;br /&gt;&lt;li&gt;Insert the Plastic SCM workspace selector into the Pulse template workspace selector box as illustrated in Figure 7.&lt;/li&gt;&lt;br /&gt;&lt;ol type="a"&gt;&lt;br /&gt;&lt;li&gt;You can view the selector from the Plastic SCM Client GUI, or from the command line cmd.exe window by executing the following command from within the local&lt;br /&gt;workspace folder: c:\workspaceprj01&amp;gt;&lt;b&gt;cm showselector&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;li&gt;Check the configuration from within Pulse, and push next button as illustrated in Figure 7&lt;/li&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Zniltlv3T1s/TP53iinyF4I/AAAAAAAAACk/MFqNE90HzXo/s1600/FIG7.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 186px;" src="http://1.bp.blogspot.com/_Zniltlv3T1s/TP53iinyF4I/AAAAAAAAACk/MFqNE90HzXo/s320/FIG7.png" alt="" id="BLOGGER_PHOTO_ID_5548003226259953538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 7: Pulse workspace selector and check&lt;br /&gt;&lt;/p&gt;&lt;li&gt;Select Project Type executable project from the drop down options list and push next. see Figure 8&lt;/li&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Zniltlv3T1s/TP53i9Io9gI/AAAAAAAAACs/i5W88pnJvXE/s1600/FIG8.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 166px;" src="http://4.bp.blogspot.com/_Zniltlv3T1s/TP53i9Io9gI/AAAAAAAAACs/i5W88pnJvXE/s320/FIG8.png" alt="" id="BLOGGER_PHOTO_ID_5548003233377089026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 8. Pulse project type executable&lt;br /&gt;&lt;/p&gt;&lt;li&gt;In the executable field insert nant&lt;/li&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Zniltlv3T1s/TP53jJ6RdhI/AAAAAAAAAC0/SfuQZZWcaYY/s1600/FIG9.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 175px;" src="http://2.bp.blogspot.com/_Zniltlv3T1s/TP53jJ6RdhI/AAAAAAAAAC0/SfuQZZWcaYY/s320/FIG9.png" alt="" id="BLOGGER_PHOTO_ID_5548003236806489618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 9: Pulse define executable, nant &lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Zniltlv3T1s/TP53jnXnk2I/AAAAAAAAAC8/pOmCQPijb1o/s1600/FIG10.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 236px;" src="http://2.bp.blogspot.com/_Zniltlv3T1s/TP53jnXnk2I/AAAAAAAAAC8/pOmCQPijb1o/s320/FIG10.png" alt="" id="BLOGGER_PHOTO_ID_5548003244714201954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;Figure 10: Successful builds with Pulse and nant through Plastic&lt;/p&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2660605717871914599?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2660605717871914599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=2660605717871914599' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2660605717871914599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2660605717871914599'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/plastic-scm-plug-in-for-zutubi-pulse-ci.html' title='Plastic SCM Plug-In for Zutubi Pulse CI 2.0.x'/><author><name>Miller Auker</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Zniltlv3T1s/TP52PJgK7YI/AAAAAAAAAB0/gwfOT2rhwAw/s72-c/FIG1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8995857254026420629</id><published>2010-12-03T17:44:00.009+01:00</published><updated>2010-12-08T04:14:14.622+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='integrations'/><title type='text'>Integrating Plastic SCM with Trac Issue Tracking</title><content type='html'>Hello, Plastic SCM user community! My name is John Posner, and I'm happy to introduce myself as a new member, having joined the Codice team as a technical writer. Actually, &lt;i&gt;the&lt;/i&gt; technical writer. I arrive with some pretty good SCM credentials, having spent most of the past two decades in this field. I was on the original team that developed Rational ClearCase, and was also the first tech writer at AccuRev. (AccuRev claimed to be "ClearCase done better" -- with some justification, IMHO. An AccuRev &lt;b&gt;stream&lt;/b&gt; managed to serve as both a &lt;b&gt;branch&lt;/b&gt; &lt;i&gt;and&lt;/i&gt; a &lt;b&gt;label&lt;/b&gt; – pretty cool, but hard for many people to understand and use.)&lt;br /&gt;&lt;br /&gt;I've spent the past couple of weeks learning Plastic SCM, and now I'd like to share some of what I've learned. Codice makes a big deal of "task-based development" and a "branch per task" approach, so that's one of the areas I focused on. Since Codice doesn't have its own issue-tracking system (ITS), this approach can work only if Plastic SCM plays well with existing, popular ITSs. And since this sort of thing is pretty complex, I was hoping to find some juicy bugs -- one of a tech writer's greatest joys!&lt;br /&gt;&lt;br /&gt;I took a look at Codice's list of ITS integrations, currently eight of them, and decided that &lt;b&gt;Trac&lt;/b&gt; was in my comfort zone. This open-source ITS is built in Python, which I've used a lot over the past decade. (The Codice guys seem to be into Ruby for scripting, but I forgive them.) So I fired up my Windows 7 laptop, an HP Pavilion dv7, and jumped in.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Download Party!&lt;br /&gt;&lt;/h2&gt;Here's a list of the software I downloaded, all of it free:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Plastic SCM&lt;/b&gt; (&lt;a href="http://www.codicesoftware.com/"&gt;www.codicesoftware.com&lt;/a&gt;) – the new Community Edition is free, forever, for up to 15 users.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Python 2.6.x&lt;/b&gt; (&lt;a href="http://www.python.org/"&gt;www.python.org&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Python module &lt;b&gt;distutils&lt;/b&gt; (&lt;a href="http://pypi.python.org/pypi/setuptools/"&gt;pypi.python.org/pypi/setuptools&lt;/a&gt;) -- this module includes a very useful executable, &lt;b&gt;easy_install.exe&lt;/b&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Trac 0.12&lt;/b&gt; (&lt;a href="http://trac.edgewall.org/wiki/TracInstall/"&gt;trac.edgewall.org/wiki/TracInstall&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Python script that supports usage of Trac's "digest authentication" username-password scheme&lt;br /&gt;(&lt;a href="http://trac.edgewall.org/wiki/TracStandalone/"&gt;trac.edgewall.org/wiki/TracStandalone&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;XML-RPC plugin&lt;/b&gt; for Trac&lt;br /&gt;(&lt;a href="http://trac-hacks.org/wiki/XmlRpcPlugin/"&gt;trac-hacks.org/wiki/XmlRpcPlugin&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Subversion&lt;/b&gt; (I used an installer at &lt;a href="http://sourceforge.net/projects/win32svn/files"&gt;http://sourceforge.net/projects/win32svn/files&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Whoa – what's Subversion doing on that list? It turns out that the XML-RPC plugin code is stored in a Subversion repository -- go figure!&lt;br /&gt;&lt;br /&gt;In this age of Windows wizards, software installation is pretty straightforward, so here's just a brief outline of how I proceeded:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I installed Plastic SCM in the standard way, into the standard location C:\Program Files\PlasticSCM.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;I installed Python in the standard way, into the standard location C:\Python26.&lt;/div&gt;(OK, I confess: both Plastic SCM and Python were already installed on this machine when I started this little exercise.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I installed Python's distutils 0.6 module using the wizard in setuptools-0.6c11.win32-py2.6.exe. This places easy_install.exe in folder C:\Python26\Scripts.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;At a command prompt, I used this command to install Trac:&lt;/div&gt;&lt;span style="font-family: Courier New; font-size: 9pt;"&gt;easy_install Trac==0.12&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;As with distutils programs, Trac programs get placed in folder C:\Python26\Scripts.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;In a Web browser, I went to trac.edgewall.org/wiki/TracStandalone and copied this script for creating username-password entries, storing it as file trac_digest.py:&lt;/div&gt;&lt;span style="font-family: Consolas; font-size: 9pt;"&gt;&lt;br /&gt;&lt;pre&gt;from optparse import OptionParser&lt;br /&gt;# The md5 module is deprecated in Python 2.5&lt;br /&gt;try:&lt;br /&gt;    from hashlib import md5&lt;br /&gt;except ImportError:&lt;br /&gt;    from md5 import md5&lt;br /&gt;realm = 'trac'&lt;br /&gt;&lt;br /&gt;# build the options&lt;br /&gt;usage = "usage: %prog [options]"&lt;br /&gt;parser = OptionParser(usage=usage)&lt;br /&gt;parser.add_option("-u", "--username",action="store",&lt;br /&gt;    dest="username", type = "string",&lt;br /&gt;    help="the username for whom to generate a password")&lt;br /&gt;parser.add_option("-p", "--password",action="store",&lt;br /&gt;    dest="password", type = "string",&lt;br /&gt;    help="the password to use")&lt;br /&gt;parser.add_option("-r", "--realm",action="store",&lt;br /&gt;    dest="realm", type = "string",&lt;br /&gt;    help="the realm in which to create the digest")&lt;br /&gt;(options, args) = parser.parse_args()&lt;br /&gt;&lt;br /&gt;# check options&lt;br /&gt;if (options.username is None) or (options.password is None):&lt;br /&gt;    parser.error("You must supply both the username and password")&lt;br /&gt;if (options.realm is not None):&lt;br /&gt;    realm = options.realm&lt;br /&gt;&lt;br /&gt;# Generate the string to enter into the htdigest file&lt;br /&gt;kd = lambda x: md5(':'.join(x)).hexdigest()&lt;br /&gt;print ':'.join((options.username, realm,&lt;br /&gt;                kd([options.username, realm, options.password])))&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;It was a bit too soon to install the Trac XML-RPC plugin at this point, so I didn't. A little massaging of the Trac environment is required first.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Setting Up the SCM and ITS&lt;br /&gt;&lt;/h2&gt;With both the SCM and ITS systems installed, I set up some data to be used by their integration. Chances are you're like me: more familiar with Plastic SCM than with Trac. So I'll gloss over the Plastic SCM details and spend more time on the Trac details.&lt;br /&gt;&lt;br /&gt;To set up a Plastic SCM environment for the integration, I performed the following operations in Plastic SCM's beautiful, capable, speedy GUI: create a new repository; create a new workspace; create a few text files in the workspace; in the Items view, place the files under source control:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_UVmdzNxwo0I/TOVhIlmZllI/AAAAAAAAAAc/xKx4kkHYTS0/s1600/plas_add_dirtree.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="78" src="http://2.bp.blogspot.com/_UVmdzNxwo0I/TOVhIlmZllI/AAAAAAAAAAc/xKx4kkHYTS0/s320/plas_add_dirtree.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;... and in the Labels view, create label BL_01 and attach it to everything in sight:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_UVmdzNxwo0I/TOVhI1-8eyI/AAAAAAAAAAg/gsS7GicTkb8/s1600/plas_apply_label.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_UVmdzNxwo0I/TOVhI1-8eyI/AAAAAAAAAAg/gsS7GicTkb8/s1600/plas_apply_label.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I just had to illustrate those last two commands; they're right there when you need them, sitting at the top of their context menus. Sweet! (Another confession: to create files in the workspace, you need to go outside the Plastic SCM GUI.)&lt;br /&gt;&lt;br /&gt;Next, I set up a Trac issue-tracking environment in folder c:\nov9trac:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Go to the Python scripts folder, where the Trac executables were installed, and initialize a new environment:&lt;/div&gt;&lt;span style="font-family: Courier New; font-size: 9pt;"&gt;&amp;gt; cd C:\Python26\Scripts&lt;br /&gt;&amp;gt; trac-admin C:\nov9trac initenv&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Create a digest entry for user jjp (that's me), using the script I download in Step #5 above, and store it as a one-line text file&lt;/div&gt;&lt;span style="font-family: Courier New; font-size: 9pt;"&gt;&amp;gt; python trac_digest.py –-username=jjp –-password=any &amp;gt; auth_digest.txt&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Give myself permission to do just about anything in this Trac environment&lt;/div&gt;&lt;span style="font-family: Courier New; font-size: 9pt;"&gt;&amp;gt; trac-admin C:\nov9trac permission add jjp TRAC_ADMIN&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Start a Trac Web server for this environment, listening on port 8765 and using the one-entry digest as its username-password database. The command prompt window becomes the Trac Web server's console&lt;/div&gt;&lt;span style="font-family: Courier New; font-size: 9pt;"&gt;&amp;gt; tracd -–port=8765 --auth=nov9trac,auth_digest.txt,trac C:\nov9trac&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;With the Web server up and running, I fired up a Web browser and connected to the server. I made sure to enter a URL that included the exact hostname/portnumber combo that appeared in the Web server's startup console message:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_UVmdzNxwo0I/TOVhKk3RgMI/AAAAAAAAAA0/esvAAI6mco0/s1600/trac_transcribe_url.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="90" src="http://1.bp.blogspot.com/_UVmdzNxwo0I/TOVhKk3RgMI/AAAAAAAAAA0/esvAAI6mco0/s320/trac_transcribe_url.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A Trac intro page appeared, where I logged in as jjp (the only Trac user so far):&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_UVmdzNxwo0I/TOVhJyDiOtI/AAAAAAAAAAs/KpMcnqHZ2SQ/s1600/trac_login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="73" src="http://4.bp.blogspot.com/_UVmdzNxwo0I/TOVhJyDiOtI/AAAAAAAAAAs/KpMcnqHZ2SQ/s320/trac_login.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Then, I created some Trac issue records, called "tickets".&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_UVmdzNxwo0I/TOVhKB1NsTI/AAAAAAAAAAw/c1QM3QvK_HY/s1600/trac_newticket.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="85" src="http://4.bp.blogspot.com/_UVmdzNxwo0I/TOVhKB1NsTI/AAAAAAAAAAw/c1QM3QvK_HY/s320/trac_newticket.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;For Ticket #1, I chose the title &lt;b&gt;Alpha Project&lt;/b&gt;; for ticket #2, &lt;b&gt;Beta Project&lt;/b&gt;, and so on. (Inspired choices, huh?)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Setting Up the Integration&lt;br /&gt;&lt;/h2&gt;Just about all the work I had done so far was to set up the Plastic SCM and Trac environments separately. Now for the fun part: getting the systems to work together. The integration is based on a tried-and-true (that is, old) network communication technology: XML-RPC. Here's the basic idea:&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-left: 18pt;"&gt;&lt;i&gt;When a particular branch is selected in the BranchExplorer, Plastic SCM makes a remote procedure call (RPC) to the Trac server. The server returns field values from the Trac ticket that is associated with the branch.  &lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;Each Plastic SCM branch is associated with a Trac ticket, and each Trac ticket represents an engineering task. &lt;i&gt;Et voila&lt;/i&gt; (or the Spanish equivalent), "branch per task" is a reality.&lt;br /&gt;&lt;br /&gt;Setting up the integration was just as straightforward – configuring the Trac server to use XML-RPC, and establishing a protocol in Plastic SCM for associating branches with tickets/tasks. Here's how I enabled XML-RPC support in Trac:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;div&gt;I downloaded and installed Trac's XML-RPC plugin (which involved performing a Subversion checkout):&lt;/div&gt;&lt;span style="font-family: Courier New; font-size: 9pt;"&gt;&amp;gt; cd C:\Python26\Scripts&lt;br /&gt;&amp;gt; easy_install -Z -U http://trac-hacks.org/svn/xmlrpcplugin/trunk&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;I enabled the XML-RPC plugin by adding these lines to the end of the Trac environment's configuration file, C:\nov9trac\conf\trac.ini:&lt;/div&gt;&lt;span style="font-family: Courier New; font-size: 9pt;"&gt;[components]&lt;br /&gt;tracrpc.* = enabled&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;XML-RPC calls are to be made by an unauthenticated Trac user, named anonymous.  So I created this user and give him (her? it?) permission to make the calls:&lt;/div&gt;&lt;span style="font-family: Courier New; font-size: 9pt;"&gt;&amp;gt; python trac_digest.py -–username=anonymous –-password=X &amp;gt;&amp;gt; auth_digest.txt&lt;br /&gt;&amp;gt; trac-admin C:\nov9trac permission add anonymous XML_RPC&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;And here's how I turned on the Trac integration in Plastic SCM:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In the GUI, I selected &lt;b&gt;Issue Tracking&lt;/b&gt; in the top-level toolbar:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_UVmdzNxwo0I/TOVhJeIiZuI/AAAAAAAAAAk/9MnzDZGHfio/s1600/plas_issuetracking.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="93" src="http://3.bp.blogspot.com/_UVmdzNxwo0I/TOVhJeIiZuI/AAAAAAAAAAk/9MnzDZGHfio/s320/plas_issuetracking.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;In the Issue Tracking dialog, I (1) selected Trac as the issue tracking system; (2) specified a branch prefix, establishing the protocol that all Plastic SCM branches with names of the form &lt;b&gt;tkt&lt;span style="color: #4f81bd;"&gt;&lt;i&gt;NNN&lt;/i&gt;&lt;/span&gt;&lt;/b&gt; are to be linked with Trac ticket &lt;span style="color: #4f81bd;"&gt;&lt;b&gt;&lt;i&gt;NNN&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;; and (3) specified the URL of the Trac server – the same URL I used when creating the Trac tickets.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_UVmdzNxwo0I/TOXYLMlELsI/AAAAAAAAAA8/SV8y90fUX1g/s1600/plas_issuetracking_setup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="272" src="http://4.bp.blogspot.com/_UVmdzNxwo0I/TOXYLMlELsI/AAAAAAAAAA8/SV8y90fUX1g/s320/plas_issuetracking_setup.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To make sure that I'd done my work correctly, I (4) clicked the &lt;b&gt;Test Connection&lt;/b&gt; button (and held my breath). It worked the very first time – no kidding!&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2&gt;Using the Integration&lt;br /&gt;&lt;/h2&gt;Finally, it was time to test the integration between the Plastic SCM and Trac issue tracking systems! Using the BranchExplorer, I created a subbranch of /main, naming it &lt;b&gt;tkt0011&lt;/b&gt;. (Would those leading zeros cause a problem?) I refreshed the BranchExplorer display, and sure enough – the new subbranch was annotated with the title of Trac ticket #11: &lt;b&gt;Kappa Project&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_UVmdzNxwo0I/TOVhINu8OCI/AAAAAAAAAAY/-lstLrYwsSo/s1600/integ_ticket_name.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_UVmdzNxwo0I/TOVhINu8OCI/AAAAAAAAAAY/-lstLrYwsSo/s1600/integ_ticket_name.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;So far, so good!&lt;br /&gt;&lt;br /&gt;Next, I clicked &lt;b&gt;Show Extended Information&lt;/b&gt; in the BranchExplorer's toolbar, and then clicked &lt;b&gt;Edgewall Trac Extension&lt;/b&gt; in the extended info panel. Uh-oh, the panel was blank. Then I figured out that the BranchExplorer is not telepathic – I was &lt;i&gt;thinking about&lt;/i&gt; the &lt;b&gt;/main/tkt0011&lt;/b&gt; branch, but I hadn't &lt;i&gt;selected&lt;/i&gt; that branch. Clicking on the branch revealed a very nice extended information display:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_UVmdzNxwo0I/TOX8O8Sq41I/AAAAAAAAABA/nZmpGAQmXxo/s1600/integ_field_values.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="195" src="http://1.bp.blogspot.com/_UVmdzNxwo0I/TOX8O8Sq41I/AAAAAAAAABA/nZmpGAQmXxo/s320/integ_field_values.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And to get access to the actual Ticket #11, I double-clicked in the extended information panel:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_UVmdzNxwo0I/TOX8PVQzMAI/AAAAAAAAABE/YELs0sXdnKY/s1600/integ_full_ticket.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="128" src="http://4.bp.blogspot.com/_UVmdzNxwo0I/TOX8PVQzMAI/AAAAAAAAABE/YELs0sXdnKY/s320/integ_full_ticket.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;That's the integration – simple to set up and simple to use! &lt;br /&gt;&lt;br /&gt;I know what you're thinking: did I find any bugs in this facility? Sure I did! If Trac's Web server is not running, trying to launch the BranchExplorer causes the Plastic SCM GUI to hang.  I also thought of an enhancement: when looking at a ticket, the Trac user should be able to see what files have been created/changed for that task. It should be easy to implement, since it's just the set of revisions created on a particular Plastic SCM branch. That's one of the beauties of a branch-per-task approach. I'll try to get the Codice guys to address both these items. Bye for now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8995857254026420629?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8995857254026420629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8995857254026420629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8995857254026420629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8995857254026420629'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/integrating-plastic-scm-with-trac-issue.html' title='Integrating Plastic SCM with Trac Issue Tracking'/><author><name>John Posner</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_UVmdzNxwo0I/TOVhIlmZllI/AAAAAAAAAAc/xKx4kkHYTS0/s72-c/plas_add_dirtree.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-7250385252047162892</id><published>2010-12-02T17:53:00.005+01:00</published><updated>2010-12-02T23:44:19.662+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='distributed'/><title type='text'>DVCS explained - working disconnected</title><content type='html'>I recorded a short screencast/presentation explaining what distributed version control is about, focusing on disconnected development. Distributed development is much more than that, but let's start with a simple scenario that is very helpful for teams all sizes.&lt;br /&gt;&lt;br /&gt;I just focus on how a DVCS helps you working disconnected and allows you to share (push) your changes back to the main server.&lt;br /&gt;&lt;br /&gt;Hope it helps!&lt;br /&gt;&lt;br /&gt;&lt;object width="537" height="416"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rb3a3MlQVKA?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rb3a3MlQVKA?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="537" height="416"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-7250385252047162892?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/7250385252047162892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=7250385252047162892' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7250385252047162892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/7250385252047162892'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/12/dvcs-explained-working-disconnected.html' title='DVCS explained - working disconnected'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2361467882290875184</id><published>2010-11-29T22:55:00.003+01:00</published><updated>2010-11-29T22:58:59.756+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='branching'/><title type='text'>Linus on branching...</title><content type='html'>A few months ago, Linus Torvalds shared some interesting thoughts and concerns regarding the Git branching patterns being used in Kernel development.&lt;br /&gt;&lt;br /&gt;Since learning what Torvalds has to say is always enlightening, I wanted to delve into the points he mentioned, because they align pretty closely with the techniques we recommend with Plastic SCM. Obviously, the points apply to Git, Plastic SCM, and any other SCM with good branching support, too.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Linus’ words&lt;/h2&gt;&lt;br /&gt;This is what Linus wrote (I only extracted a fragment, for the complete text, go to  &lt;a href="http://lkml.org/lkml/2010/9/28/362"&gt;http://lkml.org/lkml/2010/9/28/362&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The real problem is that maintainers often pick random - and not at all stable - points for their development to begin with. They just pick some random "this is where Linus -git tree is today", and do their development on top of that. THAT is the problem - they are unaware that there's some nasty bug in that version.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Shooting a moving target&lt;/h2&gt;&lt;br /&gt;What is Linus talking about? Actually, it’s one of the very well-known issues with trunk development that &lt;a href="http://www.plasticscm.com/infocenter/quick-start/intro-task-driven-development.aspx"&gt;I described here&lt;/a&gt; in the section titled “don’t shoot moving targets!”.&lt;br /&gt;&lt;br /&gt;This problem hits “mainline/trunk pattern” followers hard, since they keep updating to  “what’s more recent”, probably &lt;a href="http://codicesoftware.blogspot.com/2010/11/live-to-merge-merge-to-live.html"&gt;due to fear of merging&lt;/a&gt;. Continuous integration delays the problem, but doesn’t solve it. But this problem can also hit those following a “feature branch” pattern, unless they follow all the rules.&lt;br /&gt;&lt;br /&gt;The problem they’re facing is shown in the following picture:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TPQh4OCeC4I/AAAAAAAAA-s/Wn-pdIEiQ7Q/s1600/youbranchhere.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 130px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TPQh4OCeC4I/AAAAAAAAA-s/Wn-pdIEiQ7Q/s400/youbranchhere.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5545094290924768130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The kernel team uses branches, but what if they’re using the “master” as an integration branch and they’re branching off commits that are not tagged? (As the picture shows).&lt;br /&gt;&lt;br /&gt;The problem is that the master branch can be used as an integration point and hence get commits that leave the branch in an intermediate, unstable state. (This is especially true when using fast forward merges on Git, which I don’t really like precisely due to this issue. But I guess Linus must be doing real merges because he DOES know how to use Git. :P) Then you branch from an unstable commit and… you end up in trouble!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Baselines are key&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;We had exactly the same issue with some teams using Plastic because they failed to understand the importance of baselines. Once your code is stable, tag it, label it, and create branches ONLY from this well-known point!&lt;br /&gt;That’s basically the rule of thumb: create baselines frequently (as many as you can) which of course must be fully tested. (That’s the time-consuming part, since integration is pretty fast nowadays with modern SCMs) and then CREATE BRANCHES ONLY FROM STABLE BASELINES, as the figure shows:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TPQiDMGqyjI/AAAAAAAAA-0/KsBtTt8-eyo/s1600/onlystablepoints.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 329px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TPQiDMGqyjI/AAAAAAAAA-0/KsBtTt8-eyo/s400/onlystablepoints.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5545094479384070706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This way if something fails on your task branch (feature branch) you know… it’s your fault!!, because all tests were fine on the baseline -- not just the fast integration ones (like the ones you can run on checkin with continuous integration tools) but also the slow ones that you use to validate a  release.&lt;br /&gt;Very easy rule of thumb, great savings!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2361467882290875184?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2361467882290875184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=2361467882290875184' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2361467882290875184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2361467882290875184'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/linus-on-branching.html' title='Linus on branching...'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_z6qpykplUvI/TPQh4OCeC4I/AAAAAAAAA-s/Wn-pdIEiQ7Q/s72-c/youbranchhere.png' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-6251302631331152038</id><published>2010-11-24T22:21:00.002+01:00</published><updated>2010-11-24T22:29:09.400+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Moved code detection</title><content type='html'>Since we &lt;a href="http://codicesoftware.blogspot.com/2010/11/building-plastic-scms-community-with.html"&gt;launched the Community Edition&lt;/a&gt; we've seen a huge increase in the number of downloads and also the number of teams jumping to Plastic all around the globe.&lt;br /&gt;&lt;br /&gt;While Plastic &lt;span style="font-weight:bold;"&gt;has always been free for education and open source&lt;/span&gt;, our main intention with CE is to reach small teams and help them in their transition to DVCS and &lt;a href="http://codicesoftware.blogspot.com/2010/08/branch-per-task-workflow-explained.html"&gt;parallel development&lt;/a&gt;. Most of the software companies out there have less than 15 users and they're exactly the ones we're targeting with CE.&lt;br /&gt;&lt;br /&gt;That being said, I wonder if all the new people using Plastic is aware of some of the really cool features we've implemented in 3.0. Do you know Plastic can detect moved code both in the diff tool and the merge tool??&lt;br /&gt;&lt;br /&gt;Check the following posts:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://codicesoftware.blogspot.com/2010/07/move-support-in-diff.html"&gt;Moved (and modified) code detection on diff&lt;/a&gt;&lt;br /&gt;&lt;li&gt; &lt;a href="http://codicesoftware.blogspot.com/2010/07/xmerge-to-merge-refactored-code.html"&gt;Moved (and modified) code detection during merge&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And, you know... tell your colleagues!!! :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-6251302631331152038?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/6251302631331152038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=6251302631331152038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6251302631331152038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/6251302631331152038'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/moved-code-detection.html' title='Moved code detection'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-5375876012550556972</id><published>2010-11-23T18:09:00.013+01:00</published><updated>2010-11-23T18:27:31.608+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scm'/><category scheme='http://www.blogger.com/atom/ns#' term='merging'/><category scheme='http://www.blogger.com/atom/ns#' term='branching'/><title type='text'>Live to merge, merge to live...</title><content type='html'>This blog post was initially &lt;a href="http://www.drdobbs.com/blog/archives/2008/12/live_to_merge_m.html"&gt;published back in 2008 at DDJ&lt;/a&gt; but since DDJ "Guru blogs" moved to the new location some images have been broken so I've decided to publish it again here.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Live to merge, merge to live...&lt;/h2&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TOv18kajBkI/AAAAAAAAA9E/8jErowwJ6SA/s1600/ridetolive.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 350px; height: 350px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TOv18kajBkI/AAAAAAAAA9E/8jErowwJ6SA/s400/ridetolive.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5542794187325507138" /&gt;&lt;/a&gt;As a professional programmer you’re familiar with a variety of programming languages, you know by heart the basics and the not so basics of data structures and algorithms. You are an expert working in your favorite IDE.  You master software patterns and you’re aware of the newest trends in agile methods. But there’s a useful tool in the programmer’s toolbox which is normally more feared than used: the merge tool! This article will explain, step by step, the very basics of merging and will explore the different merge types, their uses and advantages.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Fear of merging&lt;/h2&gt;&lt;br /&gt;So, you write code, don’t you? And there’s a big chance that you don’t develop code in isolation, right? The code you write for your projects is normally scattered across a number of files. And, according to the Pareto Principle, 20% of the files in your project will receive 80% of the changes. You can try to trace a bad design smell here, you can try to refactor your code from top to bottom day and night, but, unfortunately, that’s just reality: if you and your team work on a project, there’s a huge chance you’ll end up editing the same files at the same time.&lt;br /&gt;&lt;br /&gt;For a number of projects out there this is a &lt;span style="font-weight:bold;"&gt;big problem&lt;/span&gt;. I’ve found a number of project managers and software designers trying to avoid concurrent modification wrestling their project plans and software designs. Wouldn't it be better if they were putting such efforts into making better software and finishing it on time?&lt;br /&gt;&lt;br /&gt;But, there’s an ancestral fear behind this behavior: the arcane fear of merging. “Hey, if you and me modify the same file... we’ll have to reconcile all our changes!!”. And of course, they assume it will be a painful and error prone process. “So, let's schedule our changes so that only one of us touches the file at the same time”. Ouch!&lt;br /&gt;&lt;br /&gt;Long ago software development was about lone eagles working alone. Now software development is about new languages, new tools, but at the end of the day it’s all about collaboration. And, avoiding collaboration doesn’t look like the smartest way of getting the best out of a team.&lt;br /&gt;Then, why are we initially so scared of merging our file changes? I find two key reasons:&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Lack of knowledge about how &lt;span style="font-weight:bold;"&gt;merge tools really work&lt;/span&gt;. People tend to think about code merging as some sort of magic process able to understand their code in order to combine changes. They don’t believe code can be always correctly understood by the system, and they don’t trust merge tools. Of course, under their assumptions, they’re right. The problem is &lt;span style="font-weight:bold;"&gt;merge tools don’t analyze or understand the code, they just apply some simple and clever rules&lt;/span&gt; to combine texts. The same way you trust your compiler will generate the right machine code, you should trust your merge tool.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Past bad experiences: merge tools and their big brothers the version control tools, have evolved during the last two decades. You’ve probably experienced some awkward issue with an old-fashioned (but still alive) version control system. Believing they’re still the same, is like still preferring coding in assembler because you don’t trust compilers.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Merging explained: automated conflicts&lt;/h2&gt;&lt;br /&gt;Do you know how a merge tool works? Let’s take a look at a very simple example. I won’t dive into the obscure algorithm details but just make a 1000ft flyby.&lt;br /&gt;&lt;br /&gt;Suppose we have a piece of code like the one at the next figure. Then you and I start making changes on the file at the same time. I make a couple of changes at the beginning of the file, and you add a new method below.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TOv2vM9waJI/AAAAAAAAA9M/nWz7i8XRFZo/s1600/fearofmerging-figure-1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 249px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TOv2vM9waJI/AAAAAAAAA9M/nWz7i8XRFZo/s400/fearofmerging-figure-1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5542795057204062354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Merging our changes manually is possible; it is a small file so it will just take a few minutes to do. It will require both of us to carefully look at our changes, but we’ll make it.&lt;br /&gt;&lt;br /&gt;Of course the picture changes if we’ve changed not one but 15 files in total, and up to 8 have been modified in parallel. Also, what would happen if, instead of only the two of us, 5 other people were working on the code at the same time? Yes, the process is doable, but it is time consuming, error prone and... boring!! I bet you have better things to do than manually combine files.&lt;br /&gt;&lt;br /&gt;But, what would a merge tool be able to do in our previous example?&lt;br /&gt;&lt;br /&gt;The tool will find an automatic conflict. Look carefully, our changes don’t collide, so what we would do manually would be just copy and paste my changes on the right part of your file or vice versa. It is very simple, but doing manually is error prone. This is exactly what a merge tool will do: just put the two set of changes together, with no possible collision or conflict.&lt;br /&gt;&lt;br /&gt;Normally, during a merge, the tool won’t even bother asking you to look into such a conflict; it is so simple it can solve it by itself. Of course, almost all the tools out in the market will allow you to set a mode in which all conflicts are reviewed by the user. It will just propose the changes, but you will be the one actually making the decision. Do you feel safer now? Ok, I bet after a week of manually reviewing trivial conflicts you’ll switch to automated mode.&lt;br /&gt;&lt;br /&gt;The next figure shows the results of the first merge and how a merge tool will combine the changes together to create the result (remember to click on the images to make them bigger).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TOv2_lkLRBI/AAAAAAAAA9U/I0oUEvXuSWE/s1600/fearofmerging-figure-2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TOv2_lkLRBI/AAAAAAAAA9U/I0oUEvXuSWE/s400/fearofmerging-figure-2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5542795338685563922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;You’re in trouble: manual conflicts&lt;/h2&gt;&lt;br /&gt;But, a developer’s life can be exciting and full of challenges, but it is not easy. So, eventually you’ll face a situation like the one depicted by the next figure:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TOv3Uawaw5I/AAAAAAAAA9c/z0m4uDHXae0/s1600/figure-3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 164px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TOv3Uawaw5I/AAAAAAAAA9c/z0m4uDHXae0/s400/figure-3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5542795696561374098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yes, know we’ve modified &lt;span style="font-weight:bold;"&gt;exactly the same code&lt;/span&gt; in one of our changes on the file, which makes things much more complicated.&lt;br /&gt;&lt;br /&gt;Now you can say “the tool can’t know the right solution!”.&lt;br /&gt;&lt;br /&gt;And you’re right. But, as I told you, the merge tool is not a wizard’s device; it is just &lt;span style="font-weight:bold;"&gt;a programmer’s tool&lt;/span&gt;. So, use it correctly and it will make your life much easier.&lt;br /&gt;&lt;br /&gt;The 4th figure shows a merge tool in action letting you decide what to do with your manual merge conflict.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TOv3w5dI5wI/AAAAAAAAA9k/0gBpnP6rqZk/s1600/figure-4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 145px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TOv3w5dI5wI/AAAAAAAAA9k/0gBpnP6rqZk/s400/figure-4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5542796185838348034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Under these circumstances the tool &lt;span style="font-weight:bold;"&gt;will always prompt the user&lt;/span&gt;. It will still save you precious time because it directly focuses you on the problem, but you’ll have to make the decision yourself.&lt;br /&gt;&lt;br /&gt;So, the merge tool will help you with automated conflicts not even asking you if you don’t want to (and honestly, it’s the right choice) and will ask you for help whenever it finds a manual conflict, which is basically a code fragment with changes made by two developers at the same time.&lt;br /&gt;&lt;br /&gt;The rule of thumb is very easy and will help you trust the tool because there’s no complex code analysis behind it.  It just looks into the lines of code: if only one contributor changed the fragment, it is an automatic conflict, otherwise, it is not trivial and the tool will ask.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;2-way and 3-way merging&lt;/h2&gt;&lt;br /&gt;What’s all this fuss about 2-way and 3-way merge tools? What are they all about? Ok, that’s what I’ll be explaining in the next few paragraphs.  It basically depends on the number of file versions you consider for your merge operations.&lt;br /&gt;&lt;br /&gt;So far, what you’ve seen is a 3-way merge in action:&lt;br /&gt;&lt;li&gt;You have the original file: it is the file as it was at the beginning before a specific set of changes were performed by our developers.&lt;br /&gt;&lt;li&gt;Then you have the file you have modified (remember the previous examples).&lt;br /&gt;&lt;li&gt;And finally the file I’ve modified.&lt;br /&gt;&lt;br /&gt;The result file is the one created after the changes are combined, the one at the bottom of the previous Figure (some tools prefer to hide the base file and just show the result one).&lt;br /&gt;&lt;br /&gt;I didn’t explain 2-way merge yet, but it’s not very complicated: it doesn’t consider the base file (also known as the common ancestor) for the merge.&lt;br /&gt;&lt;br /&gt;Is it better? Simply put: no, it isn’t. 3-way merge &lt;span style="font-weight:bold;"&gt;knows &lt;/span&gt;what you’ve added or removed to a file while 2-way merge can’t because it doesn’t know how the file was at the beginning.&lt;br /&gt;&lt;br /&gt;But, still, I’ve found developers who seem to be more used to 2-way merge tools. Let’s try to figure out why.&lt;br /&gt;&lt;br /&gt;Let’s go back to the original Java file, make a couple of very simple changes, and try to merge them with a two-way merge tool. Check the results on the next image.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TOv4RwIjlmI/AAAAAAAAA9s/hOQwHNzKnLY/s1600/figure-5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 157px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TOv4RwIjlmI/AAAAAAAAA9s/hOQwHNzKnLY/s400/figure-5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5542796750271780450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Do you see the problem? Basically, at each difference the 2-way merge tool won’t be able to decide whether it is modified or removed code, so it will always have to ask you!&lt;br /&gt;&lt;br /&gt;This may be good for the paranoid but, believe me, if you have to manage a good number of merges, you’ll end up wasting your time.&lt;br /&gt;&lt;br /&gt;The same two conflicts would be automatically solved by a 3-way merge tool.&lt;br /&gt;&lt;br /&gt;Of course, there’s a remark here: &lt;span style="font-weight:bold;"&gt;you can only use 3-way merge with a version control tool handling your code&lt;/span&gt;. Otherwise you won’t have access to the base file unless you have a very good memory or a crazy naming convention to keep your old files... &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Merge tracking, what’s in it for me?&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;If you’ve never heard of merge tracking... well, welcome to a whole new world. You’ve probably heard about it after Subversion 1.5 had been released. It has finally introduced merge tracking. It still has some caveats but it’s evolving in the right direction.  Many other systems out there have had merge tracking since long ago and most had it as part of the core product since their inceptions.&lt;br /&gt;Anyway, what does it mean?&lt;br /&gt;&lt;br /&gt;Merge tracking is deeply related to version control tools. You can run a file merge in isolation, but with merge tracking you rapidly enter the field of SCM (whether you want to translate it as Software Configuration Management or Source Code Management is just your choice).&lt;br /&gt;&lt;br /&gt;Merge tracking is also deeply related to branching, but I’ll try to postpone the topic as much as possible.&lt;br /&gt;&lt;br /&gt;Have a look at the next image. It represents the merge we’ve been running in the previous examples. We have the original file and then your changes and mine drawn as some sort of tree or graph.&lt;br /&gt;&lt;br /&gt;After I merge your changes with mine, a merge link is created telling the system I’ve merged your changes with mine. Also, I would like to highlight that during this change we modified exactly the same lines of code, so it will be a manual merge... Remember it because I’ll use it below.&lt;br /&gt;&lt;br /&gt;What’s the benefit? First: you know what you’ve done since your version control system takes care of this information. If you don’t have it, it’ll be harder to figure out what happened.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TOv4r41xqRI/AAAAAAAAA90/qaGR_qMfT7w/s1600/fearofmerging-figure-6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 153px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TOv4r41xqRI/AAAAAAAAA90/qaGR_qMfT7w/s400/fearofmerging-figure-6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5542797199285528850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But, let’s make another set of changes with our sample files. You can check how our tree looks like after the changes at the next figure.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TOv46YPhvhI/AAAAAAAAA98/RrW-A0I2-GM/s1600/fearofmerging-figure-7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 305px; height: 400px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TOv46YPhvhI/AAAAAAAAA98/RrW-A0I2-GM/s400/fearofmerging-figure-7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5542797448233205266" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You make a new modification and I make another one, and once the two of us are finished, I decide to merge your changes back with mine again.&lt;br /&gt;&lt;br /&gt;How does merge tracking help here? First of all, you remember I mentioned above our first merge was not automatic, don’t you? So, what’s the benefit of merge tracking? It will just merge the changes after the last merge happened, and you won’t have to solve the same manual conflict again. It greatly simplifies merging because it will let you focus on what’s new and you won’t have to merge all the old stuff.&lt;br /&gt;&lt;br /&gt;How does the merge tool know what to merge? In any three way merge you’ll need a base (or original file) and two contributors. In the sample highlighted at the previous figure the version control tool, with the help of merge tracking, will first try to find what’s the base file for the two changes we have (two revisions after all).&lt;br /&gt;&lt;br /&gt;And how does the system locate it? It will use your tree of versions and try to locate the closest parent revisions of the ones you’re trying to merge. The algorithm is known as nearest common ancestor and it is about finding the closest parent of a couple of nodes on a directed graph.&lt;br /&gt;&lt;br /&gt;In our sample the next figure shows the base or common ancestor for the two revisions we’re trying to merge.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TOv5MZEIKkI/AAAAAAAAA-E/tp2N0EEGJrE/s1600/fearofmerging-figure-8.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 292px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TOv5MZEIKkI/AAAAAAAAA-E/tp2N0EEGJrE/s400/fearofmerging-figure-8.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5542797757691472450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Look carefully, if the merge link wasn’t there, the parent would be the original revision, and then the merge tool would have to ask you again about the previously solved conflict (the code would be the same at the two revisions but different from the base).&lt;br /&gt;&lt;br /&gt;The merge arrow solves the problem allowing the underlying system to correctly identify which one is the new base for the merge.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Branching&lt;/h2&gt;&lt;br /&gt;I don’t know whether you realized or not but... we’ve been using branching!&lt;br /&gt;&lt;br /&gt;Look back at Figure 7 (two figures back). There’s a set of changes named your set of changes and a set of changes named my set of changes, right?&lt;br /&gt;&lt;br /&gt;Well, they’re actually two different branches which is nothing more than a couple of sets of revisions.&lt;br /&gt;&lt;br /&gt;They allow you to have parallel sets of changes, which is great when you’re doing development.&lt;br /&gt;&lt;br /&gt;It can’t be easier.&lt;br /&gt;&lt;br /&gt;I feel like a myth buster today, but as you can see, branching, one of the concerns for a number of developers, is not an issue at all.&lt;br /&gt;&lt;br /&gt;Unfortunately branch management is a nightmare with some old fashioned version control tools (think about CVS or SourceSafe, for instance, and even SVN until merge tracking becomes mainstream and stable), and that’s the reason behind all this fear...&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Wrapping up...&lt;/h2&gt;&lt;br /&gt;So far we’ve introduced all the basics (and not so basics) of merging. As you have noticed it is not a difficult task at all once you correctly understand the steps and contributors involved.&lt;br /&gt;&lt;br /&gt;Merging is one of the daily tools of a professional developer, but still unknown for a wide amount of users. Mastering the process will make them more productive and will allow projects to evolve faster.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-5375876012550556972?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/5375876012550556972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=5375876012550556972' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5375876012550556972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5375876012550556972'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/live-to-merge-merge-to-live.html' title='Live to merge, merge to live...'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_z6qpykplUvI/TOv18kajBkI/AAAAAAAAA9E/8jErowwJ6SA/s72-c/ridetolive.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1512289487440591229</id><published>2010-11-19T16:37:00.014+01:00</published><updated>2010-11-19T17:23:49.927+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practices'/><category scheme='http://www.blogger.com/atom/ns#' term='branching'/><title type='text'>Fixing a bug – the branch-per-task way</title><content type='html'>This is based upon a real story: I have a piece of code that launches an external application, but it wasn’t taking into account the possibility of having programs with spaces in their pathnames. Something like “c:\mypath\tool.exe” worked, but not something like “c:\program files\my tool\tool.exe”. To be able to launch such programs, we need to enclose the pathnames in quotes.&lt;br /&gt;&lt;h2&gt;The code&lt;/h2&gt;&lt;br /&gt;The original code was something like the following and obviously unable to deal with quotes.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TOaZ8CCOtSI/AAAAAAAAA7M/FF3fQgRfwr8/s1600/initialcode.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 210px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TOaZ8CCOtSI/AAAAAAAAA7M/FF3fQgRfwr8/s400/initialcode.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541285648143398178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Issue tracking system&lt;/h2&gt;&lt;br /&gt;First things first: we need to start with a task in an issue tracking system. Internally at Codice we use TTS (task tracking system), our web-based app for issues. (Yes, if you’re interested in it, I can tell you we’ll be releasing it soon.) The task I’ll be working on is 8651.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TOaaGP6ASWI/AAAAAAAAA7U/5BUGPuEk4lk/s1600/00ttstask.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 387px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TOaaGP6ASWI/AAAAAAAAA7U/5BUGPuEk4lk/s400/00ttstask.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541285823665686882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Creating a branch for the task&lt;/h2&gt;&lt;br /&gt;Nothing fancy here: just go to the BranchExplorer and create a new branch for the new task. The branch will be based at a well-known point, the latest known stable release.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TOaaPKdu04I/AAAAAAAAA7c/ZR8Nt6dOaZk/s1600/newbranchdialog.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 346px; height: 400px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TOaaPKdu04I/AAAAAAAAA7c/ZR8Nt6dOaZk/s400/newbranchdialog.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541285976823747458" /&gt;&lt;/a&gt;&lt;br /&gt;Next, I’ll switch my workspace to the new branch and start editing the code.&lt;br /&gt;&lt;h2&gt;Initial refactoring of the code&lt;/h2&gt;&lt;br /&gt;First, I’m going to modify the code to extract the argument parsing to a new class named ArgsParser.  I modify the original code as follows, to create an ArgsParser object and then use its members Program and Args.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TOaaYuC7LaI/AAAAAAAAA7k/SJ_mpeQyibQ/s1600/changesoncode.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 150px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TOaaYuC7LaI/AAAAAAAAA7k/SJ_mpeQyibQ/s400/changesoncode.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541286140993809826" /&gt;&lt;/a&gt;&lt;br /&gt;Just after I write this code, I checkin the changes, explaining it was a first step in my refactoring. REMEMBER: Because I’m using a task branch, I’m free to create as many checkins as I need, without affecting the other developers!&lt;br /&gt;&lt;h2&gt;Inspect the first change&lt;/h2&gt;&lt;br /&gt;Look at the BranchExplorer after the first checkin:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TOaajKm1iII/AAAAAAAAA7s/DUKSkoFiKEU/s1600/00branchcreated.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 165px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TOaajKm1iII/AAAAAAAAA7s/DUKSkoFiKEU/s400/00branchcreated.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541286320459319426" /&gt;&lt;/a&gt;&lt;br /&gt;Now I inspect the changes contained in the changeset on branch SCM8651. (It’s the second one you see in the picture. The first cset in a child branch is just there to keep track of its connection to the parent branch).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TOaauOgB2zI/AAAAAAAAA70/4m9Ht8HJeHQ/s1600/00diffcset.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 231px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TOaauOgB2zI/AAAAAAAAA70/4m9Ht8HJeHQ/s400/00diffcset.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541286510483069746" /&gt;&lt;/a&gt;&lt;br /&gt;And then I launch the Diff changeset content view, which contains two panes: the top pane shows all the files modified in a cset; the bottom pane shows the line-by-line differences for the currently selected file.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TOaa17rI0qI/AAAAAAAAA78/JJd_4ec6ffE/s1600/01diffcsetcontent.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 320px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TOaa17rI0qI/AAAAAAAAA78/JJd_4ec6ffE/s400/01diffcsetcontent.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541286642868343458" /&gt;&lt;/a&gt;&lt;br /&gt;It is a nice interface, isn’t it?&lt;br /&gt;&lt;h2&gt;We detect moved code!&lt;/h2&gt;&lt;br /&gt;But, wait, let’s take a deeper look at this diff. Do you notice the two buttons close to the difference and the line going down? The next figure shows these details.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TOaa_FFGF2I/AAAAAAAAA8E/AcDjrKURCfM/s1600/01diffcsetcontent-moved.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 274px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TOaa_FFGF2I/AAAAAAAAA8E/AcDjrKURCfM/s400/01diffcsetcontent-moved.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541286800011958114" /&gt;&lt;/a&gt;&lt;br /&gt;Scrolling down following the line, we get to the ArgsParser class implementation I talked about before:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TOabD6ip4fI/AAAAAAAAA8M/RFLYhtcC2B8/s1600/01diffcsetcontent-moved2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 295px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TOabD6ip4fI/AAAAAAAAA8M/RFLYhtcC2B8/s400/01diffcsetcontent-moved2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541286883082494450" /&gt;&lt;/a&gt;&lt;br /&gt;Plastic is able to track the moved code! It has figured out that the original lines of code have been moved to a method in the new ArgsParser class. Amazing, isn’t it??&lt;br /&gt;Even better is the second button over the difference. It runs a sub-diff. I click on it.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TOabKBDfROI/AAAAAAAAA8U/ywL-YKFvcK0/s1600/01diffcsetcontent-moved-subdiff.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 115px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TOabKBDfROI/AAAAAAAAA8U/ywL-YKFvcK0/s400/01diffcsetcontent-moved-subdiff.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541286987910038754" /&gt;&lt;/a&gt;&lt;br /&gt;The sub-diff shows how I’ve modified the code AFTER moving it to the new location, renamed the variable names, introduced some class members and so on. Plastic is still able to track it!!&lt;br /&gt;&lt;h2&gt;Completing the change&lt;/h2&gt;&lt;br /&gt;After my initial refactoring, the next step is to actually add the code that handles the quoted program pathnames.&lt;br /&gt;I’ll make this change and also add some unit tests to check that my code is fine.&lt;br /&gt;Once I’m done I can go to the Pending changes view in the Plastic GUI (or invoke View Changes in the Visual Studio plugin):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TOabVTXatFI/AAAAAAAAA8c/vGoWyJjA9yE/s1600/01secondcommit.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 203px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TOabVTXatFI/AAAAAAAAA8c/vGoWyJjA9yE/s400/01secondcommit.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541287181804024914" /&gt;&lt;/a&gt;&lt;br /&gt;and checkin three files.&lt;br /&gt;Now I look at how the BranchExplorer renders the current situation, with a new changeset being created containing the second change.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TOabjUWJnTI/AAAAAAAAA8k/9EVN_75cWFk/s1600/03brex.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 142px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TOabjUWJnTI/AAAAAAAAA8k/9EVN_75cWFk/s400/03brex.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541287422585314610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Inspecting the changes&lt;/h2&gt;&lt;br /&gt;One of the really cool features in Plastic is the ability to “walk changesets” inside branches, one by one. If you’re careful doing your checkins (as I have been here) your branches will tell a story, a very complete one, describing every change in detail and greatly helping reviewers. (Sometimes just seeing all the differences in one step is not as useful as walking the changes one by one, nor so easy to understand.)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TOabsOZjOBI/AAAAAAAAA8s/CABNyaVFBOc/s1600/05explorecsetsinbranch.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 162px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TOabsOZjOBI/AAAAAAAAA8s/CABNyaVFBOc/s400/05explorecsetsinbranch.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541287575607785490" /&gt;&lt;/a&gt;&lt;br /&gt;Here’s the view created by the Explore changesets in branch command:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TOab0fzoZ1I/AAAAAAAAA80/tuhZI5514f8/s1600/06explorecsetsinbranch.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 289px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TOab0fzoZ1I/AAAAAAAAA80/tuhZI5514f8/s400/06explorecsetsinbranch.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541287717719533394" /&gt;&lt;/a&gt;&lt;br /&gt;This view is very much like the one I used above, Diff changeset content, but with an extra dimension. Instead of exploring the contents of a single changeset, I can now explore all the changesets of my branch.&lt;br /&gt;As you can see, walking the changes one by one is very, very easy this way.&lt;br /&gt;&lt;h2&gt;For distributed developers – push your changes back&lt;/h2&gt;&lt;br /&gt;Once I’m done, I’ll run my test suite and then go to our issue tracking system and set the task as finished.&lt;br /&gt;Since I’m working with a local Plastic SCM server on my laptop (remember Plastic is a DVCS), the last step is pushing my branch back to the main server. I can use the BranchExplorer for this, too, using the Push this branch command.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TOacInVyk5I/AAAAAAAAA88/SdkGN3ALIPs/s1600/04pushbranchback.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 192px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TOacInVyk5I/AAAAAAAAA88/SdkGN3ALIPs/s400/04pushbranchback.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541288063339238290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h2&gt;Wrapping up&lt;/h2&gt;&lt;br /&gt;Now it is your turn to ask questions! Do you see the beauty of branch per task (or task oriented, if you prefer) development, using Plastic SCM’s powerful visual tools?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1512289487440591229?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1512289487440591229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=1512289487440591229' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1512289487440591229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1512289487440591229'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/fixing-bug-branch-per-task-way.html' title='Fixing a bug – the branch-per-task way'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_z6qpykplUvI/TOaZ8CCOtSI/AAAAAAAAA7M/FF3fQgRfwr8/s72-c/initialcode.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-4959824859553420230</id><published>2010-11-15T12:38:00.004+01:00</published><updated>2010-11-19T19:57:09.380+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scm'/><title type='text'>The version control timeline</title><content type='html'>Software Configuration Management (or source code management, for you real hard core coders) has been around for quite a few years, slowly moving from an almost manual-labor, dark prehistory to the shiny days of the DVCS (distributed version control system).&lt;br /&gt;&lt;br /&gt;You’ve all used at least one of the SCMs on the following list, but are you aware of how long the system you’re using has been around? Do you know the big names? Ok, that’s what I’ll try to supply with this short compilation.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The big picture&lt;/h2&gt;&lt;br /&gt;Look at the following diagram to find some of the main names in SCM history. Yes, I must be missing a good number of them, so don’t be shy: post a comment and I’ll update the list with your favorite one I missed :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TOEcCn2EutI/AAAAAAAAA68/X9eL0yV8RsQ/s1600/scmhistory.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 256px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TOEcCn2EutI/AAAAAAAAA68/X9eL0yV8RsQ/s400/scmhistory.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5539739848023522002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you’re still feeling good about using really “old irons”, I’ve added some pictures of how “cell phones” looked like when the SCMs were released, so you feel older and bloody outdated :). So yes, if you’re using CVS and still think it’s ok, look at the cell phone directly below “CVS” in the diagram. Do you feel like Gordon Gecko (Michael Douglas) in “Wall Street, Money Never Sleeps”, getting his brick-sized cell phone back as he leaves jail?&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Prehistory&lt;/h2&gt;&lt;br /&gt;There was a time when you stored your versions manually. Ok, for many of you this time wasn’t the 80s, but a few years back when you were at college naming your source-code archives exercise.zip, exercise-0.zip, exercise-good.zip, exercise-good-final.zip, and so on. Well, believe it or not, there was a time without real SCMs. It was always dark and people were living in caves.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;RCS&lt;/h3&gt;&lt;br /&gt;Then 1982 came and RCS was released. RCS is not a huge piece of technology, but you can still find it around in Unix distros. It is simple and straight to the point.&lt;br /&gt;&lt;br /&gt;One nice feature was that text changes were stored as deltas (pretty important, considering hard drives used to be small!). Deltas are still used nowadays by most SCMs.&lt;br /&gt;&lt;br /&gt;Some RCS drawbacks worth mentioning:&lt;br /&gt;&lt;li&gt;It is text only.&lt;br /&gt;&lt;li&gt;There is no central repository; each version-controlled file has its own repo, in the form of an RCS file, stored near the file itself. For example, the RCS file for /usr/project/foo.c is /usr/project/foo.c,v -- or a little better, in a subdirectory, /usr/project/RCS/foo.c,v.&lt;br /&gt;&lt;li&gt;Developers make private workspaces by creating symbolic links to RCS subdirectories – say, a symlink from /usr/home/john/RCS to /usr/project/RCS.&lt;br /&gt;&lt;li&gt;Naming of versions and branches is downright hostile. A version might be named 1.3, and a branch might be named 1.3.1, and a version on the branch might be named 1.3.1.7.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The classic era&lt;/h2&gt;&lt;br /&gt;In the SCM arena, the 90s are the classic era.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;CVS&lt;/h3&gt;&lt;br /&gt;It all started with CVS (Concurrent Version System) in 1990. It was able to handle multiple versions being developed concurrently on different machines and stored on a central server. The client-server age was upon us and developers took major advantage out of it.&lt;br /&gt;&lt;br /&gt;CVS was able to handle versions in a decent way. And it even supported branching and merging, though it wasn’t very good at doing it. That’s one of the reasons many people are scared about the “B” word and the “M” word.&lt;br /&gt;&lt;br /&gt;CVS didn’t track directories or filename changes (no refactoring allowed here!) and heavily relied on locking the whole repository. It is outdated now, but it worked in the 90s! (If you have it, just walk away and go on to something else!)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;PVCS&lt;/h3&gt;&lt;br /&gt;Polytron Version Control System (PVCS) was initially released in 1985 and then went through a series of mergers and acquisitions: Polytron, then Sage, Merant, and finally Serena.&lt;br /&gt;&lt;br /&gt;It’s an old, outdated system (initially designed to avoid branching/merging, using file-locking instead), but it’s still supported by Serena Software.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;ClearCase&lt;/h3&gt;&lt;br /&gt;In 1992, one of the major beasts in the SCM world was born. ClearCase was clearly ahead of its time and for some it is still the most powerful SCM ever built.&lt;br /&gt;Outdated, slow moving, over priced, and overly complicated to administer (in the early days, you had to generate a new Unix kernel to run the beast!), good-old CC isn’t the cool guy anymore -- you can hardly find anything positive about it on the net. But it’s still very good at branching and merging and still has unique features, such as its legendary “dynamic views”. While powerful, CC came from a time when disk space was scarce and networks were mostly LANs, with no concerns for things like latency or working through firewalls.&lt;br /&gt;&lt;br /&gt;Atria (the developer of ClearCase) merged with Pure (which was run by Reed Hastings, now the head of Netflix), was purchased by Rational and then IBM. And lo, the powerful CC stopped evolving. Well, it did evolve towards UCM in the early 2000s, which basically got rid of all the good things and left the weak ones, together with a huge price. Not very good idea.&lt;br /&gt;&lt;br /&gt;ClearCase is still one of the most-used SCMs in the corporate world, and certainly one of the revenue leaders.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;VSS&lt;/h3&gt;&lt;br /&gt;All the systems on my list had their moment and their clear advantages over previous systems. All except Visual SourceSafe. VSS was a weak system from day one, forcing developers to work with a “locking” approach, discouraging parallel development and creating a huge “fear of merging”.&lt;br /&gt;&lt;br /&gt;Slow, error prone, and utterly limited, VSS has been one of the most-used systems by Windows developers around the world. It is still in use, spreading pain and fear among good-hearted coders. But VSS was ahead of its time in one sense: it more properly belongs in the “dark SCM middle ages” (see below), instead of the classic era.&lt;br /&gt;&lt;br /&gt;VSS was entirely graphical, which was probably one of the reasons why it was widely adopted (along with being closely tied in with Visual Studio distributions).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Perforce&lt;/h3&gt;&lt;br /&gt;Perforce (P4) is one of the independent vendors who are totally focused on SCM, battling for the SCM gold. It is still one of the market leaders among mid-range companies with huge teams, and it has a strong presence in some market niches, such as the gaming industry.&lt;br /&gt;&lt;br /&gt;When it was released in the mid 90s, P4 was one of the most affordable and powerful systems to date. Worlds ahead of VSS and CVS, it was never at the level of Clearcase. But it was able to clearly beat CC in cost, performance, and ease of use.&lt;br /&gt;&lt;br /&gt;Being centralized and not very good with branching and merging (branches are implemented as subdirectory trees – didn’t they ever hear of metadata?) P4 doesn’t seem to be the best option for the future, but it is rock solid, mature, and well established. That will help it keep growing. At the time of this writing, P4 is the biggest code repository inside Google. Cool!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Enter the middle ages&lt;/h2&gt;&lt;br /&gt;A time of darkness, when most of the previous advances were lost and a degraded environment emerged…&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Subversion&lt;/h3&gt;&lt;br /&gt;Subversion (SVN) was conceived as “enhanced CVS” and its developers hit their target: it is better than CVS. Period.&lt;br /&gt;&lt;br /&gt;Although systems like ClearCase were perfectly capable of branching and merging, SVN educated an entire developer generation on the following dogma: fear branching and merging at all cost! This caused environmental damage that persists to this day, only starting to be healed by the new DVCS generation.&lt;br /&gt;&lt;br /&gt;SVN was close to P4 in features, and spread like crazy: more than 5 million developers around the world use SVN on a daily basis. Huge!&lt;br /&gt;&lt;br /&gt;SVN is extremely simple to use and evangelized everyone on the “mainline development model”. Error-prone (break the build!) on non-toy projects, it helped developed techniques like “continuous integration” as a way to “avoid integrations”. While the idea is good, most of the surrounding concepts were clearly limited by the tool itself.&lt;br /&gt;&lt;br /&gt;Linus himself raged against SVN when he first introduced Git back in 2006.&lt;br /&gt;During 2009 and 2010, all major open-source projects on earth gravitated away from SVN. A good sign of how wrong SVN was. But it’s still big and won’t die for ages.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;AccuRev&lt;/h3&gt;&lt;br /&gt;Born in an age of darkness, AccuRev was developed as an entirely new approach to source control. Its original way of doing things still seems new to lots of developers nowadays.&lt;br /&gt;&lt;br /&gt;AccuRev has strong support for branching (“streams” in its jargon) and merging. It has played a valuable role in helping the community move away from ClearCase and older tools like CVS.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Enter The Renaissance&lt;/h2&gt;&lt;br /&gt;After an age of darkness, an entirely new generation of SCM systems broke the established status quo. “SCM is a mature market” was the analysts’ conventional wisdom, but the new generation broke onto the scene and blew everything apart.&lt;br /&gt;&lt;br /&gt;Able to sever ties with the Internet and work unplugged (like cool rock stars), the new generation also excels at branching and merging, which was touted as the root of all evil during the “dark ages”. These new systems have successfully shifted the tide in the “branching/merging is good” direction.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;BitKeeper&lt;/h3&gt;&lt;br /&gt;BitKeeper was one of the innovators in the DVCS field. Designed by Larry McVoy (who previously worked on TeamWare, Sun’s internal version control system, built on top of SCCS, long evolution story here…) it rose to fame in 2002 when the Linux kernel development team started using it. A huge flame war started, with some developers complaining about using commercial tools for the world’s premier open-source project. &lt;br /&gt;&lt;br /&gt;Things only got worse in 2005 when fights with the core kernel developers grew even bigger. BitMover, the company behind the product, became concerned about people reverse-engineering their code. They discontinued support for open-source development and, ironically, thus prompted the creation of Git to fill the gap. &lt;br /&gt;For more, see &lt;a href="http://en.wikipedia.org/wiki/Bitkeeper"&gt;http://en.wikipedia.org/wiki/Bitkeeper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Git&lt;/h3&gt;&lt;br /&gt;Linus Torvalds, the father of Linux himself, designed and implemented the first version of Git (almost over a weekend, in pure-hacker style) to give his kernel developers an alternative to BitKeeper. Linus not only did the original design (simple, clean, genius), but helped promote the project with his unique style. (See &lt;a href="http://codicesoftware.blogspot.com/2007/05/linus-torvalds-on-git-and-scm.html"&gt;http://codicesoftware.blogspot.com/2007/05/linus-torvalds-on-git-and-scm.html&lt;/a&gt;.) &lt;br /&gt;&lt;br /&gt;During his famous speech, he heavily criticized (ok, insulted) CVS, SVN, and Perforce: “Subversion has been the most pointless project ever started”, “If you like using CVS, you should be in some kind of mental institution or somewhere else” and finally “Get rid of Perforce, it is sad, but it is so, so true”. &lt;br /&gt;&lt;br /&gt;You can love him or hate him, but he definitely made his point: the Middle Ages were over and now distributed systems were to rule the world, including removing the arcane fear of branching and merging, a key concept behind every DVCS.&lt;br /&gt;&lt;br /&gt;During the next years, every major open-source project migrated away from Subversion towards Git (and www.github.com provided a really huge, huge hosting service), making it the strongest and coolest SCM on earth.&lt;br /&gt;&lt;br /&gt;Git is based on a DAG structure (Directed Acyclic Graph), in which the main unit of change is the changeset. It implements full merge-tracking, but at the commit level instead of the individual file revision level (as, for instance, ClearCase does). It is extremely fast, with the only caveats being management of large binary files and the requirement to replicate repositories in their entirety.&lt;br /&gt;&lt;br /&gt;Git is clearly influenced by its kernel roots, and it’s obviously not the easiest thing on earth to use . But it will definitely be the SCM of the next decade. Check out &lt;a href="http://peepcode.com/products/git-internals-pdf"&gt;this awesome book&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Mercurial&lt;/h3&gt;&lt;br /&gt;Mercurial (Hg) was first announced on April 2005, also rushing in after the BitMover decision to remove support for the free version. Hg is also one of the key open-source DVCSs, along with Git. They can even work together quite well: Scott Chacon, the Git evangelist and one of the best SCM tech writers ever, wrote a nice integration -- see &lt;a href="http://mercurial.selenic.com/wiki/HgGit"&gt;http://mercurial.selenic.com/wiki/HgGit&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But Hg differs quite a bit from Git in terms of design. They share the concept of commit/changeset as the unit of change. Git implements this based on trees; each tree points to an older tree, and so on – hence the DAG. With Hg, every changeset is a flat list of files and directories, called a revlog.&lt;br /&gt;&lt;br /&gt;(For more on Hg, including internals, see &lt;a href="http://mercurial.selenic.com/wiki/Design"&gt;http://mercurial.selenic.com/wiki/Design&lt;/a&gt; and  &lt;a href="http://mercurial.selenic.com/wiki/DeveloperInfo"&gt;http://mercurial.selenic.com/wiki/DeveloperInfo&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Mercurial provides very strong merging, but it’s a bit different from other SCMs in its branching model: it has “named branches” but the preference is to create a new repository as a separate branch instead of hosting “many heads” inside a single one.&lt;br /&gt;&lt;br /&gt;Joel Spolsky has written an extremely good Hg tutorial (&lt;a href="http://hginit.com"&gt;hginit.com&lt;/a&gt;), which will help a lot of new users. Spolsky’s company, Fog Creek Software, has recently released Kiln, a commercial wrapper around the Hg core.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Darcs&lt;/h3&gt;&lt;br /&gt;Darcs (Darcs Advanced Revision Control System) is another open source attempt to get rid of CVS and Subversion. It started in 2002 and has been continuously evolving since then, reaching version 2.5 in November 2010.&lt;br /&gt;&lt;br /&gt;The major shortcomings of Darcs have been performance and its different way of handling history: instead of managing “snapshots” (commits or changesets) it manages patches, but in a way that makes traversing history difficult to understand.  (a current status may have not been a real snapshot).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Bazaar&lt;/h3&gt;&lt;br /&gt;Bazaar (bzr) is another open-source DVCS, which tries to provide some fresh air to the SCM world. While less used than Git and Mercurial, Bazaar features interesting features, such as the ability to work in a centralized way, if needed. (The “pure” DVCSs didn’t include central servers in their original design.)&lt;br /&gt;&lt;br /&gt;Bazaar was developed by Canonical (yes, the Ubuntu company!) and became GNU in early 2008.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Plastic SCM&lt;/h3&gt;&lt;br /&gt;Plastic is a DVCS system designed with commercial use in mind instead of open-source projects (unlike Git and Mercurial). Plastic was first released in late 2006, featuring strong branching and merging, including full merge tracking and rename support in merges.  It provides a highly graphical working environment, with many data-visualization capabilities, including a 3D revision tree). This distinguishes it from DVCSs that are oriented toward the hard-core, CLI-oriented hacker community.&lt;br /&gt;&lt;br /&gt;The motivation of Plastic’s developers (BTW, I’m one of them) is to target small and medium teams, closing the gap between expensive high-end systems like ClearCase and low-end ones like SVN.&lt;br /&gt;&lt;br /&gt;Plastic is built around the concept of parallel development, encouraging use of the &lt;a href="http://codicesoftware.blogspot.com/2010/11/fixing-bug-branch-per-task-way.html"&gt;“branch per task” pattern&lt;/a&gt; (feature branches). It can handle thousands of branches without breaking a sweat. Plastic is also distributed, supporting disconnected development, pushing and pulling of changesets on branches, and conflict resolution.&lt;br /&gt;&lt;br /&gt;A Community Edition of Plastic SCM was launched in November 2010.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Team Foundation Server&lt;/h3&gt;&lt;br /&gt;Microsoft, wanting to play a role in the SCM/ALM market, came up with Team Foundation Server (TFS). It’s an effort to heal the pain caused by its own VSS devil.&lt;br /&gt;While TFS is not very strong as a source-control system (kind of a new guy on the block, but using previous-generation technology), it comes fully packaged with a huge set of tools, from issue tracking to test management, in the pure “corporate-huge-integrated-thing-style”.&lt;br /&gt;&lt;br /&gt;You won’t be doing branching, merging, or DVCS if you go for it, but maybe your company already purchased it, along with an MSDN subscription.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-4959824859553420230?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/4959824859553420230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=4959824859553420230' title='102 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4959824859553420230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/4959824859553420230'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/version-control-timeline.html' title='The version control timeline'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/TOEcCn2EutI/AAAAAAAAA68/X9eL0yV8RsQ/s72-c/scmhistory.png' height='72' width='72'/><thr:total>102</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1241622292489081259</id><published>2010-11-12T16:12:00.004+01:00</published><updated>2010-11-12T16:30:31.211+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'>Concerto, a cross-platform .net profiler</title><content type='html'>I'm going to introduce the basics behind &lt;span style="font-style:italic;"&gt;Concerto&lt;/span&gt;, the cross-platform profiler we've developed to help us optimizing Plastic SCM.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;The problem&lt;/h2&gt;&lt;br /&gt;The problem we face is simple: we need to optimize our code in Mono/Linux, Mono/Solaris, Mono/Mac and .NET/Windows. The best way to find issues is to run exactly the same test on the same hardware but with different OS (ok, Mac and Solaris are slightly more complex, right?, but for the main ones, Linux/Windows, the same iron will work), and then check the results.&lt;br /&gt;&lt;br /&gt;We've been doing that for months but we always missed good comparable profiling data. You know, we do use things like &lt;a href="http://www.automatedqa.com/products/aqtime/"&gt;AQTime&lt;/a&gt; on Windows and then the &lt;a href="http://www.mono-project.com/Profiler"&gt;Mono Profiler&lt;/a&gt; on Linux but the generated data is not easy to compare.&lt;br /&gt;&lt;br /&gt;We needed a different tool.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Let's start the music&lt;/h2&gt;&lt;br /&gt;We had the following idea: let's instrument the code to add some instructions to measure the time spent on each method, this way we can use the same instrumented assemblies to run with .NET and Mono and then we can compare.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mono-project.com/Cecil"&gt;Cecil&lt;/a&gt; was there to help doing the tough instrumentation part, so I emailed our &lt;span style="font-style:italic;"&gt;resident Mono hacker&lt;/span&gt;: Dick Porter, and told him the idea. It took him a few hours to come up with a prototype, and has been refining it for the last week or so...&lt;br /&gt;&lt;br /&gt;And, since it was all about instrumenting code... Dick named it Concerto.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Welcome Concerto&lt;/h2&gt;&lt;br /&gt;Here is how the toy works:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;$ mono Instrument.exe --help&lt;br /&gt;Usage: Instrument [OPTIONS] assemblies&lt;br /&gt;Instrument one or more assemblies to&lt;br /&gt; record profiling data.&lt;br /&gt;If only one assembly is specified, &lt;br /&gt; instrumented assembly output name and&lt;br /&gt; data filename can be set.  Otherwise&lt;br /&gt; defaults are chosen for each assembly.&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;  -v, --verbose              Increase verbosity&lt;br /&gt;  -h, -?, --help             Show this message and exit&lt;br /&gt;  -f, --filename=VALUE       The filename where profiling data is written to&lt;br /&gt;                               at runtime&lt;br /&gt;  -o, --out=VALUE            The filename where the instrumented assembly is&lt;br /&gt;                               written&lt;br /&gt;  -p, --private              Include private types&lt;br /&gt;  -c, --class=VALUE          The specific class to instrument (can be given&lt;br /&gt;                               more than once)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Usage is pretty simple:&lt;br /&gt;&lt;br /&gt;1) run Instrument.exe on an assembly of your choice&lt;br /&gt;2) copy the output assembly back to your application, along with the generated Concerto-blah.dll&lt;br /&gt;3) run your application&lt;br /&gt;4) Look at the output file with mprof-decoder (or equivalent)&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;$ ls -l hello.* Concerto*dll *.mprof&lt;br /&gt;-rwxr-xr-x. 1 dick dick 13312 2010-11-08 14:06 Concerto.dll&lt;br /&gt;-rw-r--r--. 1 dick dick   384 2010-11-04 20:10 hello.cs&lt;br /&gt;-rwxr-xr-x. 1 dick dick  3072 2010-11-05 16:51 hello.exe&lt;br /&gt;&lt;br /&gt;$ mono Instrument.exe -vvv hello.exe&lt;br /&gt;Instrumenting hello.exe, creating hello.exe.ins&lt;br /&gt;The helper assembly is Concerto-hello_exe.dll&lt;br /&gt;Data shall be written to concerto-hello_exe.mprof&lt;br /&gt;Instrumenting class hello&lt;br /&gt;Instrumenting method System.Void hello::.ctor()&lt;br /&gt;Instrumenting method System.Int32 hello::DoStuff(System.Int32)&lt;br /&gt;Instrumenting method System.Void hello::DoMoreStuff()&lt;br /&gt;Instrumenting method System.Void hello::Main()&lt;br /&gt;Done.&lt;br /&gt;&lt;br /&gt;$ ls -l hello.* Concerto*dll&lt;br /&gt;-rw-r--r--. 1 dick dick 13824 2010-11-12 11:53 Concerto-hello_exe.dll&lt;br /&gt;-rwxr-xr-x. 1 dick dick 13312 2010-11-08 14:06 Concerto.dll&lt;br /&gt;-rw-r--r--. 1 dick dick   384 2010-11-04 20:10 hello.cs&lt;br /&gt;-rwxr-xr-x. 1 dick dick  3072 2010-11-05 16:51 hello.exe&lt;br /&gt;-rw-r--r--. 1 dick dick  3584 2010-11-12 11:53 hello.exe.ins&lt;br /&gt;&lt;br /&gt;$ mono hello.exe.ins&lt;br /&gt;Hello, world!&lt;br /&gt;1&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;&lt;br /&gt;$ ls -l hello.* Concerto*dll *.mprof&lt;br /&gt;-rw-r--r--. 1 dick dick 13824 2010-11-12 11:53 Concerto-hello_exe.dll&lt;br /&gt;-rwxr-xr-x. 1 dick dick 13312 2010-11-08 14:06 Concerto.dll&lt;br /&gt;-rw-r--r--. 1 dick dick   365 2010-11-12 11:54 concerto-hello_exe.mprof&lt;br /&gt;-rw-r--r--. 1 dick dick   384 2010-11-04 20:10 hello.cs&lt;br /&gt;-rwxr-xr-x. 1 dick dick  3072 2010-11-05 16:51 hello.exe&lt;br /&gt;-rw-r--r--. 1 dick dick  3584 2010-11-12 11:53 hello.exe.ins&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now let's inspect the output with the mprof-decoder&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;$ mono mprof-decoder.exe concerto-hello_exe.mprof&lt;br /&gt;&lt;br /&gt;------------------------------------------------&lt;br /&gt;Reporting execution time (on 4 methods)&lt;br /&gt;97.19% (0.007282s) hello.System.Void hello::Main()&lt;br /&gt; 2.48% (0.000186s) hello.System.Int32 hello::DoStuff(System.Int32)&lt;br /&gt;        1 calls from hello.System.Void hello::Main()&lt;br /&gt;        1 calls from hello.System.Void hello::DoMoreStuff()&lt;br /&gt; 0.33% (0.000025s) hello.System.Void hello::DoMoreStuff()&lt;br /&gt;        1 calls from hello.System.Void hello::Main()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------&lt;br /&gt;Reporting execution time by stack frame&lt;br /&gt;97.19% (0.007282s, 1 calls) hello.System.Void hello::Main()&lt;br /&gt;     2.33% (0.000169s, 1 calls) hello.System.Int32 hello::DoStuff(System.Int32)&lt;br /&gt;     0.34% (0.000025s, 1 calls) hello.System.Void hello::DoMoreStuff()&lt;br /&gt;        66.67% (0.000017s, 1 calls) hello.System.Int32 hello::DoStuff(System.Int32)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Finally an example of picking classes to instrument would look like this:&lt;br /&gt;&lt;br /&gt;Get the list of classes with verbosity level 2:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;$ mono Instrument.exe -vv plastictcpchannel.dll&lt;br /&gt;Instrumenting plastictcpchannel.dll, creating plastictcpchannel.dll.ins&lt;br /&gt;The helper assembly is Concerto-plastictcpchannel_dll.dll&lt;br /&gt;Data shall be written to concerto-plastictcpchannel_dll.mprof&lt;br /&gt;Instrumenting class Codice.Channels.ClientSinkProvider&lt;br /&gt;Instrumenting class Codice.Channels.ClientSink&lt;br /&gt;Instrumenting class Codice.Channels.PlasticBinaryServerFormatterSink&lt;br /&gt;Instrumenting class Codice.Channels.PlasticBinaryServerFormatterSinkProvider&lt;br /&gt;Instrumenting class Codice.Channels.PlasticTcpChannel&lt;br /&gt;Done.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pick a couple of classes to instrument:&lt;br /&gt;&lt;br /&gt;&lt;pre class="shell"&gt;&lt;br /&gt;$ mono Instrument.exe -vv -c&lt;br /&gt;  Codice.Channels.PlasticBinaryServerFormatterSinkProvider -c&lt;br /&gt;  Codice.Channels.ClientSinkProvider plastictcpchannel.dll&lt;br /&gt;Instrumenting plastictcpchannel.dll, creating plastictcpchannel.dll.ins&lt;br /&gt;The helper assembly is Concerto-plastictcpchannel_dll.dll&lt;br /&gt;Data shall be written to concerto-plastictcpchannel_dll.mprof&lt;br /&gt;Instrumenting class Codice.Channels.ClientSinkProvider&lt;br /&gt;Instrumenting class Codice.Channels.PlasticBinaryServerFormatterSinkProvider&lt;br /&gt;Done.&lt;br /&gt;&lt;/pre&gt;&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-1241622292489081259?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1241622292489081259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=1241622292489081259' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1241622292489081259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1241622292489081259'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/concerto-cross-platform-net-profiler.html' title='Concerto, a cross-platform .net profiler'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1153791810850310706</id><published>2010-11-08T23:42:00.007+01:00</published><updated>2010-12-05T12:33:20.096+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='branch explorer'/><title type='text'>Branch explorer tour</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.plasticscm.com/download/login.aspx"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 173px; height: 51px;" src="http://www.plasticscm.com/img/webel/download-button-com.png" border="0" alt="" /&gt;&lt;/a&gt;It's been a week since &lt;a href="http://codicesoftware.blogspot.com/2010/11/building-plastic-scms-community-with.html"&gt;we announced the Community Edition&lt;/a&gt; and a big number of developers have already downloaded and started to work with Plastic.&lt;br /&gt;&lt;br /&gt;People are coming from different SCMs and jumping into Plastic: developers with CVS background, experience with SVN, Mercurial, Git and even Clearcase and TFS. So, this is a really heterogeneous group.&lt;br /&gt;&lt;br /&gt;My intention today is to focus on one of the key features in Plastic: the branch explorer. This is to help the newcomers can really extract the best out of our SCM (our former users are already more than familiar with it, or anyone attending a demo).&lt;br /&gt;&lt;br /&gt;So I just recorded a short screencast showing some of the key functionalities within it. Almost everything is doable from the BrEx (as we call it internally), and you guys should get familiar with it!&lt;br /&gt;&lt;br /&gt;Here we go (I recorded it in high-res so configure your viewer accordingly):&lt;br /&gt;&lt;br /&gt;&lt;object width="614" height="475"&gt;&lt;param name="movie" value="http://www.youtube.com/v/rkIifV7RBdI?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/rkIifV7RBdI?fs=1&amp;amp;hl=en_US&amp;amp;hd=1&amp;amp;color1=0xe1600f&amp;amp;color2=0xfebd01" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="614" height="476"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1153791810850310706?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1153791810850310706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=1153791810850310706' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1153791810850310706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1153791810850310706'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/branch-explorer-tour.html' title='Branch explorer tour'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-3373411052104454057</id><published>2010-11-04T14:20:00.009+01:00</published><updated>2010-11-04T15:50:44.148+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Mylyn integration</title><content type='html'>One of or key goals with the new release is to continue improving Plastic SCM support for the Java/Eclipse ecosystem.&lt;br /&gt;&lt;br /&gt;The new release includes a number of important improvements on the core Eclipse integration (such us the new Synchronize view, the ability to directly import projects from Plastic SCM during workspace creation and revisited check-in functionality) and the totally new Mylyn integration to improve parallel development within Eclipse.&lt;br /&gt;The Mylyn integration represents a significant step for Codice as it will streamline parallel development for Eclipse users. &lt;br /&gt;&lt;br /&gt;&lt;h2&gt;New Mylyn integration&lt;/h2&gt;&lt;br /&gt;Mylyn is the task and application lifecycle management (ALM) framework for Eclipse and as such is all about creating a &lt;span style="font-weight:bold;"&gt;task-focused interface&lt;/span&gt; for developers. Plastic SCM is designed to implement a &lt;span style="font-weight:bold;"&gt;task-oriented&lt;/span&gt; cycle through extensive use of parallel development with branching and merging. It is clear that the two tools can team up perfectly to create a really strong task oriented environment.&lt;br /&gt;&lt;br /&gt;One of the Mylyn limitations when the underlying version control system has limited branching capabilities (as it happens with Subversion, CVS or Perforce) is the ability to correctly manage overlapping changes: What if two different tasks have to modify a colliding set of files? Mylyn, due to the SCM (Software Configuration Management) limitations, is unable to correctly handle the situation unless the changes on the task are committed prior to the switch to a different task. So, having simultaneous open tasks with pending changes is troublesome.&lt;br /&gt;&lt;br /&gt;The Plastic SCM Mylyn plugin resolves the issue by extending the basic Mylyn functionality and associating each task with a different Plastic branch, hence implementing &lt;span style="font-weight:bold;"&gt;real parallel development&lt;/span&gt; and powerful isolation between branches.&lt;br /&gt;&lt;br /&gt;As the following figure shows, when the developer activates a different task, the Plastic SCM Mylyn plugin is able to assist the user to create or switch to a different branch, associated to the mentioned task.&lt;br /&gt;&lt;br /&gt;Task to branch association can’t be simpler nor more effective than the way the new Mylyn plugin implements: the entire branch management is driven by the tool, assisting the user at every step.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TNKz5VE8C4I/AAAAAAAAA58/Q1mRT91gw7g/s1600/eclipse-mylyntasks-jira-switchtobranch.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TNKz5VE8C4I/AAAAAAAAA58/Q1mRT91gw7g/s400/eclipse-mylyntasks-jira-switchtobranch.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5535684689483533186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Plastic SCM integrates natively with a number of issue tracking and project management system like Atlassian Jira, FogBugZ, Mantis, VersionOne, Rally, Bugzilla and others. Now the integration and task visualization is also available from the Eclipse side as it is from the GUI. The following figure shows the Plastic SCM graphical user interface running on Ubuntu Linux integrated with Jira.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TNK0Jr1WviI/AAAAAAAAA6E/h7aYO4TIIag/s1600/jiraintegrationfromplastic.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 248px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TNK0Jr1WviI/AAAAAAAAA6E/h7aYO4TIIag/s400/jiraintegrationfromplastic.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5535684970470096418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Eclipse plugin enhancements&lt;/h2&gt;&lt;br /&gt;There are several new features on the core Eclipse plugin for Plastic SCM, all focused on improving the general usability within the IDE.&lt;br /&gt;&lt;br /&gt;The first functionality to be described is the new &lt;span style="font-style:italic;"&gt;synchronize view&lt;/span&gt;, available from the team menu.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TNK0Wy96kbI/AAAAAAAAA6M/CeRNkqhPQTw/s1600/eclipse-teammenu.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 210px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TNK0Wy96kbI/AAAAAAAAA6M/CeRNkqhPQTw/s400/eclipse-teammenu.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5535685195723346354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The new synch view introduces an alternative way to perform checkins of pending changes, more familiar than the former checkin dialog especially for Eclipse users previously using Subversion or CVS.&lt;br /&gt;&lt;br /&gt;The team synchronization view allows an easy navigation and review of the pending changes and also enables an easy way to commit all changes together.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TNK0ibcF3fI/AAAAAAAAA6U/Br2tjoPex48/s1600/eclipse-teamsynch.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 282px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TNK0ibcF3fI/AAAAAAAAA6U/Br2tjoPex48/s400/eclipse-teamsynch.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5535685395565895154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The second important change introduced by the release of this reviewed Eclipse plugin is the new checkin pending changes dialog, improved to match the user’s expectations.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TNK0znjP8nI/AAAAAAAAA6c/WKfh9BiGNug/s1600/eclipse-checkinpendingchanges.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 312px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TNK0znjP8nI/AAAAAAAAA6c/WKfh9BiGNug/s400/eclipse-checkinpendingchanges.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5535685690874917490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Finally, we’ve added a new import option to the IDE so developers can easily configure new workspaces directly downloading the code from Plastic as they’d do using Subversion or CVS.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TNK0-MRP1ZI/AAAAAAAAA6k/GMmoLobbfA0/s1600/eclipse-importfromversioncontrol.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 381px; height: 400px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TNK0-MRP1ZI/AAAAAAAAA6k/GMmoLobbfA0/s400/eclipse-importfromversioncontrol.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5535685872530216338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The import wizard will drive users through the workspace creation process and will also help selecting the repository and branch or label to work on.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TNK1L45YKGI/AAAAAAAAA6s/CAa9V8XNPKk/s1600/eclipse-importfromversioncontrol02.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 344px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TNK1L45YKGI/AAAAAAAAA6s/CAa9V8XNPKk/s400/eclipse-importfromversioncontrol02.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5535686107847993442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Download and try!&lt;/h2&gt;&lt;br /&gt;It's been only a few days since we &lt;a href="http://codicesoftware.blogspot.com/2010/11/building-plastic-scms-community-with.html"&gt;released the Community Edition&lt;/a&gt;, which as you know is free for small teams (up to 15 developers!). Interest is pretty high and we expect Eclipse users to be taking a look at Plastic too with this new enhanced plug-in.&lt;br /&gt;&lt;br /&gt;So, you know: spread the word!! Tell every one Plastic is now free and they can start using it asap at no cost!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-3373411052104454057?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/3373411052104454057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=3373411052104454057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3373411052104454057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/3373411052104454057'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/mylyn-integration.html' title='Mylyn integration'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_z6qpykplUvI/TNKz5VE8C4I/AAAAAAAAA58/Q1mRT91gw7g/s72-c/eclipse-mylyntasks-jira-switchtobranch.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1315551750008261150</id><published>2010-11-01T21:19:00.010+01:00</published><updated>2010-11-01T21:30:52.707+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Plastic 3.0.7 is out!!</title><content type='html'>Together with the launch of the &lt;a href="http://codicesoftware.blogspot.com/2010/11/building-plastic-scms-community-with.html"&gt;new Community Edition&lt;/a&gt; we're announcing a new version ready to be downloaded: 3.0.7! And it comes loaded with new features: new Visual Studio integration and Mylyn integration for Eclipse users.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Our policy is to release a couple of major releases a year, but our dev team is so active and there are so many ideas floating around that we need to publish new features more often than that.&lt;br /&gt;&lt;br /&gt;That’s why after we released 3.0 a few months back, instead of just “retaining” new features for the next major version, we’re just publishing them on a frequently basis.&lt;br /&gt;&lt;br /&gt;And that’s why today I’m announcing a good number of new features in 3.0.6, together with some fixes and customers requests.&lt;br /&gt;&lt;br /&gt;You can find all the details in the release notes, but let me explain in a little more depth what’s 3.0.7 is about.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;New Visual Studio integration package&lt;/h2&gt;&lt;br /&gt;Visual Studio is one of the most used IDEs by Plastic SCM users out there and that’s why we’re trying to continuously improve our integration with it. As part of the new release, we’re introducing a new Visual Studio Package for Visual Studio 2005 and higher. The new package allows our customers to implement full SCM operations.&lt;br /&gt;&lt;br /&gt;Why are we coming up with a new package? Here are the reasons:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;We had originally offered very basic SCC integration, which is still maintained and enables compatibility with older versions of Visual Studio. However, getting rid of the old SCC limitations which will enable us to continue evolving the integration rapidly and without meaningless restrictions.&lt;br /&gt;&lt;li&gt;We are now able to add more integrated functionality: checkin behavior is now shared with the GUI, the same happens with the access to all the GUI views and so on.&lt;br /&gt;&lt;li&gt;We have created a better base to continue evolving plugins and enable more innovative functionalities. We’re considering a bunch of ideas to extract info in real time from the SCM and make it available while the programmer is coding, helping him to make the right decisions. Stay tuned because there will be a lot more coming.&lt;br /&gt;&lt;br /&gt;Now let me describe in bigger detail how the new package looks like&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Configuring the new Version Control Package&lt;/h2&gt;&lt;br /&gt;Going to Tools/Options you’ll be able to select the new “Source Control Package.” Keep in mind that you can choose from the old SCC or the new one, it’s up to you!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TM8h2kAcxxI/AAAAAAAAA4k/3W6d2BIOVXU/s1600/configurePackage.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 232px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TM8h2kAcxxI/AAAAAAAAA4k/3W6d2BIOVXU/s400/configurePackage.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5534679688323843858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;New context menus available&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Thanks to the new integration we were able to include much more functionality in the Visual Studio IDE.&lt;br /&gt;Look at the new context menu options that were simply not available before, like annotating code or showing up history and tree 3D (before only the tree was available).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TM8iIqOM44I/AAAAAAAAA40/oou0ia53ycU/s1600/contextoptions.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TM8iIqOM44I/AAAAAAAAA40/oou0ia53ycU/s400/contextoptions.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5534679999229780866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All the views in the Plastic GUI are also available from View/Plastic SCM menu (it was there also in the former 2005 package, but now we added a “workspace explorer” too).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_z6qpykplUvI/TM8iTMsrtCI/AAAAAAAAA48/Cl0UPsN-qiQ/s1600/packageoptions.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://1.bp.blogspot.com/_z6qpykplUvI/TM8iTMsrtCI/AAAAAAAAA48/Cl0UPsN-qiQ/s400/packageoptions.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5534680180283126818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Integrated history&lt;/h2&gt;&lt;br /&gt;Several users requested it in the past and in fact it is something we must have added long ago. But finally the history of an item can be browsed from within Visual Studio.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TM8ie_FBftI/AAAAAAAAA5E/Qvdf52_yMzI/s1600/historyview.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TM8ie_FBftI/AAAAAAAAA5E/Qvdf52_yMzI/s400/historyview.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5534680382785552082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Integrated annotate&lt;/h2&gt;&lt;br /&gt;The annotate is now available within the Visual Studio IDE.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_z6qpykplUvI/TM8ip6_bVnI/AAAAAAAAA5M/6JbrcN1Wmss/s1600/integratedannotate.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 385px;" src="http://4.bp.blogspot.com/_z6qpykplUvI/TM8ip6_bVnI/AAAAAAAAA5M/6JbrcN1Wmss/s400/integratedannotate.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5534680570666899058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;New pending changes view&lt;/h2&gt;&lt;br /&gt;The checkin window is now shared with the GUI, displaying the “pending changes” dialog.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TM8i0LhMLGI/AAAAAAAAA5U/O70-K42keQ4/s1600/checkindialog.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 282px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TM8i0LhMLGI/AAAAAAAAA5U/O70-K42keQ4/s400/checkindialog.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5534680746902170722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Integrated diff&lt;/h2&gt;&lt;br /&gt;We’ve made several changes in the diff infrastructure for 3.0.7 and now there’s a new configuration page on the wizard to let you set up the diff tools.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TM8jAS_D-oI/AAAAAAAAA5c/AY2A_4AbtDY/s1600/integrateddiff.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 293px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TM8jAS_D-oI/AAAAAAAAA5c/AY2A_4AbtDY/s400/integrateddiff.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5534680955064941186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can choose the “embedded diff viewer” (new) or the Plastic SCM diff tool (the default) or set up your own diff tool.&lt;br /&gt;In case you go for the “embedded” one the diffs will be displayed as follows in the GUI and Visual Studio.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TM8jKDX4sSI/AAAAAAAAA5k/-aR4TLNSBas/s1600/integrateddiffonVStudio.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 290px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TM8jKDX4sSI/AAAAAAAAA5k/-aR4TLNSBas/s400/integrateddiffonVStudio.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5534681122672783650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TM8jRAXBHLI/AAAAAAAAA5s/fQX8RAnIUX8/s1600/integrateddiffonplastic.png"&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/TM8jRAXBHLI/AAAAAAAAA5s/fQX8RAnIUX8/s400/integrateddiffonplastic.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5534681242122919090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hope you enjoy the changes!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-1315551750008261150?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/1315551750008261150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=1315551750008261150' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1315551750008261150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/1315551750008261150'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/plastic-307-is-out.html' title='Plastic 3.0.7 is out!!'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_z6qpykplUvI/TM8h2kAcxxI/AAAAAAAAA4k/3W6d2BIOVXU/s72-c/configurePackage.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-2044702098248601063</id><published>2010-11-01T21:01:00.010+01:00</published><updated>2010-11-02T11:01:23.088+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Building Plastic SCM's Community With a Community Edition</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.plasticscm.com/download/login.aspx"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 173px; height: 51px;" src="http://www.plasticscm.com/img/webel/download-button-com.png" border="0" alt="" /&gt;&lt;/a&gt;We're just announcing a Community Edition of Plastic SCM. We &lt;span style="font-weight:bold;"&gt;will license Plastic SCM for free&lt;/span&gt; to environments with up to 15 developers, which will cover a huge percentage of the development teams.&lt;br /&gt;&lt;br /&gt;For the ones new to Plastic SCM:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; It is a &lt;span style="font-weight:bold;"&gt;distributed version control system&lt;/span&gt; that can act as a centralized one too&lt;br /&gt;&lt;li&gt; It is very, very &lt;span style="font-weight:bold;"&gt;strong&lt;/span&gt; doing &lt;span style="font-weight:bold;"&gt;branching and specially merging&lt;/span&gt; (no issues with renaming, full merge tracking, visual merge diagrams (branch explorer), 3D version tree and many more). It does include tools like &lt;a href="http://codicesoftware.blogspot.com/2010/07/xmerge-to-merge-refactored-code.html"&gt;xmerge &lt;/a&gt;and &lt;a href="http://codicesoftware.blogspot.com/2010/07/move-support-in-diff.html"&gt;xdiff&lt;/a&gt;, the only "refactor aware" diff and merge tools on the market.&lt;br /&gt;&lt;li&gt; It focuses on visualization: from the branch explorer, the 3D version tree, the view based GUI, integration with Visual Studio and many more&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.plasticscm.com/img/screenshots/plastic-brex-main-and-maintenance-branches.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 409px; height: 324px;" src="http://www.plasticscm.com/img/screenshots/plastic-brex-main-and-maintenance-branches.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We now have hundreds of customers whose developers rely on Plastic SCM to manage and overcome many of the challenges related to distributed development. We hear from our users often, and that feedback is very important to us.  We want to build a community of Plastic users who exchange information about the product and their successes, while giving us constructive feedback on the product.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The new edition aims to build our community. With the new licensing, our customers receive a full-featured version of the product, with all the bells and whistles one receives from our enterprise licensed version. Our customers often tell us that Plastic is the only product out there that can handle merging of distributed code while providing an easy-to-use graphical interface. Our interface is not an “add-on,” it’s a cornerstone. We built Plastic with things such as visualization, usability, advanced diff and merge tools in mind. And now the full features of Plastic are available to small teams for free.&lt;br /&gt;&lt;br /&gt;Community edition customers will be able to subscribe to priority support in case they need further assistance than what our user community forums will provide.&lt;br /&gt;&lt;br /&gt;We invite all developers to use Plastic SCM for their smaller projects by capitalizing on the community edition licensing. We then invite you to visit and contribute to our forums.&lt;br /&gt;&lt;br /&gt;For more information, visit the &lt;a href="http://www.plasticscm.com/buy.aspx"&gt;community edition product page&lt;/a&gt;, which also leads to a &lt;a href="http://www.plasticscm.com/buy/community-edition-FAQ.aspx"&gt;FAQ&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Also today, we're introducing new enhancements to Plastic SCM, as outlined in two additional &lt;a href="http://codicesoftware.blogspot.com/2010/11/plastic-307-is-out.html"&gt;blog posts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-2044702098248601063?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/2044702098248601063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=2044702098248601063' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2044702098248601063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/2044702098248601063'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/11/building-plastic-scms-community-with.html' title='Building Plastic SCM&apos;s Community With a Community Edition'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-8667600323743647535</id><published>2010-10-27T19:11:00.003+02:00</published><updated>2010-10-27T19:25:51.274+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='solaris'/><title type='text'>Eat your own dog food</title><content type='html'>Yeah, that's what we're doing, &lt;a href="http://en.wikipedia.org/wiki/Eating_your_own_dog_food"&gt;eating our own dog food&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We just migrated our Plastic SCM internal server from an old Fedora Core 4 (yes, that oold... but is our server and we love it!) running on x86 hardware (Xeon) to a SPARC Solaris 10 box. A big endian 64 bits SPARC box!! :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www2.sys-con.com/ITSG/virtualcd/java/archives/0902/krishnan/fig2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 288px; height: 136px;" src="http://www2.sys-con.com/ITSG/virtualcd/java/archives/0902/krishnan/fig2.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The previous configuration was running Mono + Bohem GC and Plastic storage was an external Oracle database (yes, separate Plastic and database servers, again, eating our own stuff), and now the configuration is as follows:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; SPARC Solaris 10 server&lt;br /&gt;&lt;li&gt; Mono 2.8 + sgen (yes, sgen!!!)&lt;br /&gt;&lt;li&gt; Plastic SCM 3.0.7+ (internal build, not out yet)&lt;br /&gt;&lt;li&gt; SQL Server 2005 external database (yes, no make things even funnier we're using a little-endian db :P with a bigendian system, in fact we found a bug in our GUID conversion code while reusing the old db, something that wouldn't happen if you create your dbs with the bigendian server, would only happen if you plug 'old' databases created by littleendian boxes to it).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.rite-group.com/rich/images/sun_blade_1000.jpeg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 160px; height: 160px;" src="http://www.rite-group.com/rich/images/sun_blade_1000.jpeg" border="0" alt="" /&gt;&lt;/a&gt; So far the old iron is behaving really well, it's only been one day in real production (after weeks of load testing and so on, of course) but no known issues yet. It's not as fast as our previous server but that's because we're not using very strong hardware. I'd like to see it working on a beat &lt;a href="http://www.oracle.com/us/products/servers-storage/servers/sparc-enterprise/t-series/sparc-t3-1-server-170341.html"&gt;like this&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Although obviously SPARC hardware is not the most demanded at all, we're committed to support it since specially big customers tend to ask for at least a few servers running it... It's been supported for years already but now we're really about to have better packaging and so on, I expect to have an installer on the coming weeks (so far we installed manually).&lt;br /&gt;&lt;br /&gt;Will let you know how it goes... :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-8667600323743647535?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/8667600323743647535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=8667600323743647535' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8667600323743647535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/8667600323743647535'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/10/eat-your-own-dog-food.html' title='Eat your own dog food'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-5471391954818018911</id><published>2010-10-21T21:29:00.007+02:00</published><updated>2010-10-21T22:15:04.722+02: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'>Mono 2.8 available for Solaris 10 SPARC and x86</title><content type='html'>We've just released (thanks to Dick Porter, our resident mono hacker, who had to make some fixes on the sgen implementation to make it run on SPARC) the Mono 2.8 packages for Solaris 10 (x86 and SPARC) and OpenSolaris.&lt;br /&gt;&lt;br /&gt;They're available to download here: &lt;a href="http://www.go-mono.com/mono-downloads/download.html"&gt;http://www.go-mono.com/mono-downloads/download.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TMCU845ZBbI/AAAAAAAAA4M/lQUcekG_diI/s1600/downloadmono.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 137px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TMCU845ZBbI/AAAAAAAAA4M/lQUcekG_diI/s400/downloadmono.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5530584116197131698" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Installing the packages is not hard, just a matter of playing with pkgadd after downloading them. It will warn you about missing dependencies and so on. I installed the SPARC ones yesterday on a clean box and there are the ones I had to download (from sunfreeware.com) and install:&lt;br /&gt;&lt;br /&gt;&lt;li&gt; libgcc-3.4.6-sol10-sparc-local&lt;br /&gt;&lt;li&gt; libiconv-1.13.1-sol10-sparc-local&lt;br /&gt;&lt;li&gt; libintl-3.4.0-sol10-sparc-local&lt;br /&gt;&lt;br /&gt;And then I was able to install mono successfully.&lt;br /&gt;&lt;br /&gt;Mono installs (by default) on /opt/mono so here's what I use to launch it:  LD_LIBRARY_PATH=/opt/mono/lib /opt/mono/bin/mono&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;How did we test it?&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;We run our entire &lt;a href="http://www.plasticscm.com/infocenter/technical-articles/pnunit.aspx"&gt;PNUnit&lt;/a&gt; test suite on Solaris to validate the build (and Plastic) and we also run load tests for days using a Solaris SPARC server (both with Boehm and sgen (MONO_GC_PARAMS=major=copying LD_LIBRARY_PATH=/opt/mono/lib /opt/mono/bin/mono --gc=sgen) with very good results.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_z6qpykplUvI/TMCXxT6KIXI/AAAAAAAAA4U/bqyfWwN5yb0/s1600/plasticonconsole.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 72px;" src="http://2.bp.blogspot.com/_z6qpykplUvI/TMCXxT6KIXI/AAAAAAAAA4U/bqyfWwN5yb0/s400/plasticonconsole.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5530587215824560498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As a side note, this Plastic server that you see up and running is using a... SQL Server database as backend... so, yes, the Mono SQL Server implementation works even using bigendian software!! :)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;MWF is available too&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;We've included the libgdiplus library. It is stable on OpenSolaris but we weren't able to make it stable enough on Solaris yet. Just time to get some nice screenshots!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_z6qpykplUvI/TMCe_RIP21I/AAAAAAAAA4c/j_Q9zWH5WzE/s1600/plasticoncde.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 276px;" src="http://3.bp.blogspot.com/_z6qpykplUvI/TMCe_RIP21I/AAAAAAAAA4c/j_Q9zWH5WzE/s400/plasticoncde.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5530595152177912658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Future&lt;/h2&gt;&lt;br /&gt;We plan to continue building and supporting Mono on Solaris, both x86 and SPARC, since it is key for some important deployments.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Side notes&lt;/h2&gt;&lt;br /&gt;This 2.8 Mono release is the most "multi-platform" I've seen so far. I'm able to successfully run the entire Plastic testsuite under Solaris (x86 and SPARC), FreeBSD, OpenBSD (first time I'm able to do it!), Mac OS X (both PPC and x86). So... yes, expect some default packaging on OpenBSD in the coming months!! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/27232680-5471391954818018911?l=codicesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codicesoftware.blogspot.com/feeds/5471391954818018911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=27232680&amp;postID=5471391954818018911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5471391954818018911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/27232680/posts/default/5471391954818018911'/><link rel='alternate' type='text/html' href='http://codicesoftware.blogspot.com/2010/10/mono-28-available-for-solaris-10-sparc.html' title='Mono 2.8 available for Solaris 10 SPARC and x86'/><author><name>pablo</name><uri>http://www.blogger.com/profile/08083682682597484025</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='29' src='http://1.bp.blogspot.com/_z6qpykplUvI/TQi0oJF2nUI/AAAAAAAABBs/Ix-9YZXzAwg/S220/helmetface.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_z6qpykplUvI/TMCU845ZBbI/AAAAAAAAA4M/lQUcekG_diI/s72-c/downloadmono.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-27232680.post-1490695132484942532</id><published>2010-10-19T11:34:00.003+02:00</published><updated>2010-10-19T11:37:53.266+02: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'>Welcome crazy monkeys!! - Mono on Solaris SPARC!</title><content type='html'>Yeah, yeah, yeah... being able to develop super-cool Mac OS X applications with a modern programming framework &lt;a href="http://tirania.org/blog/archive/2010/Oct-12.html"&gt;thanks to MonoMac is great&lt;/a&gt;. So great. And I'll bet you'll be able to design really cool user interfaces without getting your hands dirty with ObjectiveC code... really great. And to be honest, I've to admit I'm eager to develop a Plastic SCM native GUI for Mac taking advantage of all that...&lt;br /&gt;&lt;br /&gt;But, let's face it! Real hackers don't do that!! :D&lt;br /&gt;&lt;br /&gt;No, you know what's really "hacker's style"?? Well, I'll tell you: the real thing to do is getting a 10 years old big-endian iron (yes, big endian
