<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>this.Pose() as Expert - Subversion</title>
    <link>http://chrison.net/</link>
    <description />
    <language>en-us</language>
    <copyright>Christoph Wille</copyright>
    <lastBuildDate>Sun, 19 Apr 2009 06:34:11 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>christoph.wille@gmail.com</managingEditor>
    <webMaster>christoph.wille@gmail.com</webMaster>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=64da7780-bd03-4e5b-add8-47ce5cc56c1c</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,64da7780-bd03-4e5b-add8-47ce5cc56c1c.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=64da7780-bd03-4e5b-add8-47ce5cc56c1c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://subversion.tigris.org/svn_1.5_releasenotes.html#fsfs-sharding">Sharding</a> was
introduced for FSFS repositories in Subversion 1.5, but only now I moved
to a sharded repository (at time of this writing: Subversion 1.6.1). This meant -
as usual - a dump / create / load dance. Followed by the pack operation:
</p>
        <p>
          <font face="Courier New">svnadmin dump c:\subversion\sharpdevelop &gt; c:\sd.dump<br />
svnadmin create c:\subversion\sharpdevelop<br />
svnadmin load c:\subversion\sharpdevelop &lt; c:\sd.dump<br />
svnadmin pack c:\subversion\sharpdevelop</font>
        </p>
        <p>
Without svnadmin pack, you only get sharding. Executing svnadmin pack puts all the
shards together into a single file. This makes certain operations such as svnadmin
hotcopy way faster.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=64da7780-bd03-4e5b-add8-47ce5cc56c1c" />
      </body>
      <title>Sharding in Subversion</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,64da7780-bd03-4e5b-add8-47ce5cc56c1c.aspx</guid>
      <link>http://chrison.net/ShardingInSubversion.aspx</link>
      <pubDate>Sun, 19 Apr 2009 06:34:11 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://subversion.tigris.org/svn_1.5_releasenotes.html#fsfs-sharding"&gt;Sharding&lt;/a&gt; was
introduced for FSFS repositories&amp;nbsp;in Subversion 1.5, but&amp;nbsp;only now I moved
to a sharded repository (at time of this writing: Subversion 1.6.1). This meant -
as usual - a dump / create / load dance. Followed by the pack operation:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;svnadmin dump c:\subversion\sharpdevelop &amp;gt; c:\sd.dump&lt;br&gt;
svnadmin create c:\subversion\sharpdevelop&lt;br&gt;
svnadmin load c:\subversion\sharpdevelop &amp;lt; c:\sd.dump&lt;br&gt;
svnadmin pack c:\subversion\sharpdevelop&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Without svnadmin pack, you only get sharding. Executing svnadmin pack puts all the
shards together into a single file. This makes certain operations such as svnadmin
hotcopy way faster.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=64da7780-bd03-4e5b-add8-47ce5cc56c1c" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,64da7780-bd03-4e5b-add8-47ce5cc56c1c.aspx</comments>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=d0be3b02-c1f8-490b-b37e-7a33238ab223</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,d0be3b02-c1f8-490b-b37e-7a33238ab223.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,d0be3b02-c1f8-490b-b37e-7a33238ab223.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d0be3b02-c1f8-490b-b37e-7a33238ab223</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In my previous post <a href="http://chrison.net/FastCGIInIIS7.aspx">FastCGI in IIS7</a> I
mentioned that I am running <a href="http://websvn.tigris.org/">WebSVN</a> on this
box to give FastCGI a real-world test run. Today, I upgraded to <a href="http://websvn.tigris.org/servlets/ReadMsg?list=announce&amp;msgNo=21">v2.0
of WebSVN</a>. They sure do ship a good-looking template this time around:
</p>
        <p>
          <img src="http://chrison.net/content/binary/websvn2.png" border="0" />
        </p>
        <p>
The RSS functionality is enabled too in this version (I was running code directly
from their repository last time around...). I have to say that WebSVN turned into
a must-have tool for anyone using <a href="http://subversion.tigris.org/">Subversion</a>.
</p>
        <p>
          <a href="http://iis7.chrison.net/websvn/index.php">Link to WebSVN on iis7.chrison.net</a> (feel
free to play around)
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=d0be3b02-c1f8-490b-b37e-7a33238ab223" />
      </body>
      <title>WebSVN 2.0</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,d0be3b02-c1f8-490b-b37e-7a33238ab223.aspx</guid>
      <link>http://chrison.net/WebSVN20.aspx</link>
      <pubDate>Thu, 16 Aug 2007 13:22:40 GMT</pubDate>
      <description>&lt;p&gt;
In my previous post &lt;a href="http://chrison.net/FastCGIInIIS7.aspx"&gt;FastCGI in IIS7&lt;/a&gt; I
mentioned that I am running &lt;a href="http://websvn.tigris.org/"&gt;WebSVN&lt;/a&gt; on this
box to give FastCGI a real-world test run. Today, I upgraded to &lt;a href="http://websvn.tigris.org/servlets/ReadMsg?list=announce&amp;amp;msgNo=21"&gt;v2.0
of WebSVN&lt;/a&gt;. They sure do ship a good-looking template this time around:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/websvn2.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
The RSS functionality is enabled too in this version (I was running code directly
from their repository last time around...). I have to say that WebSVN turned into
a must-have tool for anyone using &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://iis7.chrison.net/websvn/index.php"&gt;Link to WebSVN on iis7.chrison.net&lt;/a&gt; (feel
free to play around)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=d0be3b02-c1f8-490b-b37e-7a33238ab223" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,d0be3b02-c1f8-490b-b37e-7a33238ab223.aspx</comments>
      <category>IIS</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=7b55ef8d-62f7-4688-9dde-1c264c4f5001</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,7b55ef8d-62f7-4688-9dde-1c264c4f5001.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,7b55ef8d-62f7-4688-9dde-1c264c4f5001.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=7b55ef8d-62f7-4688-9dde-1c264c4f5001</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I just gave <a href="http://www.statsvn.org">StatSVN</a> a try, which compiles statistics
for <a href="http://subversion.tigris.org/">Subversion</a> repositories. For my trial,
I used the 2.1 branch of <a href="http://www.icsharpcode.net/opensource/sd/">SharpDevelop</a> -
which, because only created a month ago - should create a small and manageable statistic
to start out with.
</p>
        <p>
What do you need to get up and running with StatSVN (except, of course, StatSVN itself)?
Well, the Subversion command line client (<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91">get
it here</a>), as well as <a href="http://java.sun.com/javase/downloads/index.jsp">Java</a>.
Working with StatSVN is really easy - simply follow the steps outlined in the readme
and you can't go wrong - it even works nicely on Windows Vista.
</p>
        <p>
If you don't want to install StatSVN on your box just to see how a report might look
like for a real-world project, I have packaged the report generated for our SharpDevelop
2.1 branch:
</p>
        <p>
          <a href="http://chrison.net/content/binary/DemoReport.zip">DemoReport.zip (1.27 MB)</a>
        </p>
        <p>
Before looking at the report, check out the LOC and churn rate I have posted below:
</p>
        <p>
          <img src="http://chrison.net/content/binary/locandchurn.png" border="0" />
        </p>
        <p>
This branch was created from /trunk to only contain bug fixes from Beta 2 to release
candidates and RTW. That's why there are spikes of activity, with no activity at other
days. Also, not all developers are working on the branch, many are concentrating on
developing features for the new version which lives in /trunk.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7b55ef8d-62f7-4688-9dde-1c264c4f5001" />
      </body>
      <title>StatSVN - Statistics for Subversion</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,7b55ef8d-62f7-4688-9dde-1c264c4f5001.aspx</guid>
      <link>http://chrison.net/StatSVNStatisticsForSubversion.aspx</link>
      <pubDate>Fri, 19 Jan 2007 10:46:42 GMT</pubDate>
      <description>&lt;p&gt;
I just gave &lt;a href="http://www.statsvn.org"&gt;StatSVN&lt;/a&gt; a try, which compiles statistics
for &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; repositories. For my trial,
I used the 2.1 branch of &lt;a href="http://www.icsharpcode.net/opensource/sd/"&gt;SharpDevelop&lt;/a&gt; -
which, because only created a month ago - should create a small and manageable statistic
to start out with.
&lt;/p&gt;
&lt;p&gt;
What do you need to get up and running with StatSVN (except, of course, StatSVN itself)?
Well, the Subversion command line client (&lt;a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91"&gt;get
it here&lt;/a&gt;), as well as &lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;Java&lt;/a&gt;.
Working with StatSVN is really easy - simply follow the steps outlined in the readme
and you can't go wrong - it even works nicely on Windows Vista.
&lt;/p&gt;
&lt;p&gt;
If you don't want to install StatSVN on your box just to see how a report might look
like for a real-world project, I have packaged the report generated for our SharpDevelop
2.1 branch:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/DemoReport.zip"&gt;DemoReport.zip (1.27 MB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Before looking at the report, check out the LOC and churn rate I have posted below:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/locandchurn.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
This branch was created from /trunk to only contain bug fixes from Beta 2 to release
candidates and RTW. That's why there are spikes of activity, with no activity at other
days. Also, not all developers are working on the branch, many are concentrating on
developing features for the new version which lives in /trunk.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7b55ef8d-62f7-4688-9dde-1c264c4f5001" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,7b55ef8d-62f7-4688-9dde-1c264c4f5001.aspx</comments>
      <category>Cool Download</category>
      <category>Project Management</category>
      <category>Subversion</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=bf4dd6ab-17f9-42ab-a3a8-a3eb2251f670</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,bf4dd6ab-17f9-42ab-a3a8-a3eb2251f670.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,bf4dd6ab-17f9-42ab-a3a8-a3eb2251f670.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=bf4dd6ab-17f9-42ab-a3a8-a3eb2251f670</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I wrote about <a href="http://svk.elixus.org/view/HomePage">SVK</a> in <a href="http://chrison.net/MirrorMirrorOnTheWall.aspx">Mirror,
mirror on the wall</a> and <a href="http://chrison.net/GoingLocalWithSVK.aspx">Going
local with SVK</a>. Now the <a href="http://lists.bestpractical.com/pipermail/svk-devel/2006-December/000412.html">release
of version 2 has been announced</a>. Note: <a href="http://svk.elixus.org/view/SVKWin32">WIN32
binaries</a> are not yet available.
</p>
        <p>
What is SVK? A quote from the homepage: <em><a href="http://svk.elixus.org/view/HomePage">svk</a> is
a decentralized version control system built with the robust Subversion filesystem.
It supports repository mirroring, disconnected operation, history-sensitive merging,
and integrates with other version control systems, as well as popular visual merge
tools.</em></p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=bf4dd6ab-17f9-42ab-a3a8-a3eb2251f670" />
      </body>
      <title>SVK 2.0.0 Available</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,bf4dd6ab-17f9-42ab-a3a8-a3eb2251f670.aspx</guid>
      <link>http://chrison.net/SVK200Available.aspx</link>
      <pubDate>Thu, 28 Dec 2006 16:20:56 GMT</pubDate>
      <description>&lt;p&gt;
I wrote about &lt;a href="http://svk.elixus.org/view/HomePage"&gt;SVK&lt;/a&gt; in &lt;a href="http://chrison.net/MirrorMirrorOnTheWall.aspx"&gt;Mirror,
mirror on the wall&lt;/a&gt; and &lt;a href="http://chrison.net/GoingLocalWithSVK.aspx"&gt;Going
local with SVK&lt;/a&gt;. Now the &lt;a href="http://lists.bestpractical.com/pipermail/svk-devel/2006-December/000412.html"&gt;release
of version 2 has been announced&lt;/a&gt;. Note: &lt;a href="http://svk.elixus.org/view/SVKWin32"&gt;WIN32
binaries&lt;/a&gt; are not yet available.
&lt;/p&gt;
&lt;p&gt;
What is SVK? A quote from the homepage: &lt;em&gt;&lt;a href="http://svk.elixus.org/view/HomePage"&gt;svk&lt;/a&gt; is
a decentralized version control system built with the robust Subversion filesystem.
It supports repository mirroring, disconnected operation, history-sensitive merging,
and integrates with other version control systems, as well as popular visual merge
tools.&lt;/em&gt; 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=bf4dd6ab-17f9-42ab-a3a8-a3eb2251f670" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,bf4dd6ab-17f9-42ab-a3a8-a3eb2251f670.aspx</comments>
      <category>Cool Download</category>
      <category>Subversion</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=964f5235-28ee-444f-b61e-17ac54251529</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,964f5235-28ee-444f-b61e-17ac54251529.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,964f5235-28ee-444f-b61e-17ac54251529.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=964f5235-28ee-444f-b61e-17ac54251529</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Beta 1 of SharpDevelop2 2.1 is <a href="http://www.icsharpcode.net/OpenSource/SD/Download/#SharpDevelop221">available
for download</a>. While I was putting together the <a href="http://community.sharpdevelop.net/forums/thread/11710.aspx">annoucement
for v2.1</a> yesterday, I realized that for a point release, we really managed to
put in a lot of new cool features:
</p>
        <ul>
          <li>
            <a href="http://laputa.sharpdevelop.net/FxCopSupportInSharpDevelop221Serralongue.aspx">FxCop
Support</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/06/20/UsingTheComponentInspector.aspx">Component
Inspector</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/17/WixIntegration.aspx">WiX
Support</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/09/IncrementalSearchInSharpDevelop21.aspx">Incremental
Search</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/davidalpert/archive/2006/09/18/Code-Navigation-History.aspx">Code
Navigation History</a>
          </li>
          <li>
            <a href="http://laputa.sharpdevelop.net/AnnouncingSupportForListDataSourcesInSharpReport.aspx">List
Data Sources in SharpReport</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/05/TestingXPathQueriesInSharpDevelop.aspx">XPath
Queries</a>
          </li>
          <li>
            <a href="http://laputa.sharpdevelop.net/CodeCompletionSupportForNET1011AndCompactFramework20.aspx">Code
Completion for Different Frameworks</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/09/GoToXmlSchemaDefinition.aspx">GoTo
XML Schema Definition</a>
          </li>
          <li>
            <a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/02/18/TargetingDifferentFrameworksWithVBNet.aspx">Targeting
Different Frameworks</a>
          </li>
          <li>
            <a href="http://laputa.sharpdevelop.net/AnnouncingSharpDevelopForApplicationsSDA.aspx">Hosting
of SharpDevelop in 3rd Party Applications</a>
          </li>
        </ul>
        <p>
A couple of WOW features (for me, at least): Not only can you compile an application
for different versions of .NET, you also get version-specific code completion support.
Another cool one is that you can host SharpDevelop in your application, providing
your application a "macro editor" (on steroids I might add) with full .NET support.
And to pick a third, code analysis rounds out our professional offering in addition
to code coverage as well as unit testing.
</p>
        <p>
Two features did not make it for the Beta 1 announcement as they don't yet cover all
the scenarios we are hoping for: integrated Subversion support (yeah!) and targetting
the Compact Framework for Windows CE devices. Those slipped silently into this release.
</p>
        <p>
As you can see, SharpDevelop is ever growing and the developers working on it can
be rightly proud of their achievements!
</p>
        <p>
Finally, a kind of "call to action": let us know what you think! Not only in <a href="http://community.sharpdevelop.net/forums/">our
forums</a>, but also in your blogs, communities, et cetera. We need your feedback
regarding feature set, stability, and much more.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=964f5235-28ee-444f-b61e-17ac54251529" />
      </body>
      <title>SharpDevelop2 2.1 Beta 1</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,964f5235-28ee-444f-b61e-17ac54251529.aspx</guid>
      <link>http://chrison.net/SharpDevelop221Beta1.aspx</link>
      <pubDate>Tue, 19 Sep 2006 10:10:55 GMT</pubDate>
      <description>&lt;p&gt;
Beta 1 of SharpDevelop2 2.1 is &lt;a href="http://www.icsharpcode.net/OpenSource/SD/Download/#SharpDevelop221"&gt;available
for download&lt;/a&gt;. While I was putting together the &lt;a href="http://community.sharpdevelop.net/forums/thread/11710.aspx"&gt;annoucement
for v2.1&lt;/a&gt; yesterday, I realized that for a point release, we really managed to
put in a lot of new cool features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://laputa.sharpdevelop.net/FxCopSupportInSharpDevelop221Serralongue.aspx"&gt;FxCop
Support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/06/20/UsingTheComponentInspector.aspx"&gt;Component
Inspector&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/17/WixIntegration.aspx"&gt;WiX
Support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/09/09/IncrementalSearchInSharpDevelop21.aspx"&gt;Incremental
Search&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/davidalpert/archive/2006/09/18/Code-Navigation-History.aspx"&gt;Code
Navigation History&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://laputa.sharpdevelop.net/AnnouncingSupportForListDataSourcesInSharpReport.aspx"&gt;List
Data Sources in SharpReport&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/05/TestingXPathQueriesInSharpDevelop.aspx"&gt;XPath
Queries&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://laputa.sharpdevelop.net/CodeCompletionSupportForNET1011AndCompactFramework20.aspx"&gt;Code
Completion for Different Frameworks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/08/09/GoToXmlSchemaDefinition.aspx"&gt;GoTo
XML Schema Definition&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://community.sharpdevelop.net/blogs/mattward/archive/2006/02/18/TargetingDifferentFrameworksWithVBNet.aspx"&gt;Targeting
Different Frameworks&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://laputa.sharpdevelop.net/AnnouncingSharpDevelopForApplicationsSDA.aspx"&gt;Hosting
of SharpDevelop in 3rd Party Applications&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
A couple of WOW features (for me, at least): Not only can you compile an application
for different versions of .NET, you also get version-specific code completion support.
Another cool one is that you can host SharpDevelop in your application, providing
your application a "macro editor" (on steroids I might add)&amp;nbsp;with full .NET support.
And to pick a third, code analysis rounds out our professional offering in addition
to code coverage as well as unit testing.
&lt;/p&gt;
&lt;p&gt;
Two features did not make it for the Beta 1 announcement as they don't yet cover all
the scenarios we are hoping for: integrated Subversion support (yeah!) and targetting
the Compact Framework for Windows CE devices. Those slipped silently into this release.
&lt;/p&gt;
&lt;p&gt;
As you can see, SharpDevelop is ever growing and the developers working on it can
be rightly proud of their achievements!
&lt;/p&gt;
&lt;p&gt;
Finally,&amp;nbsp;a kind of "call to action": let us know what you think! Not only in &lt;a href="http://community.sharpdevelop.net/forums/"&gt;our
forums&lt;/a&gt;, but also in your blogs, communities, et cetera. We need your feedback
regarding feature set, stability, and much more.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=964f5235-28ee-444f-b61e-17ac54251529" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,964f5235-28ee-444f-b61e-17ac54251529.aspx</comments>
      <category>.NET</category>
      <category>2 Ohhhh</category>
      <category>C#</category>
      <category>Cool Download</category>
      <category>Subversion</category>
      <category>this</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=3c181001-6845-4ab7-a86e-78f5860da972</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,3c181001-6845-4ab7-a86e-78f5860da972.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,3c181001-6845-4ab7-a86e-78f5860da972.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3c181001-6845-4ab7-a86e-78f5860da972</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Subversion 1.4 is <a href="http://subversion.tigris.org/svn_1.4_releasenotes.html">available</a>.
The especially good news? Svnserve can now be run as a native Windows service (<a href="http://svn.collab.net/repos/svn/tags/1.4.0/notes/windows-service.txt">more</a>).
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3c181001-6845-4ab7-a86e-78f5860da972" />
      </body>
      <title>Subversion 1.4</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,3c181001-6845-4ab7-a86e-78f5860da972.aspx</guid>
      <link>http://chrison.net/Subversion14.aspx</link>
      <pubDate>Mon, 11 Sep 2006 12:33:47 GMT</pubDate>
      <description>&lt;p&gt;
Subversion 1.4 is &lt;a href="http://subversion.tigris.org/svn_1.4_releasenotes.html"&gt;available&lt;/a&gt;.
The especially good news? Svnserve can now be run as a native Windows service (&lt;a href="http://svn.collab.net/repos/svn/tags/1.4.0/notes/windows-service.txt"&gt;more&lt;/a&gt;).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=3c181001-6845-4ab7-a86e-78f5860da972" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,3c181001-6845-4ab7-a86e-78f5860da972.aspx</comments>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=0bcf51ac-f9b5-4206-bd01-1334b1dca433</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,0bcf51ac-f9b5-4206-bd01-1334b1dca433.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,0bcf51ac-f9b5-4206-bd01-1334b1dca433.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0bcf51ac-f9b5-4206-bd01-1334b1dca433</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The concept of shelving was made popular by Visual Studio Team System's source control
system - it allows you to "shelve" your changes for a couple reasons, like: 
</p>
        <ul>
          <li>
You have to work on a bug fix immediately, but you are in the middle of implementing
a new feature. You cannot check in those half-baked changes, only the bug fix. So
you shelve your feature work. Once done with the bug fix, you unshelve the feature
work and continue.</li>
          <li>
Sharing work. Another developer needs the changes you are currently working on, but
you are not yet done. So you shelve your changes and the other dev unshelves them
and can get productive immediately.</li>
          <li>
Code review. Instead of having someone come over to your office (or worse, email the
files) to review the changes before checkin, you shelve them and the reviewer can
unshelve them.</li>
          <li>
Backup. How many times do you leave your workplace with a feature not yet completed?
What to do with this build-breaking half-baked work? Shelve it!</li>
        </ul>
        <p>
Now you get the idea why shelving is pretty neat. Even <a href="http://subversion.tigris.org/">Subversion</a> does
support the concept although it is not explicitly there: the blog posts <a href="http://geekswithblogs.net/flanakin/archive/2005/12/02/61929.aspx ">Shelving
in Subversion</a> and <a href="http://mikemason.ca/2005/03/30/">Shelving Subversion</a> show
how you can make shelving happen with <a href="http://subversion.tigris.org/">Subversion</a>.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=0bcf51ac-f9b5-4206-bd01-1334b1dca433" />
      </body>
      <title>Shelving in Subversion</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,0bcf51ac-f9b5-4206-bd01-1334b1dca433.aspx</guid>
      <link>http://chrison.net/ShelvingInSubversion.aspx</link>
      <pubDate>Mon, 05 Jun 2006 09:49:37 GMT</pubDate>
      <description>&lt;p&gt;
The concept of shelving was made popular by Visual Studio Team System's source control
system -&amp;nbsp;it allows you to "shelve" your changes for a couple reasons, like: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
You have to work on a bug fix immediately, but you are in the middle of implementing
a new feature. You cannot check in those half-baked changes, only the bug fix. So
you shelve your feature work. Once done with the bug fix, you unshelve the feature
work and continue.&lt;/li&gt;
&lt;li&gt;
Sharing work. Another developer needs the changes you are currently working on, but
you are not yet done. So you shelve your changes and the other dev unshelves them
and can get productive immediately.&lt;/li&gt;
&lt;li&gt;
Code review. Instead of having someone come over to your office (or worse, email the
files) to review the changes before checkin, you shelve them and the reviewer can
unshelve them.&lt;/li&gt;
&lt;li&gt;
Backup. How many times do you leave your workplace with a feature not yet completed?
What to do with this build-breaking half-baked work? Shelve it!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Now you get the idea why shelving is pretty neat. Even &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; does
support the concept although it is not explicitly there: the blog posts &lt;a href="http://geekswithblogs.net/flanakin/archive/2005/12/02/61929.aspx "&gt;Shelving
in Subversion&lt;/a&gt; and &lt;a href="http://mikemason.ca/2005/03/30/"&gt;Shelving Subversion&lt;/a&gt; show
how you can make shelving happen with &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=0bcf51ac-f9b5-4206-bd01-1334b1dca433" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,0bcf51ac-f9b5-4206-bd01-1334b1dca433.aspx</comments>
      <category>Subversion</category>
      <category>Team System</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=95c4cb37-fbde-490b-ba86-797d7b1aea50</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,95c4cb37-fbde-490b-ba86-797d7b1aea50.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,95c4cb37-fbde-490b-ba86-797d7b1aea50.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=95c4cb37-fbde-490b-ba86-797d7b1aea50</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Remember my call to action in <a href="http://chrison.net/WebApplicationsAndSMTPProxiesDontMixWellItSeems.aspx">Web
applications and SMTP proxies don't mix well (it seems)</a>? I mentioned that I am
guilty as well - not only for Web applications as it turned out, but also for other
server-based software, such as the Subversion post-commit hook I wrote.
</p>
        <p>
You can already guess the contents of the change log (the last public version was <a href="http://chrison.net/SVNPostCommitHookV17.aspx">1.7</a>):
</p>
        <ul>
          <li>
SMTP authentication &amp; SMTP server port options added</li>
        </ul>
        <p>
If you are running the hook today, all you need to do is copy the new post-commit.exe
over your existing one (assuming you use 1.7), and add the following four lines to
your post-commit.exe.config's <em>&lt;appSettings&gt;</em> section:
</p>
        <pre>&lt;add key="SMTPAuthentication" value="" /&gt;<br />
&lt;add key="SMTPServerPort" value="25" /&gt;<br />
&lt;add key="SMTPUsername" value="username" /&gt;<br />
&lt;add key="SMTPPassword" value="password" /&gt;</pre>
        <p>
Those values default post-commit.exe to the 1.7 behavior. To use authentication, set <em>SMTPAuthentication</em> to
BASIC, and provide username and password. Most of the time, you will not need to play
with the server port.
</p>
        <p>
Finally, here is the usual binary &amp; source code archive:
</p>
        <p>
          <a href="http://chrison.net/content/binary/SvnPostCommitHook1.8.0.51014.zip">SvnPostCommitHook1.8.0.51014.zip
(424.24 KB)</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=95c4cb37-fbde-490b-ba86-797d7b1aea50" />
      </body>
      <title>SvnPostCommitHook 1.8</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,95c4cb37-fbde-490b-ba86-797d7b1aea50.aspx</guid>
      <link>http://chrison.net/SvnPostCommitHook18.aspx</link>
      <pubDate>Fri, 14 Oct 2005 09:23:35 GMT</pubDate>
      <description>&lt;p&gt;
Remember my call to action in &lt;a href="http://chrison.net/WebApplicationsAndSMTPProxiesDontMixWellItSeems.aspx"&gt;Web
applications and SMTP proxies don't mix well (it seems)&lt;/a&gt;? I mentioned that I am
guilty as well - not only for Web applications as it turned out, but also for other
server-based software, such as the Subversion post-commit hook I wrote.
&lt;/p&gt;
&lt;p&gt;
You can already guess the contents of the change log (the last public version was &lt;a href="http://chrison.net/SVNPostCommitHookV17.aspx"&gt;1.7&lt;/a&gt;):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
SMTP authentication &amp;amp; SMTP server port options added&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If you are running the hook today, all you need to do is copy the new post-commit.exe
over your existing one (assuming you use 1.7), and add the following four lines to
your post-commit.exe.config's &lt;em&gt;&amp;lt;appSettings&amp;gt;&lt;/em&gt; section:
&lt;/p&gt;
&lt;pre&gt;&amp;lt;add key="SMTPAuthentication" value="" /&amp;gt;&lt;br&gt;
&amp;lt;add key="SMTPServerPort" value="25" /&amp;gt;&lt;br&gt;
&amp;lt;add key="SMTPUsername" value="username" /&amp;gt;&lt;br&gt;
&amp;lt;add key="SMTPPassword" value="password" /&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Those values default post-commit.exe to the 1.7 behavior. To use authentication, set &lt;em&gt;SMTPAuthentication&lt;/em&gt; to
BASIC, and provide username and password. Most of the time, you will not need to play
with the server port.
&lt;/p&gt;
&lt;p&gt;
Finally, here is the usual binary &amp;amp; source code archive:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/SvnPostCommitHook1.8.0.51014.zip"&gt;SvnPostCommitHook1.8.0.51014.zip
(424.24 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=95c4cb37-fbde-490b-ba86-797d7b1aea50" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,95c4cb37-fbde-490b-ba86-797d7b1aea50.aspx</comments>
      <category>Subversion</category>
      <category>this</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=5143ef0f-66e0-488d-85b3-6c1646f336b0</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,5143ef0f-66e0-488d-85b3-6c1646f336b0.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,5143ef0f-66e0-488d-85b3-6c1646f336b0.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5143ef0f-66e0-488d-85b3-6c1646f336b0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I admit that I am not the sort of person who likes to go through long and winded installation
instructions. However, I am willing to go to great lengths when it comes to security
- still with certain limits though. And I hit such a brick wall today: trying to secure
Subversion. From the documentation, I knew that the recommended path was SSH, so I
set out to find out how to get this up and running on my Windows box.
</p>
        <p>
Owning the black sock in Google fu, I came up with various articles, the most helpful
being <a href="http://tortoisesvn.berlios.de/?q=node/156">SVN+SSH+public key authentication
on Windows Box as server</a>. Most helpful because after reading the aforementioned
recipe plus <a href="http://tortoisesvn.berlios.de/?q=node/5">Subversion / TortoiseSVN
SSH HowTo</a>, I decided to scratch my efforts. Why?
</p>
        <p>
For starters, I am not a big fan of Cygwin. That's just personal mischief of a Windows
guy, I can swallow my pride when the tools that depend on it provide merit. What's
more of a problem for me is installing a service for adding security to another service
- especially if I need that new service just for the "security purpose", and not the
other bells and whistles it can provide (plus the security issues that might be hidden
in those unused parts). Call me paranoid, but I simply like to reduce "moving parts"
in my setups, because: What's worse than malicious traffic? Right, encrypted
malicious traffic.
</p>
        <p>
Secondly, do you think - honestly - that developers love to jump through
hoops to get access to the repository? (I am referring to the <a href="http://tortoisesvn.berlios.de/?q=node/5">client
side of things on Windows</a>) Not really. From the top of my head, I fall short of
naming a single developer I personally know that would love to follow those steps.
But every single one of them would be more than willing to just replace svn:// for
svns:// when accessing a repository.
</p>
        <p>
Conclusion: yes, I am whining about the usability of an open source project. As I
am participating on one myself, you very well can spare me the "usual" arguments of
do-it-yourself-because-the-sourcecode-is-available-anyways. This is a rant. I want
to be unreasonable. But it sure would be nice if security was in the box. Especially
nowadays.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5143ef0f-66e0-488d-85b3-6c1646f336b0" />
      </body>
      <title>Rant: Why make being secure so hard?</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,5143ef0f-66e0-488d-85b3-6c1646f336b0.aspx</guid>
      <link>http://chrison.net/RantWhyMakeBeingSecureSoHard.aspx</link>
      <pubDate>Tue, 23 Aug 2005 14:00:57 GMT</pubDate>
      <description>&lt;p&gt;
I admit that I am not the sort of person who likes to go through long and winded installation
instructions. However, I am willing to go to great lengths when it comes to security
- still with certain limits though. And I hit such a brick wall today: trying to secure
Subversion. From the documentation, I knew that the recommended path was SSH, so I
set out to find out how to get this up and running on my Windows box.
&lt;/p&gt;
&lt;p&gt;
Owning the black sock in Google fu, I came up with various articles, the most helpful
being &lt;a href="http://tortoisesvn.berlios.de/?q=node/156"&gt;SVN+SSH+public key authentication
on Windows Box as server&lt;/a&gt;. Most helpful because after reading the aforementioned
recipe plus &lt;a href="http://tortoisesvn.berlios.de/?q=node/5"&gt;Subversion / TortoiseSVN
SSH HowTo&lt;/a&gt;, I decided to scratch my efforts. Why?
&lt;/p&gt;
&lt;p&gt;
For starters, I am not a big fan of Cygwin. That's just personal mischief of a Windows
guy, I can swallow my pride&amp;nbsp;when the tools that depend on it provide merit. What's
more of a problem for me is installing a service for adding security to another service
- especially if I need that new service just for the "security purpose", and not the
other bells and whistles it can provide (plus the security issues that might be hidden
in those unused parts). Call me paranoid, but I simply like to reduce "moving parts"
in my setups, because:&amp;nbsp;What's worse than malicious traffic? Right, encrypted
malicious traffic.
&lt;/p&gt;
&lt;p&gt;
Secondly, do you think -&amp;nbsp;honestly -&amp;nbsp;that developers love to jump through
hoops to get access to the repository? (I am referring to the &lt;a href="http://tortoisesvn.berlios.de/?q=node/5"&gt;client
side of things on Windows&lt;/a&gt;) Not really. From the top of my head, I fall short of
naming a single developer I personally know that would love to follow those steps.
But every single one of them would be more than willing to just replace svn:// for
svns:// when accessing a repository.
&lt;/p&gt;
&lt;p&gt;
Conclusion: yes, I am whining about the usability of an open source project. As I
am participating on one myself, you very well can spare me the "usual" arguments of
do-it-yourself-because-the-sourcecode-is-available-anyways. This is a rant. I want
to be unreasonable. But it sure would be nice if security was in the box. Especially
nowadays.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=5143ef0f-66e0-488d-85b3-6c1646f336b0" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,5143ef0f-66e0-488d-85b3-6c1646f336b0.aspx</comments>
      <category>Administration</category>
      <category>Security</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=b9d7e47b-ae4b-4c8e-809a-34dad4a8044c</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,b9d7e47b-ae4b-4c8e-809a-34dad4a8044c.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,b9d7e47b-ae4b-4c8e-809a-34dad4a8044c.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b9d7e47b-ae4b-4c8e-809a-34dad4a8044c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This was a longer-planned upgrade to our <a href="http://subversion.tigris.org">Subversion</a> server
that happened today: moving from the 1.1 series to 1.2.1. It went smoothly, especially
because I played it safe by doing a <a href="http://subversion.tigris.org/faq.html#dumpload">dump
/ load cycle</a> (more details to be found in <a href="http://svnbook.red-bean.com/en/1.0/ch05s03.html#svn-ch-5-sect-3.5">Migrating
a Repository</a>) with all repositories. Safety wasn't the only concern: as detailed
in the <a href="http://subversion.tigris.org/svn_1.2_releasenotes.html">release notes</a>,
I also wanted to move the repositories to a FSFS back end, and take advantage of xdelta
compression. I was mostly after server-side features, I don't see many of our
devs use the optional locking...
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b9d7e47b-ae4b-4c8e-809a-34dad4a8044c" />
      </body>
      <title>Subversion Upgrade</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,b9d7e47b-ae4b-4c8e-809a-34dad4a8044c.aspx</guid>
      <link>http://chrison.net/SubversionUpgrade.aspx</link>
      <pubDate>Wed, 10 Aug 2005 15:29:57 GMT</pubDate>
      <description>&lt;p&gt;
This was a longer-planned upgrade to our &lt;a href="http://subversion.tigris.org"&gt;Subversion&lt;/a&gt; server
that happened today: moving from the 1.1 series to 1.2.1. It went smoothly, especially
because I played it safe by doing a &lt;a href="http://subversion.tigris.org/faq.html#dumpload"&gt;dump
/ load cycle&lt;/a&gt; (more details to be found in &lt;a href="http://svnbook.red-bean.com/en/1.0/ch05s03.html#svn-ch-5-sect-3.5"&gt;Migrating
a Repository&lt;/a&gt;) with all repositories. Safety wasn't the only concern: as detailed
in the &lt;a href="http://subversion.tigris.org/svn_1.2_releasenotes.html"&gt;release notes&lt;/a&gt;,
I also wanted to move the repositories to a FSFS back end, and take advantage of xdelta
compression.&amp;nbsp;I was mostly after server-side features, I don't see many of our
devs use the optional locking...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b9d7e47b-ae4b-4c8e-809a-34dad4a8044c" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,b9d7e47b-ae4b-4c8e-809a-34dad4a8044c.aspx</comments>
      <category>Administration</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=7aac206b-1f0e-44b4-9631-cb2cc04ddef7</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,7aac206b-1f0e-44b4-9631-cb2cc04ddef7.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,7aac206b-1f0e-44b4-9631-cb2cc04ddef7.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=7aac206b-1f0e-44b4-9631-cb2cc04ddef7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I finally got around to make a new version of SvnPostCommitHook. For one, it was about
time to include Ben's changes, and secondly I wanted to roll a new version onto our
Subversion box - it was still running on v1.3. So much for dogfooding...
</p>
        <p>
With that, here is the change log. Note that the last public version was <a href="http://chrison.net/SvnPostCommitHook15.aspx">1.5</a>:
</p>
        <p>
8/8/2005 - 1.7, Changes by Christoph Wille
</p>
        <ul>
          <li>
LookInfo getter logs when _lookinfo is null 
</li>
          <li>
MailTextOnly &amp; AppendDiffToMail properties added to .config file (text-only currently
does not send diffs anyways) 
</li>
          <li>
UU case added to svnlook parser 
</li>
          <li>
Change SvnLookOutputParser.SkipBlanks method to return bool if StringCollection hasMoreLines</li>
        </ul>
        <p>
5/14/2005 - 1.6, Changes by Ben Lowery, ben AT blowery DOT org
</p>
        <ul>
          <li>
&lt;pre&gt; blocks for code# 
</li>
          <li>
Updates CSS for new HTML 
</li>
          <li>
Logic for finding CSS updated 
</li>
          <li>
More logging</li>
        </ul>
        <p>
And here is the usual binary &amp; source code archive:
</p>
        <a href="http://chrison.net/content/binary/SvnPostCommitHook1.7.zip">SvnPostCommitHook1.7.zip
(420.75 KB)</a>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7aac206b-1f0e-44b4-9631-cb2cc04ddef7" />
      </body>
      <title>SVN Post-Commit Hook v1.7</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,7aac206b-1f0e-44b4-9631-cb2cc04ddef7.aspx</guid>
      <link>http://chrison.net/SVNPostCommitHookV17.aspx</link>
      <pubDate>Mon, 08 Aug 2005 15:39:49 GMT</pubDate>
      <description>&lt;p&gt;
I finally got around to make a new version of SvnPostCommitHook. For one, it was about
time to include Ben's changes, and secondly I wanted to roll a new version onto our
Subversion box - it was still running on v1.3. So much for dogfooding...
&lt;/p&gt;
&lt;p&gt;
With that, here is the change log. Note that the last public version was &lt;a href="http://chrison.net/SvnPostCommitHook15.aspx"&gt;1.5&lt;/a&gt;:
&lt;/p&gt;
&lt;p&gt;
8/8/2005 - 1.7, Changes by Christoph Wille
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
LookInfo getter logs when _lookinfo is null 
&lt;li&gt;
MailTextOnly &amp;amp; AppendDiffToMail properties added to .config file (text-only currently
does not send diffs anyways) 
&lt;li&gt;
UU case added to svnlook parser 
&lt;li&gt;
Change SvnLookOutputParser.SkipBlanks method to return bool if StringCollection hasMoreLines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
5/14/2005 - 1.6, Changes by Ben Lowery, ben AT blowery DOT org
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&amp;lt;pre&amp;gt; blocks for code# 
&lt;li&gt;
Updates CSS for new HTML 
&lt;li&gt;
Logic for finding CSS updated 
&lt;li&gt;
More logging&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
And here is the usual binary &amp;amp; source code archive:
&lt;/p&gt;
&lt;a href="http://chrison.net/content/binary/SvnPostCommitHook1.7.zip"&gt;SvnPostCommitHook1.7.zip
(420.75 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=7aac206b-1f0e-44b4-9631-cb2cc04ddef7" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,7aac206b-1f0e-44b4-9631-cb2cc04ddef7.aspx</comments>
      <category>Subversion</category>
      <category>this</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=30b39cc2-8175-4b20-938d-60148fcea6de</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,30b39cc2-8175-4b20-938d-60148fcea6de.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,30b39cc2-8175-4b20-938d-60148fcea6de.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=30b39cc2-8175-4b20-938d-60148fcea6de</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This post is again motivated by last week's Community Bootcamp on ASP.NET 2.0, the <a href="http://www.dotnetgerman.com/community/cbc05/">CBC05</a>.
I presented "Under the Covers - Exploring Internals, Page Lifecycle and the Compilation
Mode" from TechEd, using the samples that Simon Calvert provided me with (special
thanks fly out to Simon, Ben Miller and Rich Ersek @MS for providing us with material
- I know I can be a royal pain in the posterior... sometimes at least). 
</p>
        <p>
The talk included a demo of a database-backed virtual path provider (files don't come
from the file system but a database, dynamically). Somehow we started talking about
how cool it would be if you could test your Web sites without checking them out
from source control in the first place - by simply writing a virtual path provider
that goes to the repository on demand. I wrote that idea down.
</p>
        <p>
Actually, I didn't think I'd get around to doing that. But yesterday I decided to
pester one of my devs on the <a href="http://www.icsharpcode.net/OpenSource/SD/Default.aspx">#develop</a> project,
namely <a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.DanielGrunwald">Daniel
Grunwald</a>. He has implemented the <a href="http://subversion.tigris.org">Subversion</a> addin
for our 2.0 version, so he had experience with NSvn, the managed API for talking to
Subversion. I sent a stripped down version of the vpath provider to him, and asked
him to replace database code with NSvn code where appropriate.
</p>
        <p>
It didn't take long, and I had a command-line verified version back, and all I had
to do was make sure that it works with ASP.NET 2.0. There were a few problems I ran
into (like Subversion is case-sensitive and I didn't want that for the Web scenario).
Some of the issues arose simply because client and Web developers have different backgrounds.
Talk about path separators. Or directories where you have to drop assemblies.
</p>
        <p>
Now, let's stop talking, let's take a look at the provider in action:
</p>
        <p>
          <a href="http://chrison.net/content/binary/SvnVPathProvider.wmv">SvnVPathProvider.wmv
(3.76 MB)</a>
        </p>
        <p>
Want to get your hands on that DemoSiteSvn directory with the current rendition of
the SubversionVirtualPathProvider? No problem, just a couple of notes up front on
what you should be aware of:
</p>
        <ul>
          <li>
Only file names are currently treated specially for casing. Ie directories still do
react in a case sensitive way. 
</li>
          <li>
The file name cracking code needs to be reviewed. Currently, this is a quick hack. 
</li>
          <li>
appSettings need to be placed in a separate .config file. Reason is that web.config
cannot be obtained via a VirtualPathProvider, and thus this file has to be checked
out separately. And I don't want to get in the way of automating this by requiring
entries in web.config. 
</li>
          <li>
Package it as an assembly, so only the \bin folder needs to be copied to get up and
running. 
</li>
          <li>
The VirtualPathProvider requires (at the very least) anonymous access to the
repository. Passing security tokens is not implemented.</li>
        </ul>
        <p>
With those notes out of the way, thanks fly out to the ASP.NET team for providing
me with the sample of their virtual path provider in the first place. It has been
a tremendous help to get this thing off the ground. And maybe in turn this sample
will help others to get started:
</p>
        <p>
          <a href="http://chrison.net/content/binary/SvnVppDemo.zip">SvnVppDemo.zip (972.37
KB)</a>
        </p>
        <p>
          <strong>Installation note</strong>: the two DLLs in the system32 folder need to be
dropped in the respective folder of your system. Do not place them into \bin. Unless
you want to get into trouble, that is.
</p>
        <p>
What is left to say? Oh, the source code, of course! I thought you might be interested
in reading it online instead of having to download an almost 1MB-size file first.
Here it is (<em>App_Code\SubversionVirtualPathProvider.cs</em>):
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.IO;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Collections;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Globalization;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Configuration;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Text;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web.Util;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web.Hosting;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web.Caching;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> NSvn.Core;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> NSvn.Common;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">namespace</span> ICSharpCode.Web.Providers<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> SubversionVirtualPathProvider
: VirtualPathProvider<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">#region</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> HashCodeCombiner<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">sealed</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> HashCodeCombiner<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
Start with a seed</span><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">long</span> _combinedHash <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> 5381;<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> AddLong(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">long</span> l)<br />
            {<br />
                _combinedHash <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> ((_combinedHash
&lt;&lt; 5) <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> _combinedHash)
^ l;<br />
            }<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> CombinedHashString<br />
            {<br />
                get<br />
                {<br />
                    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> _combinedHash.ToString(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"x"</span>,
CultureInfo.InvariantCulture);<br />
                }<br />
            }<br />
}<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">#endregion</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">#region</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> SubversionVirtualFile<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">internal</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> SubversionVirtualFile
: VirtualFile<br />
    {<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fullPath;<br />
        DirectoryEntry entry;<br />
            <br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span> SubversionVirtualFile(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fullPath,
DirectoryEntry entry)<br />
                : <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">base</span>(virtualPath)<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">this</span>.fullPath <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> fullPath;<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">this</span>.entry <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> entry;<br />
        }<br />
            <br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> IsDirectory
{<br />
            get {<br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> entry.NodeKind
== NodeKind.Directory;<br />
            }<br />
        }<br />
            <br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">override</span> Stream
concat()<br />
        {<br />
            Client client <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> Client();<br />
            MemoryStream
ms <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> MemoryStream();<br />
            client.Cat(ms,
fullPath, Revision.Head);<br /><br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
.Cat closes the stream, so we have to copy it</span><br />
            MemoryStream
ms2 <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> MemoryStream(ms.GetBuffer());<br />
            ms2.Position <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> 0;<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> ms2;<br />
        }<br />
}<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">#endregion</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> AppInitialize()<br />
    {<br />
        SubversionVirtualPathProvider provider <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SubversionVirtualPathProvider();<br />
        HostingEnvironment.RegisterVirtualPathProvider(provider);<br />
    }<br />
        <br />
    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> GetSvnFullpath(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath)<br />
    {<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span>.Parse(ConfigurationManager.AppSettings[<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"svnvppStripVdir"</span>]))<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
this will break root Webs, StripVdir should be the default however</span><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> virtualPath.IndexOf('<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/</span>',
1);<br />
            virtualPath <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> virtualPath.Substring(pos,
virtualPath.Length <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">-</span> pos);<br />
        }<br /><br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> ConfigurationManager.AppSettings[<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"svnvppRepositoryUrl"</span>]<br />
            <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> virtualPath;<br />
        }<br /><br />
    <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> GetSvnFullpath(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fileName)<br />
    {<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> FixupSvnFullpath(GetSvnFullpath(virtualPath),
fileName);<br />
    }<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">    </font>//
Subversion is case sensitive, this we switch the filename here</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">    </font>string</span> FixupSvnFullpath(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> svnPath, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fileName)<br />
    {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">        </font>int</span> pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> svnPath.LastIndexOf('<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/</span>');<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">        </font>string</span> parentDirectory <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> svnPath.Substring(0,
pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> 1);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><font color="#000000">        </font>return</span> parentDirectory <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> fileName;<br />
    }<br />
        <br />
    DirectoryEntry GetEntry(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath)<br />
    {<br />
        Client svnClient <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> Client();<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> fullPath <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetSvnFullpath(virtualPath);<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> fullPath.LastIndexOf('<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/</span>');<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> parentDirectory <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> fullPath.Substring(0,
pos);<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> entryName <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> fullPath.Substring(pos <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">+</span> 1);<br /><br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">try</span><br />
        {<br />
            DirectoryEntry[]
entries <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> svnClient.List(parentDirectory,
Revision.Head, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">false</span>);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">foreach</span> (DirectoryEntry
entry <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">in</span> entries) <br />
            {   <br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (0
== String.Compare(entry.Path, entryName, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">true</span>))<br />
                        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> entry;<br />
            }<br /><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;<br />
        } 
<br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">catch</span> (SvnClientException
ex) 
<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (ex.ErrorCode
== 160013) <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
parent directory not found</span><br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;<br /><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">throw</span>;<br />
        }<br />
    }<br />
        <br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> FileExists(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath)<br />
        {<br />
            DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualPath);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>)<br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> e.NodeKind
== NodeKind.File;<br /><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> Previous.FileExists(virtualPath);<br />
        }<br />
        <br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> DirectoryExists(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualDir)<br />
        {<br />
            DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualDir);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>)<br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> e.NodeKind
== NodeKind.Directory;<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> Previous.FileExists(virtualDir);<br />
        }<br />
        <br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
Obtain the file. This will only be called if the hash that we return is</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
different than that the runtime holds on to as a cached indicator.</span><br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">override</span> VirtualFile
GetFile(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath)<br />
        {<br />
            DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualPath);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>)<br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SubversionVirtualFile(virtualPath,
GetSvnFullpath(virtualPath, e.Path), e);<br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
Default to the previous implementation</span><br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> Previous.GetFile(virtualPath);<br />
        }<br />
        <br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
///////////////////////////////////////////////////////////////</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
Return a hash value indicating a key to test this file and dependencies have not been</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
modified</span><br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">override</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> GetFileHash(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath,
IEnumerable virtualPathDependencies)<br />
        {<br />
            HashCodeCombiner
hashCodeCombiner <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> HashCodeCombiner();<br />
            <br />
            ArrayList
unrecognizedDependencies <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> ArrayList();<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">foreach</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualDependency <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">in</span> virtualPathDependencies)<br />
            {<br />
                DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualDependency);<br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>)
{<br />
                    hashCodeCombiner.AddLong(e.Size);<br />
                    hashCodeCombiner.AddLong(e.CreatedRevision);<br />
                } <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">else</span> {<br />
                    unrecognizedDependencies.Add(unrecognizedDependencies);<br />
                }<br />
            }<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> result <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> hashCodeCombiner.CombinedHashString;<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (unrecognizedDependencies.Count
&gt; 0)<br />
            {<br />
                result
+= Previous.GetFileHash(virtualPath, unrecognizedDependencies);<br />
            }<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> result;<br />
        }<br />
        <br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
///////////////////////////////////////////////////////////////</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
The cache dependency is a specialized object that means that the runtime</span><br />
        <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">///
can perform file monitoring and change notifications directly</span><br />
        <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">override</span> CacheDependency
GetCacheDependency(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> virtualPath,
IEnumerable virtualPathDependencies, DateTime utcStart)<br />
        {<br />
            <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//
This VPP does not create CacheDependencies</span><br />
            DirectoryEntry
e <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetEntry(virtualPath);<br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span> (e
!<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>)<br />
                <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">null</span>;<br />
            <br />
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> Previous.GetCacheDependency(virtualPath,
virtualPathDependencies, utcStart);<br />
        }<br />
    }<br />
}<br /></span>
        </p>
        <p>
 
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=30b39cc2-8175-4b20-938d-60148fcea6de" />
      </body>
      <title>Writing a Subversion-backed VirtualPathProvider for ASP.NET 2.0</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,30b39cc2-8175-4b20-938d-60148fcea6de.aspx</guid>
      <link>http://chrison.net/WritingASubversionbackedVirtualPathProviderForASPNET20.aspx</link>
      <pubDate>Wed, 27 Jul 2005 06:18:56 GMT</pubDate>
      <description>&lt;p&gt;
This post is again motivated by last week's Community Bootcamp on ASP.NET 2.0, the &lt;a href="http://www.dotnetgerman.com/community/cbc05/"&gt;CBC05&lt;/a&gt;.
I presented "Under the Covers - Exploring Internals, Page Lifecycle and the Compilation
Mode" from TechEd, using the samples that Simon Calvert provided me with (special
thanks fly out to Simon, Ben Miller and Rich Ersek @MS for providing us with material
- I know I can be a royal pain in the posterior... sometimes at least). 
&lt;/p&gt;
&lt;p&gt;
The talk included a demo of a database-backed virtual path provider (files don't come
from the file system but a database, dynamically). Somehow we started talking about
how cool it would&amp;nbsp;be if you could test your Web sites without checking them out
from source control in the first place - by simply writing a virtual path provider
that goes to the repository on demand. I wrote that idea down.
&lt;/p&gt;
&lt;p&gt;
Actually, I didn't think I'd get around to doing that. But yesterday I decided to
pester one of my devs on the &lt;a href="http://www.icsharpcode.net/OpenSource/SD/Default.aspx"&gt;#develop&lt;/a&gt; project,
namely &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.DanielGrunwald"&gt;Daniel
Grunwald&lt;/a&gt;. He has implemented the &lt;a href="http://subversion.tigris.org"&gt;Subversion&lt;/a&gt; addin
for our 2.0 version, so he had experience with NSvn, the managed API for talking to
Subversion. I sent a stripped down version of the vpath provider to him, and asked
him to replace database code with NSvn code where appropriate.
&lt;/p&gt;
&lt;p&gt;
It didn't take long, and I had a command-line verified version back, and all I had
to do was make sure that it works with ASP.NET 2.0. There were a few problems I ran
into (like Subversion is case-sensitive and I didn't want that for the Web scenario).
Some of the issues arose simply because client and Web developers have different backgrounds.
Talk about path separators. Or directories where you have to drop assemblies.
&lt;/p&gt;
&lt;p&gt;
Now, let's stop talking, let's take a look at the provider in action:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/SvnVPathProvider.wmv"&gt;SvnVPathProvider.wmv
(3.76 MB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Want to get your hands on that DemoSiteSvn directory with the current rendition of
the SubversionVirtualPathProvider? No problem, just a couple of notes up front on
what you should be aware of:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Only file names are currently treated specially for casing. Ie directories still do
react in a case sensitive way. 
&lt;li&gt;
The file name cracking code needs to be reviewed. Currently, this is a quick hack. 
&lt;li&gt;
appSettings need to be placed in a separate .config file. Reason is that web.config
cannot be obtained via a VirtualPathProvider, and thus this file has to be checked
out separately. And I don't want to get in the way of automating this by requiring
entries in web.config. 
&lt;li&gt;
Package it as an assembly, so only the \bin folder needs to be copied to get up and
running. 
&lt;li&gt;
The VirtualPathProvider requires (at the very least)&amp;nbsp;anonymous access to the
repository. Passing security tokens is not implemented.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
With those notes out of the way, thanks fly out to the ASP.NET team for providing
me with the sample of their virtual path provider in the first place. It has been
a tremendous help to get this thing off the ground. And maybe in turn this sample
will help others to get started:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/SvnVppDemo.zip"&gt;SvnVppDemo.zip (972.37
KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Installation note&lt;/strong&gt;: the two DLLs in the system32 folder need to be
dropped in the respective folder of your system. Do not place them into \bin. Unless
you want to get into trouble, that is.
&lt;/p&gt;
&lt;p&gt;
What is left to say? Oh, the source code, of course! I thought you might be interested
in reading it online instead of having to download an almost 1MB-size file first.
Here it is (&lt;em&gt;App_Code\SubversionVirtualPathProvider.cs&lt;/em&gt;):
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.IO;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Collections;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Globalization;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Configuration;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Text;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web.Util;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web.Hosting;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web.Caching;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; NSvn.Core;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; NSvn.Common;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;namespace&lt;/span&gt; ICSharpCode.Web.Providers&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; SubversionVirtualPathProvider
: VirtualPathProvider&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;#region&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; HashCodeCombiner&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;sealed&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; HashCodeCombiner&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
Start with a seed&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;long&lt;/span&gt; _combinedHash &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 5381;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; AddLong(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;long&lt;/span&gt; l)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_combinedHash &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; ((_combinedHash
&amp;lt;&amp;lt; 5) &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; _combinedHash)
^ l;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; CombinedHashString&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; _combinedHash.ToString(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"x"&lt;/span&gt;,
CultureInfo.InvariantCulture);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;#endregion&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;#region&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; SubversionVirtualFile&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;internal&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; SubversionVirtualFile
: VirtualFile&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fullPath;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry entry;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; SubversionVirtualFile(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fullPath,
DirectoryEntry entry)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;: &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;base&lt;/span&gt;(virtualPath)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;this&lt;/span&gt;.fullPath &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; fullPath;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;this&lt;/span&gt;.entry &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; entry;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; IsDirectory
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; entry.NodeKind
== NodeKind.Directory;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; Stream
concat()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Client client &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; Client();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemoryStream
ms &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; MemoryStream();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.Cat(ms,
fullPath, Revision.Head);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
.Cat closes the stream, so we have to copy it&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MemoryStream
ms2 &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; MemoryStream(ms.GetBuffer());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ms2.Position &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; 0;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; ms2;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;#endregion&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; AppInitialize()&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SubversionVirtualPathProvider provider &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SubversionVirtualPathProvider();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HostingEnvironment.RegisterVirtualPathProvider(provider);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; GetSvnFullpath(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt;.Parse(ConfigurationManager.AppSettings[&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"svnvppStripVdir"&lt;/span&gt;]))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
this will break root Webs, StripVdir should be the default however&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; virtualPath.IndexOf('&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/&lt;/span&gt;',
1);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;virtualPath &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; virtualPath.Substring(pos,
virtualPath.Length &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;-&lt;/span&gt; pos);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; ConfigurationManager.AppSettings[&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"svnvppRepositoryUrl"&lt;/span&gt;]&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; virtualPath;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; GetSvnFullpath(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fileName)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; FixupSvnFullpath(GetSvnFullpath(virtualPath),
fileName);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;//
Subversion is case sensitive, this we switch the filename here&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;string&lt;/span&gt; FixupSvnFullpath(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; svnPath, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fileName)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;int&lt;/span&gt; pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; svnPath.LastIndexOf('&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/&lt;/span&gt;');&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;string&lt;/span&gt; parentDirectory &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; svnPath.Substring(0,
pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; 1);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;return&lt;/span&gt; parentDirectory &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; fileName;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry GetEntry(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Client svnClient &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; Client();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; fullPath &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetSvnFullpath(virtualPath);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; fullPath.LastIndexOf('&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/&lt;/span&gt;');&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; parentDirectory &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; fullPath.Substring(0,
pos);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; entryName &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; fullPath.Substring(pos &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;+&lt;/span&gt; 1);&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;try&lt;/span&gt; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry[]
entries &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; svnClient.List(parentDirectory,
Revision.Head, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;false&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;foreach&lt;/span&gt; (DirectoryEntry
entry &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;in&lt;/span&gt; entries)&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (0
== String.Compare(entry.Path, entryName, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;true&lt;/span&gt;))&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; entry;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;catch&lt;/span&gt; (SvnClientException
ex) 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (ex.ErrorCode
== 160013) &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
parent directory not found&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;throw&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; FileExists(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualPath);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; e.NodeKind
== NodeKind.File;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; Previous.FileExists(virtualPath);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; DirectoryExists(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualDir)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualDir);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; e.NodeKind
== NodeKind.Directory;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; Previous.FileExists(virtualDir);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
Obtain the file. This will only be called if the hash that we return is&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
different than that the runtime holds on to as a cached indicator.&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; VirtualFile
GetFile(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualPath);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SubversionVirtualFile(virtualPath,
GetSvnFullpath(virtualPath, e.Path), e);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
Default to the previous implementation&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; Previous.GetFile(virtualPath);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
///////////////////////////////////////////////////////////////&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
Return a hash value indicating a key to test this file and dependencies have not been&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
modified&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; GetFileHash(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath,
IEnumerable virtualPathDependencies)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HashCodeCombiner
hashCodeCombiner &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; HashCodeCombiner();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ArrayList
unrecognizedDependencies &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; ArrayList();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;foreach&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualDependency &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;in&lt;/span&gt; virtualPathDependencies)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualDependency);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hashCodeCombiner.AddLong(e.Size);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hashCodeCombiner.AddLong(e.CreatedRevision);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;else&lt;/span&gt; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unrecognizedDependencies.Add(unrecognizedDependencies);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; result &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; hashCodeCombiner.CombinedHashString;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (unrecognizedDependencies.Count
&amp;gt; 0)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result
+= Previous.GetFileHash(virtualPath, unrecognizedDependencies);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; result;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
///////////////////////////////////////////////////////////////&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
The cache dependency is a specialized object that means that the runtime&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;///
can perform file monitoring and change notifications directly&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; CacheDependency
GetCacheDependency(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; virtualPath,
IEnumerable virtualPathDependencies, DateTime utcStart)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
This VPP does not create CacheDependencies&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DirectoryEntry
e &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetEntry(virtualPath);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt; (e
!&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; Previous.GetCacheDependency(virtualPath,
virtualPathDependencies, utcStart);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=30b39cc2-8175-4b20-938d-60148fcea6de" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,30b39cc2-8175-4b20-938d-60148fcea6de.aspx</comments>
      <category>2 Ohhhh</category>
      <category>ASP.NET</category>
      <category>Community</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=6ae9a161-8ef0-4a0c-a5dc-834c032b244f</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,6ae9a161-8ef0-4a0c-a5dc-834c032b244f.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,6ae9a161-8ef0-4a0c-a5dc-834c032b244f.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6ae9a161-8ef0-4a0c-a5dc-834c032b244f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Another release based on contributions by Ben Lowery:
</p>
        <ul>
          <li>
Colorized diff support 
</li>
          <li>
CSS uses an external CSS file.  No longer in the code. 
</li>
          <li>
Added configuration setting for CSS file to use 
</li>
          <li>
Added "svnlook changes" parsing support for _U (property updates) 
</li>
        </ul>
        <p>
          <a href="http://chrison.net/content/binary/SvnPostCommitHookv1.5.zip">SvnPostCommitHookv1.5.zip
(420.62 KB)</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=6ae9a161-8ef0-4a0c-a5dc-834c032b244f" />
      </body>
      <title>SvnPostCommitHook 1.5</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,6ae9a161-8ef0-4a0c-a5dc-834c032b244f.aspx</guid>
      <link>http://chrison.net/SvnPostCommitHook15.aspx</link>
      <pubDate>Fri, 13 May 2005 08:10:03 GMT</pubDate>
      <description>&lt;p&gt;
Another release based on contributions by Ben Lowery:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Colorized diff support 
&lt;li&gt;
CSS uses an external CSS file.&amp;nbsp; No longer in the code. 
&lt;li&gt;
Added configuration setting for CSS file to use 
&lt;li&gt;
Added "svnlook changes" parsing support for _U (property updates) 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/SvnPostCommitHookv1.5.zip"&gt;SvnPostCommitHookv1.5.zip
(420.62 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=6ae9a161-8ef0-4a0c-a5dc-834c032b244f" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,6ae9a161-8ef0-4a0c-a5dc-834c032b244f.aspx</comments>
      <category>Cool Download</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=8cc24c28-ae54-4333-aa35-20ead4ed6e22</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,8cc24c28-ae54-4333-aa35-20ead4ed6e22.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,8cc24c28-ae54-4333-aa35-20ead4ed6e22.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=8cc24c28-ae54-4333-aa35-20ead4ed6e22</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Ben Lowery sent me changes for the SvnPostCommitHook application. From his email: <em>Here's
my version of the code.  I updated it to be able to use DotNetOpenMail,
as I sometimes have problems using CDO through System.Web.Mail. I also updated it
to support a pluggable mail formatter, with a text and an HTML formatter in the current
code.  At the moment, it's up to the mailer to decide how mail is sent,
but that could be easily pulled out into a config file at some point, as could
the format of the html or the css that I'm using.</em></p>
        <p>
Change log details:
</p>
        <ul>
          <li>
Added abstract base for mailing 
</li>
          <li>
Moved System.Web.Mail based mailer to CdoMailer 
</li>
          <li>
Added option to send mail with DotNetOpenMail 
</li>
          <li>
Added MessageFormatter hierarchy for message formatting 
</li>
          <li>
Added HtmlMessageFormatter for html change messages 
</li>
          <li>
Moved text message formatting into TextMessageFormatter 
</li>
          <li>
Added package batch script to rename exe to post-commit.exe 
</li>
          <li>
Added Library directory for references 
</li>
          <li>
Added log4net to the Library directory 
</li>
          <li>
Made SilentCmdLineApplication::Execute simpler 
</li>
          <li>
Moved parsing logic into SvnLookOutputParser</li>
        </ul>
        <p>
          <a href="http://chrison.net/content/binary/SvnPostCommitHookv1.4.zip">SvnPostCommitHookv1.4.zip
(417.83 KB)</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=8cc24c28-ae54-4333-aa35-20ead4ed6e22" />
      </body>
      <title>New version of SvnPostCommitHook</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,8cc24c28-ae54-4333-aa35-20ead4ed6e22.aspx</guid>
      <link>http://chrison.net/NewVersionOfSvnPostCommitHook.aspx</link>
      <pubDate>Mon, 02 May 2005 17:09:01 GMT</pubDate>
      <description>&lt;p&gt;
Ben Lowery sent me changes for the SvnPostCommitHook application. From his email: &lt;em&gt;Here's
my version of the code.&amp;nbsp; I updated it to be able to use&amp;nbsp;DotNetOpenMail,
as I sometimes have problems using CDO through System.Web.Mail. I also updated it
to support a pluggable mail formatter, with a text and an HTML formatter in the current
code.&amp;nbsp; At&amp;nbsp;the moment, it's up to the mailer to decide how mail is sent,
but that&amp;nbsp;could be easily pulled out into a config file at some point, as could
the format of the html or the css that I'm using.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Change log details:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Added abstract base for mailing 
&lt;li&gt;
Moved System.Web.Mail based mailer to CdoMailer 
&lt;li&gt;
Added option to send mail with DotNetOpenMail 
&lt;li&gt;
Added MessageFormatter hierarchy for message formatting 
&lt;li&gt;
Added HtmlMessageFormatter for html change messages 
&lt;li&gt;
Moved text message formatting into TextMessageFormatter 
&lt;li&gt;
Added package batch script to rename exe to post-commit.exe 
&lt;li&gt;
Added Library directory for references 
&lt;li&gt;
Added log4net to the Library directory 
&lt;li&gt;
Made SilentCmdLineApplication::Execute simpler 
&lt;li&gt;
Moved parsing logic into SvnLookOutputParser&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/SvnPostCommitHookv1.4.zip"&gt;SvnPostCommitHookv1.4.zip
(417.83 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=8cc24c28-ae54-4333-aa35-20ead4ed6e22" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,8cc24c28-ae54-4333-aa35-20ead4ed6e22.aspx</comments>
      <category>Subversion</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=a64ed4d4-a950-49c8-ba49-78ba7188d23d</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,a64ed4d4-a950-49c8-ba49-78ba7188d23d.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,a64ed4d4-a950-49c8-ba49-78ba7188d23d.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a64ed4d4-a950-49c8-ba49-78ba7188d23d</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In the second installation of my <a href="http://svk.elixus.org/?SVKWin32">SVK</a> article
series, I'm taking my <a href="http://subversion.tigris.org">Subversion</a> repository
offline on my notebook, do some work, reconnect and merge my changes with the central
Subversion repository. 
</p>
        <p>
To work with SVK, you don't need the Subversion service (svnserve) running. Another
bonus is that SVK doesn't create the (dreaded, I might say) .svn folders, which (a)
roughly double the disk size of your project, (b) get you into hot water with VS.NET,
which is why there is a TortoiseSVN build that names the .svn folders differently.
But I digress.
</p>
        <p>
First, we have to create a local copy (the one created in the <a href="http://chrison.net/MirrorMirrorOnTheWall.aspx">previous
article</a> is directly linked to the remote repository):
</p>
        <pre>svk cp //SharpDevelop/trunk //SharpDevelop/local</pre>
        <p>
This will also prompt you in Notepad for a commit message. Alternatively, you could
have passed the commit message as part of the cmd line:
</p>
        <pre>svk cp -m "initial import" //SharpDevelop/trunk //SharpDevelop/local</pre>
        <p>
Now, check out the local branch to a directory on disk (note: this directory will
be auto-created).
</p>
        <pre>svk checkout //SharpDevelop/local c:\workingcopy</pre>
        <p>
You will be positively surprised how fast this is. And there are no .svn directories
in sight. So let's change a file and commit it back to our local repository:
</p>
        <pre>svk commit -m "v2.06 note" readme.txt</pre>
        <p>
This file is <strong>only</strong> changed in the local repository, not the remote
one. But this is the intention of working offline (during travel, at home, you name
it).
</p>
        <p>
How do we get the changes back into the central repository? First, sync the trunk
with the remote repository:
</p>
        <pre>svk sync //SharpDevelop/trunk</pre>
        <p>
If you have multiple repositories on your computer that you want to sync in one go,
use:
</p>
        <pre>svk sync -a</pre>
        <p>
So, let's see if our changes conflict with changes in the central repository:
</p>
        <pre>
          <em>svk smerge -C //SharpDevelop/local //SharpDevelop/trunk</em>
          <br />
Auto-merging (0, 1900) /SharpDevelop/local to /SharpDevelop/trunk (base /SharpDevelop/trunk:1897).<br />
Checking locally against mirror source svn://glumpatweri.emailgwiax.com/Fidalgo/trunk.<br />
U   SharpDevelop/setup/readme.txt<br />
New merge ticket: 4c8874e7-0e9e-2041-95c6-598e77699a82:/SharpDevelop/local:1900</pre>
        <p>
If there are no problems (as is the case here), go ahead and perform the merge:
</p>
        <pre>svk smerge //SharpDevelop/local //SharpDevelop/trunk</pre>
        <p>
You are again prompted for the commit message, however, this time remember this is
for the total of your changes (unless you use -I). Depending on your Subversion setup,
you will be prompted to provide a password:
</p>
        <pre>Password for 'Administrator':</pre>
        <p>
Well, most likely you are not known by this account in Subversion... simply press
Enter, and you will be prompted for a different username. A tad counterintuitive at
first, but it works. The change is now in the central repository.
</p>
        <p>
There is one thing left to do - merge the changes from the trunk (which you synced
previously) into the local copy:
</p>
        <pre>svk smerge //SharpDevelop/trunk //SharpDevelop/local</pre>
        <p>
And finally update your checked out working directory:
</p>
        <pre>svk up c:\workingcopy</pre>
        <p>
Now that wasn't too bad at all. Especially given the fact that you were working offline
from a central repository. Oh, and the procedure is for real: revision 1909 in the <a href="http://www.icsharpcode.net/opensource/sd/">#develop</a> repository
resulted from me writing this step list.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a64ed4d4-a950-49c8-ba49-78ba7188d23d" />
      </body>
      <title>Going local with SVK</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,a64ed4d4-a950-49c8-ba49-78ba7188d23d.aspx</guid>
      <link>http://chrison.net/GoingLocalWithSVK.aspx</link>
      <pubDate>Tue, 26 Apr 2005 10:57:07 GMT</pubDate>
      <description>&lt;p&gt;
In the second installation of my &lt;a href="http://svk.elixus.org/?SVKWin32"&gt;SVK&lt;/a&gt; article
series, I'm taking my &lt;a href="http://subversion.tigris.org"&gt;Subversion&lt;/a&gt; repository
offline on my notebook, do some work, reconnect and merge my changes with the central
Subversion repository. 
&lt;/p&gt;
&lt;p&gt;
To work with SVK, you don't need the Subversion service (svnserve) running. Another
bonus is that SVK doesn't create the (dreaded, I might say) .svn folders, which (a)
roughly double the disk size of your project, (b) get you into hot water with VS.NET,
which is why there is a TortoiseSVN build that names the .svn folders differently.
But I digress.
&lt;/p&gt;
&lt;p&gt;
First, we have to create a local copy (the one created in the &lt;a href="http://chrison.net/MirrorMirrorOnTheWall.aspx"&gt;previous
article&lt;/a&gt; is directly linked to the remote repository):
&lt;/p&gt;
&lt;pre&gt;svk cp //SharpDevelop/trunk //SharpDevelop/local&lt;/pre&gt;
&lt;p&gt;
This will also prompt you in Notepad for a commit message. Alternatively, you could
have passed the commit message as part of the cmd line:
&lt;/p&gt;
&lt;pre&gt;svk cp -m "initial import" //SharpDevelop/trunk //SharpDevelop/local&lt;/pre&gt;
&lt;p&gt;
Now, check out the local branch to a directory on disk (note: this directory will
be auto-created).
&lt;/p&gt;
&lt;pre&gt;svk checkout //SharpDevelop/local c:\workingcopy&lt;/pre&gt;
&lt;p&gt;
You will be positively surprised how fast this is. And there are no .svn directories
in sight. So let's change a file and commit it back to our local repository:
&lt;/p&gt;
&lt;pre&gt;svk commit -m "v2.06 note" readme.txt&lt;/pre&gt;
&lt;p&gt;
This file is &lt;strong&gt;only&lt;/strong&gt; changed in the local repository, not the remote
one. But this is the intention of working offline (during travel, at home, you name
it).
&lt;/p&gt;
&lt;p&gt;
How do we get the changes back into the central repository? First, sync the trunk
with the remote repository:
&lt;/p&gt;
&lt;pre&gt;svk sync //SharpDevelop/trunk&lt;/pre&gt;
&lt;p&gt;
If you have multiple repositories on your computer that you want to sync in one go,
use:
&lt;/p&gt;
&lt;pre&gt;svk sync -a&lt;/pre&gt;
&lt;p&gt;
So, let's see if our changes conflict with changes in the central repository:
&lt;/p&gt;
&lt;pre&gt;&lt;em&gt;svk smerge -C //SharpDevelop/local //SharpDevelop/trunk&lt;/em&gt;
&lt;br&gt;
Auto-merging (0, 1900) /SharpDevelop/local to /SharpDevelop/trunk (base /SharpDevelop/trunk:1897).&lt;br&gt;
Checking locally against mirror source svn://glumpatweri.emailgwiax.com/Fidalgo/trunk.&lt;br&gt;
U&amp;nbsp;&amp;nbsp; SharpDevelop/setup/readme.txt&lt;br&gt;
New merge ticket: 4c8874e7-0e9e-2041-95c6-598e77699a82:/SharpDevelop/local:1900&lt;/pre&gt;
&lt;p&gt;
If there are no problems (as is the case here), go ahead and perform the merge:
&lt;/p&gt;
&lt;pre&gt;svk smerge //SharpDevelop/local //SharpDevelop/trunk&lt;/pre&gt;
&lt;p&gt;
You are again prompted for the commit message, however, this time remember this is
for the total of your changes (unless you use -I). Depending on your Subversion setup,
you will be prompted to provide a password:
&lt;/p&gt;
&lt;pre&gt;Password for 'Administrator':&lt;/pre&gt;
&lt;p&gt;
Well, most likely you are not known by this account in Subversion... simply press
Enter, and you will be prompted for a different username. A tad counterintuitive at
first, but it works. The change is now in the central repository.
&lt;/p&gt;
&lt;p&gt;
There is one thing left to do - merge the changes from the trunk (which you synced
previously) into the local copy:
&lt;/p&gt;
&lt;pre&gt;svk smerge //SharpDevelop/trunk //SharpDevelop/local&lt;/pre&gt;
&lt;p&gt;
And finally update your checked out working directory:
&lt;/p&gt;
&lt;pre&gt;svk up c:\workingcopy&lt;/pre&gt;
&lt;p&gt;
Now that wasn't too bad at all. Especially given the fact that you were working offline
from a central repository. Oh, and the procedure is for real: revision 1909 in the &lt;a href="http://www.icsharpcode.net/opensource/sd/"&gt;#develop&lt;/a&gt; repository
resulted from me writing this step list.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=a64ed4d4-a950-49c8-ba49-78ba7188d23d" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,a64ed4d4-a950-49c8-ba49-78ba7188d23d.aspx</comments>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=88aa18af-4366-4e2e-b43e-0aedc19b1f07</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,88aa18af-4366-4e2e-b43e-0aedc19b1f07.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,88aa18af-4366-4e2e-b43e-0aedc19b1f07.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=88aa18af-4366-4e2e-b43e-0aedc19b1f07</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Beauty is not tonights topic, neither a talking mirror - Subversion repository mirrors
are. There are a couple of ways to mirroring your repository, one being <a href="http://search.cpan.org/dist/SVN-Mirror/">SVN::Mirror</a>.
With my pronounced distaste for the make install dance, I was on the prowl for some
solution with a more Windowsy touch to it.
</p>
        <p>
Not too long into Google-Fu I stumbled across <a href="http://svk.elixus.org/">SVK</a>,
which has (a) a <a href="http://svk.elixus.org/?SVKWin32">WIN32 setup</a>, (b) loads
of features which will be the topic of future blog posts:
</p>
        <ul>
          <li>
Trans-backend mirror and sync for Subversion, CVS, Perforce (not on Windows currently
if I gather correctly) 
</li>
          <li>
All operations can be performed while offline. Now that is way cool if you are working
while travelling!</li>
        </ul>
        <p>
SVK uses Subversion FSFS for local storage, which means prior to installing SVK you
need to install <a href="http://subversion.tigris.org">Subversion</a>. With both packages
on your machine, you can start exploring. All you need is a command prompt and
Windows Explorer.
</p>
        <pre>svk depot --init</pre>
        <p>
This will initialize the // (default) depot. Create c:\svkroot, we will relocate the
default repository there next.
</p>
        <pre>svk depot --relocate // c:\svkroot</pre>
        <p>
I am not really interested in hosting a read-only copy of a Subversion repository
in my user profile. Thus for this relocation to proceed, you also need to copy the
contents of C:\Documents and Settings\Administrator\.svk\local (which is a bare bones
SVN repository) into the c:\svkroot directory.
</p>
        <pre>svk mirror svn://glumpatweri.emailgwiax.com/Fidalgo/trunk //SharpDevelop/trunk</pre>
        <p>
Now the mirroring can begin - svk mirror is used to set up a link to an existing Subversion
repository.
</p>
        <pre>svk sync //SharpDevelop/trunk</pre>
        <p>
Depending on the repository, grab a cup of coffee. This sync operation will take some
time. Oh, and for keeping a mirrored repository in sync with the master, create a
scheduled task with this command.
</p>
        <pre>svnserve -d -r c:\svkroot</pre>
        <p>
Testing, testing. Fire up svnserve and use <a href="http://tortoisesvn.tigris.org">TortoiseSVN</a> to
check out the read-only mirror:
</p>
        <p>
          <img src="http://chrison.net/content/binary/repobrowsersvkentry.png" border="0" />
        </p>
        <p>
Done. You have successfully mirrored a Subversion repository. Read-only. Working offline
and other features of SVK will be covered later.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=88aa18af-4366-4e2e-b43e-0aedc19b1f07" />
      </body>
      <title>Mirror, mirror on the wall</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,88aa18af-4366-4e2e-b43e-0aedc19b1f07.aspx</guid>
      <link>http://chrison.net/MirrorMirrorOnTheWall.aspx</link>
      <pubDate>Mon, 25 Apr 2005 17:40:50 GMT</pubDate>
      <description>&lt;p&gt;
Beauty is not tonights topic, neither a talking mirror - Subversion repository mirrors
are. There are a couple of ways to mirroring your repository, one being &lt;a href="http://search.cpan.org/dist/SVN-Mirror/"&gt;SVN::Mirror&lt;/a&gt;.
With my pronounced distaste for the make install dance, I was on the prowl for some
solution with a more Windowsy touch to it.
&lt;/p&gt;
&lt;p&gt;
Not too long into Google-Fu I stumbled across &lt;a href="http://svk.elixus.org/"&gt;SVK&lt;/a&gt;,
which has (a) a &lt;a href="http://svk.elixus.org/?SVKWin32"&gt;WIN32 setup&lt;/a&gt;, (b) loads
of features which will be the topic of future blog posts:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Trans-backend mirror and sync for Subversion, CVS, Perforce (not on Windows currently
if I gather correctly) 
&lt;li&gt;
All operations can be performed while offline. Now that is way cool if you are working
while travelling!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
SVK uses Subversion FSFS for local storage, which means prior to installing SVK you
need to install &lt;a href="http://subversion.tigris.org"&gt;Subversion&lt;/a&gt;. With both packages
on your machine, you can start exploring.&amp;nbsp;All you need is a command prompt and
Windows Explorer.
&lt;/p&gt;
&lt;pre&gt;svk depot --init&lt;/pre&gt;
&lt;p&gt;
This will initialize the // (default) depot. Create c:\svkroot, we will relocate the
default repository there next.
&lt;/p&gt;
&lt;pre&gt;svk depot --relocate // c:\svkroot&lt;/pre&gt;
&lt;p&gt;
I am not really interested in hosting a read-only copy of a Subversion repository
in my user profile. Thus for this relocation to proceed, you also need to copy the
contents of C:\Documents and Settings\Administrator\.svk\local (which is a bare bones
SVN repository) into the c:\svkroot directory.
&lt;/p&gt;
&lt;pre&gt;svk mirror svn://glumpatweri.emailgwiax.com/Fidalgo/trunk //SharpDevelop/trunk&lt;/pre&gt;
&lt;p&gt;
Now the mirroring can begin - svk mirror is used to set up a link to an existing Subversion
repository.
&lt;/p&gt;
&lt;pre&gt;svk sync //SharpDevelop/trunk&lt;/pre&gt;
&lt;p&gt;
Depending on the repository, grab a cup of coffee. This sync operation will take some
time. Oh, and for keeping a mirrored repository in sync with the master, create a
scheduled task with this command.
&lt;/p&gt;
&lt;pre&gt;svnserve -d -r c:\svkroot&lt;/pre&gt;
&lt;p&gt;
Testing, testing. Fire up svnserve and use &lt;a href="http://tortoisesvn.tigris.org"&gt;TortoiseSVN&lt;/a&gt; to
check out the read-only mirror:
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://chrison.net/content/binary/repobrowsersvkentry.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Done. You have successfully mirrored a Subversion repository. Read-only. Working offline
and other features of SVK will be covered later.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=88aa18af-4366-4e2e-b43e-0aedc19b1f07" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,88aa18af-4366-4e2e-b43e-0aedc19b1f07.aspx</comments>
      <category>Administration</category>
      <category>Cool Download</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=ad86e2de-73c9-41dc-8be0-d448130b2f06</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,ad86e2de-73c9-41dc-8be0-d448130b2f06.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,ad86e2de-73c9-41dc-8be0-d448130b2f06.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ad86e2de-73c9-41dc-8be0-d448130b2f06</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
The post commit hook for Subversion now has reached a stage where I consider it feature
complete. Newly added for this release:
</p>
        <ul>
          <li>
            <a href="http://logging.apache.org/log4net/">log4net</a> for logging important information
(ie exceptions) necessary for debugging a hook that is supposed to run automatically.
Note that it uses v1.2.9 of log4net, which is a Beta release. The log file name is
post-commit.log (you can change this in post-commit.exe.config) 
</li>
          <li>
Nicely formatted commit mail. The change log line items are parsed, the A, U &amp;
D information is used to build Added, Modified &amp; Deleted sections in the message.</li>
        </ul>
        <p>
Here is an example of the message format (from the <a href="http://www.glengamoi.com/mailman/listinfo/icsharpcode.sharpdevelop-svn-commit">#develop
commit mailing list</a>):
</p>
        <pre>Author: mattward<br />
Date: 2005-04-10 20:06:25 +0200 (So, 10 Apr 2005)<br />
New Revision: 1840<br />
Log Message:<br />
Added basic .manifest schema.  Schema annotation displayed alongside 
<br />
auto-completion list. Mixed namespaces and simple content types 
<br />
now supported.  Added attribute value auto-completion.<br /><br />
Added:<br />
trunk/SharpDevelop/data/schemas/manifest.xsd<br />
....<br />
trunk/SharpDevelop/src/AddIns/.../SimpleContentWithAttributeTestFixture.cs</pre>
        <pre>Modified:<br />
trunk/SharpDevelop/data/resources/StringResources.dk.resources<br />
...<br />
trunk/SharpDevelopResources/LanguageResources/LocalizeDb.mdb</pre>
        <pre>Deleted:<br />
trunk/SharpDevelop/src/AddIns/.../ActiveElementPathTestFixture.cs</pre>
        <pre>
          <br />
 -- SvnPostCommitHook 1.2.0.50410 -- </pre>
        <p>
          <strong>Installation</strong> Take all three files from \Hook and place them in your
repository's hooks directory. Open post-commit.exe.config and modify the entries in
the appSettings section to match your installation and needs.
</p>
        <p>
          <strong>Test it</strong> Run post-commit.exe once interactively from the command line
to see if your installation is ok. Potential errors are only logged to post-commit.log,
not to the Console. So be sure to check it!
</p>
        <p>
Finally, the download: 
</p>
        <a href="http://chrison.net/content/binary/SvnPostCommitHook1.3.0.50411.zip">SvnPostCommitHook1.3.0.50411.zip
(105.82 KB)</a>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=ad86e2de-73c9-41dc-8be0-d448130b2f06" />
      </body>
      <title>Subversion Post Commit Hook v1.3</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,ad86e2de-73c9-41dc-8be0-d448130b2f06.aspx</guid>
      <link>http://chrison.net/SubversionPostCommitHookV13.aspx</link>
      <pubDate>Mon, 11 Apr 2005 10:06:49 GMT</pubDate>
      <description>&lt;p&gt;
The post commit hook for Subversion now has reached a stage where I consider it feature
complete. Newly added for this release:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt; for logging important information
(ie exceptions)&amp;nbsp;necessary for debugging a hook that is supposed to run automatically.
Note that it uses v1.2.9 of log4net, which is a Beta release. The log file name is
post-commit.log (you can change this in post-commit.exe.config) 
&lt;li&gt;
Nicely formatted commit mail. The change log line items are parsed, the A, U &amp;amp;
D information is used to build Added, Modified &amp;amp; Deleted sections in the message.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Here is an example of the message format (from the &lt;a href="http://www.glengamoi.com/mailman/listinfo/icsharpcode.sharpdevelop-svn-commit"&gt;#develop
commit mailing list&lt;/a&gt;):
&lt;/p&gt;
&lt;pre&gt;Author: mattward&lt;br&gt;
Date: 2005-04-10 20:06:25 +0200 (So, 10 Apr 2005)&lt;br&gt;
New Revision: 1840&lt;br&gt;
Log Message:&lt;br&gt;
Added basic .manifest schema.&amp;nbsp; Schema annotation displayed alongside 
&lt;br&gt;
auto-completion list. Mixed namespaces and simple content types 
&lt;br&gt;
now supported.&amp;nbsp; Added attribute value auto-completion.&lt;br&gt;
&lt;br&gt;
Added:&lt;br&gt;
trunk/SharpDevelop/data/schemas/manifest.xsd&lt;br&gt;
....&lt;br&gt;
trunk/SharpDevelop/src/AddIns/.../SimpleContentWithAttributeTestFixture.cs&lt;/pre&gt;&lt;pre&gt;Modified:&lt;br&gt;
trunk/SharpDevelop/data/resources/StringResources.dk.resources&lt;br&gt;
...&lt;br&gt;
trunk/SharpDevelopResources/LanguageResources/LocalizeDb.mdb&lt;/pre&gt;&lt;pre&gt;Deleted:&lt;br&gt;
trunk/SharpDevelop/src/AddIns/.../ActiveElementPathTestFixture.cs&lt;/pre&gt;&lt;pre&gt;
&lt;br&gt;
&amp;nbsp;-- SvnPostCommitHook 1.2.0.50410 -- &lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Installation&lt;/strong&gt; Take all three files from \Hook and place them in your
repository's hooks directory. Open post-commit.exe.config and modify the entries in
the appSettings section to match your installation and needs.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Test it&lt;/strong&gt; Run post-commit.exe once interactively from the command line
to see if your installation is ok. Potential errors are only logged to post-commit.log,
not to the Console. So be sure to check it!
&lt;/p&gt;
&lt;p&gt;
Finally, the download: 
&lt;/p&gt;
&lt;a href="http://chrison.net/content/binary/SvnPostCommitHook1.3.0.50411.zip"&gt;SvnPostCommitHook1.3.0.50411.zip
(105.82 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=ad86e2de-73c9-41dc-8be0-d448130b2f06" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,ad86e2de-73c9-41dc-8be0-d448130b2f06.aspx</comments>
      <category>.NET</category>
      <category>Subversion</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=cf05942f-9674-42fa-bed8-c38c0f2154c5</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,cf05942f-9674-42fa-bed8-c38c0f2154c5.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,cf05942f-9674-42fa-bed8-c38c0f2154c5.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=cf05942f-9674-42fa-bed8-c38c0f2154c5</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I updated the post commit hook application, however, installation advice from the
original blog entry <a href="http://chrison.net/PostCommitHookForSubversionTheNETWay.aspx">Post
Commit Hook for Subversion, the .NET way</a> still applies. What's new? The revision
info is parsed and more nicely presented in the commit mail message. Because of info
parsing, one call to svnlook could be saved.
</p>
        <p>
          <a href="http://chrison.net/content/binary/SvnPostCommitHook1.1.0.50410.zip">SvnPostCommitHook1.1.0.50410.zip
(14.08 KB)</a>
        </p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=cf05942f-9674-42fa-bed8-c38c0f2154c5" />
      </body>
      <title>Update for the Post Commit Hook</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,cf05942f-9674-42fa-bed8-c38c0f2154c5.aspx</guid>
      <link>http://chrison.net/UpdateForThePostCommitHook.aspx</link>
      <pubDate>Sun, 10 Apr 2005 09:13:31 GMT</pubDate>
      <description>&lt;p&gt;
I updated the post commit hook application, however, installation advice from the
original blog entry &lt;a href="http://chrison.net/PostCommitHookForSubversionTheNETWay.aspx"&gt;Post
Commit Hook for Subversion, the .NET way&lt;/a&gt; still applies. What's new? The revision
info is parsed and more nicely presented in the commit mail message. Because of info
parsing, one call to svnlook could be saved.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/SvnPostCommitHook1.1.0.50410.zip"&gt;SvnPostCommitHook1.1.0.50410.zip
(14.08 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=cf05942f-9674-42fa-bed8-c38c0f2154c5" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,cf05942f-9674-42fa-bed8-c38c0f2154c5.aspx</comments>
      <category>.NET</category>
      <category>Subversion</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=aaa1a2c7-0b3b-4b96-8c7b-f9ddd8cf7e19</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,aaa1a2c7-0b3b-4b96-8c7b-f9ddd8cf7e19.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,aaa1a2c7-0b3b-4b96-8c7b-f9ddd8cf7e19.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=aaa1a2c7-0b3b-4b96-8c7b-f9ddd8cf7e19</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In the entry <a href="http://chrison.net/SubversionOnWindowsAsAServicePlusCommitHookAndBackupScript.aspx">Subversion
on Windows as a Service, plus Commit Hook and Backup Script</a> I showed a batch file
for hooking into the post commit event of a repository. This batch file annoyed me
from the very beginning. During the Indigo Community Day on Thursday in Munich I decided
that it was about time to get rid of it, and after yesterday's party, I thought it
might be a nice pinky exercise to do the basic port to C# today.
</p>
        <p>
And yes, it is very basic at the moment. All you need to do is take post-commit.exe
and post-commit.exe.config from the \SvnPostCommitHook\Hook directory in the downloadable
zip file and drop those two into the hooks directory of your repository. The
.config file is your ticket to customization:
</p>
        <pre>&lt;?xml version="1.0" encoding="utf-8" ?&gt;<br />
&lt;configuration&gt;<br />
 &lt;appSettings&gt;<br />
  &lt;add key="SvnLookPath" value="C:\Program Files\Subversion\bin\svnlook"
/&gt;<br />
  &lt;add key="MailTo" value="<a href="mailto:commitlist@yourdomain.com">commitlist@yourdomain.com</a>"
/&gt;<br />
  &lt;add key="MailFrom" value="<a href="mailto:commithook@yourdomain.com">commithook@yourdomain.com</a>"
/&gt;<br />
  &lt;add key="MailSubject" value="Your project name rev {0}, {1}" /&gt;<br />
  &lt;add key="MailServer" value="localhost" /&gt;<br />
 &lt;/appSettings&gt;<br />
&lt;/configuration&gt;</pre>
        <p>
Just as the batch file, post-commit.exe's task is to read the change log and commit
message, and post it to a mailing list that distributes the information to the project
stakeholders. Therefore, you need to configure the four Mail* settings to match your
configuration and preferences. The SvnLookPath needs to point to your Subversion installation,
however, most installations should be fine with this default.
</p>
        <p>
How can you test the operation of post-commit.exe? This is the syntax:
</p>
        <pre>post-commit &lt;repository&gt; &lt;revision&gt;</pre>
        <p>
For example:
</p>
        <pre>post-commit e:\subversion\fidalgo 1830</pre>
        <p>
In the current version, testing is highly recommended as no logging or exception handling
is implemented.
</p>
        <p>
          <a href="http://chrison.net/content/binary/SvnPostCommitHook1.0.0.50409.zip">SvnPostCommitHook1.0.0.50409.zip
(12.07 KB)</a>
        </p>
        <p>
The source code is BSD-licensed. Future plans are to fully parse the svnlook output,
as well as add a logging infrastructure to easily find configuration problems during
normal operations of your Subversion server.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=aaa1a2c7-0b3b-4b96-8c7b-f9ddd8cf7e19" />
      </body>
      <title>Post Commit Hook for Subversion, the .NET way</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,aaa1a2c7-0b3b-4b96-8c7b-f9ddd8cf7e19.aspx</guid>
      <link>http://chrison.net/PostCommitHookForSubversionTheNETWay.aspx</link>
      <pubDate>Sat, 09 Apr 2005 17:34:45 GMT</pubDate>
      <description>&lt;p&gt;
In the entry &lt;a href="http://chrison.net/SubversionOnWindowsAsAServicePlusCommitHookAndBackupScript.aspx"&gt;Subversion
on Windows as a Service, plus Commit Hook and Backup Script&lt;/a&gt; I showed a batch file
for hooking into the post commit event of a repository. This batch file annoyed me
from the very beginning. During the Indigo Community Day on Thursday in Munich I decided
that it was about time to get rid of it, and after yesterday's party, I thought it
might be&amp;nbsp;a nice pinky exercise to do the basic port to C# today.
&lt;/p&gt;
&lt;p&gt;
And yes, it is very basic at the moment. All you need to do is take post-commit.exe
and post-commit.exe.config from the \SvnPostCommitHook\Hook directory in the downloadable
zip file and drop those two&amp;nbsp;into the hooks directory of your repository. The
.config file is your ticket to customization:
&lt;/p&gt;
&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br&gt;
&amp;lt;configuration&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;lt;appSettings&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;add key="SvnLookPath" value="C:\Program Files\Subversion\bin\svnlook"
/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;add key="MailTo" value="&lt;a href="mailto:commitlist@yourdomain.com"&gt;commitlist@yourdomain.com&lt;/a&gt;"
/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;add key="MailFrom" value="&lt;a href="mailto:commithook@yourdomain.com"&gt;commithook@yourdomain.com&lt;/a&gt;"
/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;add key="MailSubject" value="Your project name rev {0}, {1}" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;add key="MailServer" value="localhost" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;lt;/appSettings&amp;gt;&lt;br&gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;p&gt;
Just as the batch file, post-commit.exe's task is to read the change log and commit
message, and post it to a mailing list that distributes the information to the project
stakeholders. Therefore, you need to configure the four Mail* settings to match your
configuration and preferences. The SvnLookPath needs to point to your Subversion installation,
however, most installations should be fine with this default.
&lt;/p&gt;
&lt;p&gt;
How can you test the operation of post-commit.exe? This is the syntax:
&lt;/p&gt;
&lt;pre&gt;post-commit &amp;lt;repository&amp;gt; &amp;lt;revision&amp;gt;&lt;/pre&gt;
&lt;p&gt;
For example:
&lt;/p&gt;
&lt;pre&gt;post-commit e:\subversion\fidalgo 1830&lt;/pre&gt;
&lt;p&gt;
In the current version, testing is highly recommended as no logging or exception handling
is implemented.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://chrison.net/content/binary/SvnPostCommitHook1.0.0.50409.zip"&gt;SvnPostCommitHook1.0.0.50409.zip
(12.07 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The source code is BSD-licensed. Future plans are to fully parse the svnlook output,
as well as add a logging infrastructure to easily find configuration problems during
normal operations of your Subversion server.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=aaa1a2c7-0b3b-4b96-8c7b-f9ddd8cf7e19" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,aaa1a2c7-0b3b-4b96-8c7b-f9ddd8cf7e19.aspx</comments>
      <category>.NET</category>
      <category>Administration</category>
      <category>Use the source Luke</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=122d38a5-f729-466e-b803-358b61fa22f2</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,122d38a5-f729-466e-b803-358b61fa22f2.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,122d38a5-f729-466e-b803-358b61fa22f2.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=122d38a5-f729-466e-b803-358b61fa22f2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Basically, this job is as easy as:
</p>
        <ol>
          <li>
Dump the repository on the old server 
</li>
          <li>
Load the dump into a new repository on the new server</li>
        </ol>
        <p>
Dumping is explained <a href="http://svnbook.red-bean.com/es/1.1/re31.html">here</a>,
and I won't go into detail because I wasn't the one doing it, <a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.RomanTaranchenko">Roman</a> did
it (I ain't touching a BSD box, more harm than good would result).
</p>
        <p>
However, step two is in my ballpark, because the repository is moving to a Windows
box. Two commands and you are up and running again (it can take quite some time, especially
if your dump is like mine - a little over 528 MB!)
</p>
        <p>
          <font face="Courier New">svnadmin create c:\repositories\fidalgo<br />
svnadmin load c:\repositories\fidalgo &lt; "e:\fidalgo.dump"</font>
        </p>
        <p>
All that is left to do now is to restore the configuration and hooks (details in my <a href="http://chrison.net/PermaLink,guid,87da2194-b39e-45eb-bd5d-ac41697a6bdc.aspx">last
blog post on Subversion</a>)
</p>
        <p>
In closing, credit where credit is due: I gathered some inspiration from the following
blog entry: <a href="http://mcmanus.typepad.com/grind/2003/12/a_rank_amateur_.html">A
Rank Amateur Upgrades His Subversion Repository</a></p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=122d38a5-f729-466e-b803-358b61fa22f2" />
      </body>
      <title>Moving Subversion Repositories</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,122d38a5-f729-466e-b803-358b61fa22f2.aspx</guid>
      <link>http://chrison.net/MovingSubversionRepositories.aspx</link>
      <pubDate>Thu, 13 Jan 2005 20:31:15 GMT</pubDate>
      <description>&lt;p&gt;
Basically, this job is as easy as:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Dump the repository on the old server 
&lt;li&gt;
Load the dump into a new repository on the new server&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Dumping is explained &lt;a href="http://svnbook.red-bean.com/es/1.1/re31.html"&gt;here&lt;/a&gt;,
and I won't go into detail because I wasn't the one doing it, &lt;a href="http://wiki.sharpdevelop.net/default.aspx/SharpDevelop.RomanTaranchenko"&gt;Roman&lt;/a&gt; did
it (I ain't touching a BSD box, more harm than good would result).
&lt;/p&gt;
&lt;p&gt;
However, step two is in my ballpark, because the repository is moving to a Windows
box. Two commands and you are up and running again (it can take quite some time, especially
if your dump is like mine - a little over 528 MB!)
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;svnadmin create c:\repositories\fidalgo&lt;br&gt;
svnadmin load c:\repositories\fidalgo &amp;lt; "e:\fidalgo.dump"&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
All that is left to do now is to restore the configuration and hooks (details in my &lt;a href="http://chrison.net/PermaLink,guid,87da2194-b39e-45eb-bd5d-ac41697a6bdc.aspx"&gt;last
blog post on Subversion&lt;/a&gt;)
&lt;/p&gt;
&lt;p&gt;
In closing, credit where credit is due: I gathered some inspiration from the following
blog entry: &lt;a href="http://mcmanus.typepad.com/grind/2003/12/a_rank_amateur_.html"&gt;A
Rank Amateur Upgrades His Subversion Repository&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=122d38a5-f729-466e-b803-358b61fa22f2" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,122d38a5-f729-466e-b803-358b61fa22f2.aspx</comments>
      <category>Administration</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=87da2194-b39e-45eb-bd5d-ac41697a6bdc</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,87da2194-b39e-45eb-bd5d-ac41697a6bdc.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,87da2194-b39e-45eb-bd5d-ac41697a6bdc.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=87da2194-b39e-45eb-bd5d-ac41697a6bdc</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Following is an installation recipe for <a href="http://subversion.tigris.org/">Subversion</a> (a
free and very powerful source code control system) plus additional files for a post
commit hook (so you know immediately when someone else checked something in; currently
implemented as a batch file) and a backup script (so there are no excuses for not
backing up your installation!). Assumptions for this recipe:
</p>
        <ul>
          <li>
We are creating a new repository named Corsavy 
</li>
          <li>
c:\repositories is your repository root 
</li>
          <li>
Backups will be located in d:\subversionbackups</li>
        </ul>
        <p>
Now for the recipe:
</p>
        <p>
1) Install Subversion (<a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91">WIN32
download</a>). Modify the PATH environment variable so that it contains the path to
your Subversion installation (usually c:\Program Files\Subversion\bin).
</p>
        <p>
2) Create a repository
</p>
        <p>
          <font face="Courier New">mkdir c:\repositories<br />
svnadmin create c:\repositories\corsavy</font>
        </p>
        <p>
Details can be found <a href="http://tortoisesvn.tigris.org/docs/TortoiseSVN_en/ch03s02.html">here</a>.
</p>
        <p>
3) Edit svnserve.conf (do not forget to uncomment [General]). Details see previous
link, however, svnserve.conf does come with plenty of instructions itself.
</p>
        <p>
4) Install Subversion as a service using the <a href="http://dark.clansoft.dk/~mbn/svnservice/">SVN
Service Wrapper</a> (Note: you have to place it in the bin directory where svnserve.exe
is located)
</p>
        <p>
          <font face="Courier New">SVNService -install -d -r c:\repositories</font>
        </p>
        <p>
5) Optional: a commit hook, post-commit.bat
</p>
        <p>
Put it into c:\repositories\corsavy\hooks, it will be picked up automatically
</p>
        <p>
          <font face="Courier New">SET REPOS=%1<br />
SET REV=%2</font>
        </p>
        <p>
          <font face="Courier New">SET LOG_FILE=%TEMP%.\svnfileR-%REV%<br />
SET LOG_FILE1=%TEMP%.\svnfileR1-%REV%<br />
SET LOG_FILE2=%TEMP%.\svnfileR2-%REV%<br />
SET AUT_FILE=%TEMP%.\svnfileA-%REV%</font>
        </p>
        <p>
          <font face="Courier New">svnlook info -r %REV% %REPOS%&gt;%LOG_FILE1%<br />
svnlook changed -r %REV% %REPOS%&gt;%LOG_FILE2%<br />
copy %LOG_FILE1%+spacer.txt+%LOG_FILE2%+spacer.txt+%LOG_FILE% </font>
        </p>
        <p>
          <font face="Courier New">svnlook author -r %REV% %REPOS%&gt;%AUT_FILE%</font>
        </p>
        <p>
          <font face="Courier New">REM SET THE AUTHOR FROM THE FILE. 
<br />
FOR /F %%A IN (%AUT_FILE%) DO SET AUTHOR=%%A</font>
        </p>
        <p>
          <font face="Courier New">blat "%LOG_FILE%" -to "toaddr" -f "fromaddr" -server localhost
-s "[svn-corsavy] rev %REV%, %AUTHOR%"</font>
        </p>
        <p>
          <font face="Courier New">DEL %LOG_FILE%<br />
DEL %LOG_FILE1%<br />
DEL %LOG_FILE2%<br />
DEL %AUT_FILE%</font>
        </p>
        <p>
Note that I did remove toaddr and fromaddr in this script (put in the ones you'd like
to use instead), and you need a file named spacer.txt (mine simply contains four newlines).
For mailing out the change log, <a href="http://www.blat.net/">blat</a> is used (Note:
the line with blat must not wrap). I placed blat into the bin folder of my Subversion
installation, so it is automatically in the search path.
</p>
        <p>
6) Optional: backup, a VBS script
</p>
        <p>
          <font face="Courier New">Set objWsh = WScript.CreateObject("WScript.Shell")</font>
        </p>
        <p>
          <font face="Courier New">strCmdLine = "cmd /c rmdir d:\subversionbackups\current /s
/q"<br />
nRetVal = objWsh.Run(strCmdLine, 1, True)</font>
        </p>
        <p>
          <font face="Courier New">strCmdLine = "cmd /c mkdir d:\subversionbackups\current"<br />
nRetVal = objWsh.Run(strCmdLine, 1, True)</font>
        </p>
        <p>
          <font face="Courier New">strCmdLine = "svnadmin hotcopy c:\repositories\corsavy d:\subversionbackups\current
--clean-logs"<br />
WScript.Echo strCmdLine<br />
nRetVal = objWsh.Run(strCmdLine, 1, True)</font>
        </p>
        <p>
          <font face="Courier New">strFilename = """d:\subversionbackups\"<br />
strFilename = strFilename &amp;  Year(Date) &amp; Month(Date) &amp; Day(Date)
&amp; ".zip"""<br />
strCmdLine = "zip -r " &amp; strFilename &amp; " ""d:\subversionbackups\current\*.*"""<br />
WScript.Echo strCmdLine<br />
nRetVal = objWsh.Run(strCmdLine, 1, True)</font>
        </p>
        <p>
The Zip component in use is <a href="http://www.info-zip.org/pub/infozip/Zip.html">Info-ZIP</a>,
which is free. The VBS file is run from a scheduled task each night. 
</p>
        <p>
That concludes the recipe for installing Subversion - well, almost: the port used
by svnserve is 3690 (TCP as well as UDP), so you might need to change the IPSec policy
of your server to allow those incoming ports. Same thing client-side, but this time
outgoing.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=87da2194-b39e-45eb-bd5d-ac41697a6bdc" />
      </body>
      <title>Subversion on Windows as a Service, plus Commit Hook and Backup Script</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,87da2194-b39e-45eb-bd5d-ac41697a6bdc.aspx</guid>
      <link>http://chrison.net/SubversionOnWindowsAsAServicePlusCommitHookAndBackupScript.aspx</link>
      <pubDate>Mon, 03 Jan 2005 07:22:37 GMT</pubDate>
      <description>&lt;p&gt;
Following is an installation recipe for &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; (a
free and very powerful source code control system) plus additional files for a post
commit hook (so you know immediately when someone else checked something in; currently
implemented as a batch file) and a backup script (so there are no excuses for not
backing up your installation!). Assumptions for this recipe:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
We are creating a new repository named Corsavy 
&lt;li&gt;
c:\repositories is your repository root 
&lt;li&gt;
Backups will be located in d:\subversionbackups&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Now for the recipe:
&lt;/p&gt;
&lt;p&gt;
1) Install Subversion (&lt;a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91"&gt;WIN32
download&lt;/a&gt;). Modify the PATH environment variable so that it contains the path to
your Subversion installation (usually c:\Program Files\Subversion\bin).
&lt;/p&gt;
&lt;p&gt;
2) Create a repository
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;mkdir c:\repositories&lt;br&gt;
svnadmin create c:\repositories\corsavy&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Details can be found &lt;a href="http://tortoisesvn.tigris.org/docs/TortoiseSVN_en/ch03s02.html"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
3) Edit svnserve.conf (do not forget to uncomment [General]). Details see previous
link, however, svnserve.conf does come with plenty of instructions itself.
&lt;/p&gt;
&lt;p&gt;
4) Install Subversion as a service using the &lt;a href="http://dark.clansoft.dk/~mbn/svnservice/"&gt;SVN
Service Wrapper&lt;/a&gt;&amp;nbsp;(Note: you have to place it in the bin directory where svnserve.exe
is located)
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;SVNService -install -d -r c:\repositories&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
5) Optional: a commit hook, post-commit.bat
&lt;/p&gt;
&lt;p&gt;
Put it into c:\repositories\corsavy\hooks, it will be picked up automatically
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;SET REPOS=%1&lt;br&gt;
SET REV=%2&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;SET LOG_FILE=%TEMP%.\svnfileR-%REV%&lt;br&gt;
SET LOG_FILE1=%TEMP%.\svnfileR1-%REV%&lt;br&gt;
SET LOG_FILE2=%TEMP%.\svnfileR2-%REV%&lt;br&gt;
SET AUT_FILE=%TEMP%.\svnfileA-%REV%&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;svnlook info -r %REV% %REPOS%&amp;gt;%LOG_FILE1%&lt;br&gt;
svnlook changed -r %REV% %REPOS%&amp;gt;%LOG_FILE2%&lt;br&gt;
copy %LOG_FILE1%+spacer.txt+%LOG_FILE2%+spacer.txt+%LOG_FILE% &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;svnlook author -r %REV% %REPOS%&amp;gt;%AUT_FILE%&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;REM SET THE AUTHOR FROM THE FILE. 
&lt;br&gt;
FOR /F %%A IN (%AUT_FILE%) DO SET AUTHOR=%%A&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;blat "%LOG_FILE%" -to "toaddr" -f "fromaddr" -server localhost
-s "[svn-corsavy] rev %REV%, %AUTHOR%"&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;DEL %LOG_FILE%&lt;br&gt;
DEL %LOG_FILE1%&lt;br&gt;
DEL %LOG_FILE2%&lt;br&gt;
DEL %AUT_FILE%&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Note that I did remove toaddr and fromaddr in this script (put in the ones you'd like
to use instead), and you need a file named spacer.txt (mine simply contains four newlines).
For mailing out the change log, &lt;a href="http://www.blat.net/"&gt;blat&lt;/a&gt; is used (Note:
the line with blat must not wrap). I placed&amp;nbsp;blat into the bin folder of my Subversion
installation, so it is automatically in the search path.
&lt;/p&gt;
&lt;p&gt;
6) Optional: backup, a VBS script
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;Set objWsh = WScript.CreateObject("WScript.Shell")&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;strCmdLine = "cmd /c rmdir d:\subversionbackups\current /s
/q"&lt;br&gt;
nRetVal = objWsh.Run(strCmdLine, 1, True)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;strCmdLine = "cmd /c mkdir d:\subversionbackups\current"&lt;br&gt;
nRetVal = objWsh.Run(strCmdLine, 1, True)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;strCmdLine = "svnadmin hotcopy c:\repositories\corsavy d:\subversionbackups\current
--clean-logs"&lt;br&gt;
WScript.Echo strCmdLine&lt;br&gt;
nRetVal = objWsh.Run(strCmdLine, 1, True)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New"&gt;strFilename = """d:\subversionbackups\"&lt;br&gt;
strFilename = strFilename &amp;amp;&amp;nbsp; Year(Date) &amp;amp; Month(Date) &amp;amp; Day(Date)
&amp;amp; ".zip"""&lt;br&gt;
strCmdLine = "zip -r " &amp;amp; strFilename &amp;amp; " ""d:\subversionbackups\current\*.*"""&lt;br&gt;
WScript.Echo strCmdLine&lt;br&gt;
nRetVal = objWsh.Run(strCmdLine, 1, True)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
The Zip component in use is &lt;a href="http://www.info-zip.org/pub/infozip/Zip.html"&gt;Info-ZIP&lt;/a&gt;,
which is free. The VBS file is run from a scheduled task each night. 
&lt;/p&gt;
&lt;p&gt;
That concludes the recipe for installing Subversion - well, almost: the port used
by svnserve is 3690 (TCP as well as UDP), so you might need to change the IPSec policy
of your server to allow those incoming ports. Same thing client-side, but this time
outgoing.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=87da2194-b39e-45eb-bd5d-ac41697a6bdc" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,87da2194-b39e-45eb-bd5d-ac41697a6bdc.aspx</comments>
      <category>Administration</category>
      <category>Project Management</category>
      <category>Subversion</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=b7bace3e-60c0-47db-9509-70e36be80b06</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,b7bace3e-60c0-47db-9509-70e36be80b06.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,b7bace3e-60c0-47db-9509-70e36be80b06.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b7bace3e-60c0-47db-9509-70e36be80b06</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I think I can safely assume that everyone knows about <a href="http://sourceforge.net/">SourceForge.net</a>,
where first-class .NET projects such as <a href="http://nunit.sf.net/">NUnit</a>, <a href="http://nant.sf.net/">NAnt</a>, <a href="http://nprof.sf.net/">NProf</a> as
well as many others are hosted. Much less known is <a href="http://gforge.org/">GForge</a>,
which is a fork that you can host yourself based on the GPL version of SourceForge
before it was made closed-source by VA Linux in 2001. 
</p>
        <p>
Since that time <a href="http://gforge.org/">GForge</a> was improved, and it has reached
version 4 just recently. To give you a really high-level idea of what it is, a short
quote from the project page itself: <!--StartFragment --><em>GForge has tools to help your team collaborate, like message forums and mailing
lists; tools to create and control access to Source Code Management repositories like
CVS and Subversion. GForge automatically creates a repository and controls access
to it depending on the role settings of the project.</em></p>
        <p>
          <em>Additional Tools:</em>
        </p>
        <ul>
          <li>
            <!--StartFragment -->
            <em>Manage File Releases</em>
          </li>
          <li>
            <em>Document Management</em>
          </li>
          <li>
            <em>News announcements</em>
          </li>
          <li>
            <em>Surveys for users and admins</em>
          </li>
          <li>
            <em>Issue tracking with "unlimited" numbers of categories, text fields, etc</em>
          </li>
          <li>
            <em>Task management</em>
          </li>
        </ul>
        <p>
Tool-wise, this package can come in handy when you want to get started on a development
process in your company, covering the entire lifecycle. For free.
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b7bace3e-60c0-47db-9509-70e36be80b06" />
      </body>
      <title>GForge</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,b7bace3e-60c0-47db-9509-70e36be80b06.aspx</guid>
      <link>http://chrison.net/GForge.aspx</link>
      <pubDate>Wed, 03 Nov 2004 11:04:15 GMT</pubDate>
      <description>&lt;p&gt;
I think I can safely assume that everyone knows about &lt;a href="http://sourceforge.net/"&gt;SourceForge.net&lt;/a&gt;,
where first-class .NET projects such as &lt;a href="http://nunit.sf.net/"&gt;NUnit&lt;/a&gt;, &lt;a href="http://nant.sf.net/"&gt;NAnt&lt;/a&gt;, &lt;a href="http://nprof.sf.net/"&gt;NProf&lt;/a&gt; as
well as many others are hosted. Much less known is &lt;a href="http://gforge.org/"&gt;GForge&lt;/a&gt;,
which is a fork that you can host yourself based on the GPL version of SourceForge
before it was made closed-source by VA Linux in 2001. 
&lt;/p&gt;
&lt;p&gt;
Since that time &lt;a href="http://gforge.org/"&gt;GForge&lt;/a&gt; was improved, and it has reached
version 4 just recently. To give you a really high-level idea of what it is, a short
quote from the project page itself:&amp;nbsp;&lt;!--StartFragment --&gt;
&lt;em&gt;GForge has tools to help your team collaborate, like message forums and mailing
lists; tools to create and control access to Source Code Management repositories like
CVS and Subversion. GForge automatically creates a repository and controls access
to it depending on the role settings of the project.&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;Additional Tools:&lt;/em&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;!--StartFragment --&gt;&lt;em&gt;Manage File Releases&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Document Management&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;News announcements&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Surveys for users and admins&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Issue tracking with "unlimited" numbers of categories, text fields, etc&lt;/em&gt; 
&lt;li&gt;
&lt;em&gt;Task management&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Tool-wise, this package can come in handy when you want to get started on a development
process in your company, covering the entire lifecycle. For free.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=b7bace3e-60c0-47db-9509-70e36be80b06" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,b7bace3e-60c0-47db-9509-70e36be80b06.aspx</comments>
      <category>Project Management</category>
      <category>Subversion</category>
      <category>Use the source Luke</category>
    </item>
    <item>
      <trackback:ping>http://chrison.net/Trackback.aspx?guid=65d45d0c-1baa-4319-bda3-62b293a7da89</trackback:ping>
      <pingback:server>http://chrison.net/pingback.aspx</pingback:server>
      <pingback:target>http://chrison.net/PermaLink,guid,65d45d0c-1baa-4319-bda3-62b293a7da89.aspx</pingback:target>
      <dc:creator>Christoph Wille</dc:creator>
      <wfw:comment>http://chrison.net/CommentView,guid,65d45d0c-1baa-4319-bda3-62b293a7da89.aspx</wfw:comment>
      <wfw:commentRss>http://chrison.net/SyndicationService.asmx/GetEntryCommentsRss?guid=65d45d0c-1baa-4319-bda3-62b293a7da89</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Note to self: need to grab a copy of <a href="http://www.amazon.com/exec/obidos/tg/detail/-/0596004486/">Version
Control with Subversion</a>. We have been using <a href="http://subversion.tigris.org/">Subversion</a> even
while it still was in Alpha and Beta stages - and I am really convinced that it is
more than up to its commercial counterparts, especially when it comes to platform
and tool support!
</p>
        <img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=65d45d0c-1baa-4319-bda3-62b293a7da89" />
      </body>
      <title>Version Control with Subversion</title>
      <guid isPermaLink="false">http://chrison.net/PermaLink,guid,65d45d0c-1baa-4319-bda3-62b293a7da89.aspx</guid>
      <link>http://chrison.net/VersionControlWithSubversion.aspx</link>
      <pubDate>Sat, 30 Oct 2004 18:30:27 GMT</pubDate>
      <description>&lt;p&gt;
Note to self: need to grab a copy of &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0596004486/"&gt;Version
Control with Subversion&lt;/a&gt;. We have been using&amp;nbsp;&lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; even
while it still was in Alpha and Beta stages - and I am really convinced that it is
more than up to its commercial counterparts, especially when it comes to platform
and tool support!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://chrison.net/aggbug.ashx?id=65d45d0c-1baa-4319-bda3-62b293a7da89" /&gt;</description>
      <comments>http://chrison.net/CommentView,guid,65d45d0c-1baa-4319-bda3-62b293a7da89.aspx</comments>
      <category>Books</category>
      <category>Subversion</category>
    </item>
  </channel>
</rss>