<span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Collections.Generic;
<span class="hljs-keyword">using</span> System.Linq;
<span class="hljs-keyword">using</span> System.Text;
<span class="hljs-keyword">using</span> System.IO;
<span class="hljs-keyword">using</span> System.Collections.ObjectModel;
<span class="hljs-keyword">using</span> SharpSvn;
<span class="hljs-keyword">namespace</span> <span class="hljs-title">SVNSample</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><summary></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> SharpSVNのサンプル</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"></summary></span></span>
<span class="hljs-keyword">class</span> <span class="hljs-title">Program</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> SvnClient client; <span class="hljs-comment">//Subversion Client</span>
<span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>)</span>
<span class="hljs-keyword">if</span> (args.Length >= <span class="hljs-number">0</span>)
Console.WriteLine(<span class="hljs-string">"Usage: SVNSample [Repo URI] [Work Directory]"</span>);
client = <span class="hljs-keyword">new</span> SvnClient(); <span class="hljs-comment">//イベント設定 client.Notify += new EventHandler(client_Notify);</span>
<span class="hljs-keyword">try</span>
<span class="hljs-comment">//資格情報を作成してクライアントに登録する。(ネットワーク越しで認証が必要なケース)</span>
<span class="hljs-comment">//var cred = new System.Net.NetworkCredential("ishisaka", "");</span>
<span class="hljs-comment">//client.Authentication.DefaultCredentials = cred;</span>
<span class="hljs-comment">//ワーキングディレクトリの状態によってチェックアウトもしくはアップデートを行う。</span>
CheckoutOrUpdate(args[<span class="hljs-number">0</span>], args[<span class="hljs-number">1</span>]);
<span class="hljs-comment">//listコマンドの実行</span>
Console.WriteLine(<span class="hljs-string">"+++ Repo Directory / File List +++"</span>);
GetRepoList(<span class="hljs-keyword">new</span> Uri(args[<span class="hljs-number">0</span>]));
<span class="hljs-comment">//テスト用のファイルの作成</span>
Console.WriteLine(<span class="hljs-string">"+++ File Cleate \"hello[yyyymmddhhmmss].py\" +++"</span>);
<span class="hljs-keyword">var</span> contents = <span class="hljs-string">"print 'Hello py'\n"</span>;
<span class="hljs-keyword">var</span> dateStr = DateTime.Now.ToString(<span class="hljs-string">"yyyyMMddhhmmss"</span>);
<span class="hljs-keyword">var</span> filePath = args[<span class="hljs-number">1</span>] + <span class="hljs-string">"\\trunk\\hello"</span> + dateStr + <span class="hljs-string">".py"</span>;
File.WriteAllText(filePath, contents);
<span class="hljs-comment">//ADD</span>
Console.WriteLine(<span class="hljs-string">"+++ File Add +++"</span>);
<span class="hljs-comment">//ステータス</span>
Console.WriteLine(<span class="hljs-string">"+++ Status +++"</span>);
PrintStatus(args[<span class="hljs-number">1</span>]);
<span class="hljs-comment">//コミット</span>
Console.WriteLine(<span class="hljs-string">"+++ Commit +++"</span>);
Commit(args[<span class="hljs-number">1</span>]);
Console.Write(<span class="hljs-string">"何か入力で終了:"</span>);
<span class="hljs-keyword">finally</span>
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Commit</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> workingDir</span>)</span>
SvnCommitArgs ca = <span class="hljs-keyword">new</span> SvnCommitArgs();
ca.LogMessage = <span class="hljs-string">"ファイルを追加"</span>;
client.Commit(workingDir, ca, <span class="hljs-keyword">out</span> results);
Console.WriteLine(<span class="hljs-string">"Commit Time :{0}"</span>, results.Time);
Console.WriteLine(<span class="hljs-string">"Commit Author :{0}"</span>, results.Author);
Console.WriteLine(<span class="hljs-string">"Commit Revision :{0}"</span>, results.Revision);
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">PrintStatus</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> workingDir</span>)</span>
<span class="hljs-comment">//ステータスを取得する</span>
client.GetStatus(workingDir, <span class="hljs-keyword">out</span> stats);
<span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">var</span> s <span class="hljs-keyword">in</span> stats)
Console.WriteLine(<span class="hljs-string">"File :{0}, Last change time :{1}, Staus :{2}"</span>,
s.FullPath, s.LastChangeTime, s.LocalContentStatus);
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">CheckoutOrUpdate</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> repo, <span class="hljs-keyword">string</span> dir</span>)</span>
<span class="hljs-comment">//チェックアウト</span>
<span class="hljs-keyword">string</span> svnDir = <span class="hljs-string">@".svn"</span>;
<span class="hljs-keyword">if</span> (Directory.Exists(dir + <span class="hljs-string">"\\"</span> + svnDir))
<span class="hljs-comment">//.svnディレクトリが存在したらチェックアウト済みと見なし、アップデートする。</span>
Console.WriteLine(<span class="hljs-string">"++ Working Directory Update ++"</span>);
<span class="hljs-keyword">else</span>
<span class="hljs-comment">//チェックアウトする。</span>
Console.WriteLine(<span class="hljs-string">"++ CheckOut ++"</span>);
client.CheckOut(<span class="hljs-keyword">new</span> Uri(repo), dir);
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">GetRepoList</span>(<span class="hljs-params">Uri url</span>)</span>
<span class="hljs-comment">//Collectionの用意</span>
<span class="hljs-keyword">string</span> myPath = url.LocalPath;
<span class="hljs-comment">//ターゲットの作成</span>
SvnUriTarget repo = <span class="hljs-keyword">new</span> SvnUriTarget(url);
<span class="hljs-comment">//listコマンドの実行</span>
client.GetList(repo, <span class="hljs-keyword">out</span> list);
<span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">var</span> l <span class="hljs-keyword">in</span> list)
<span class="hljs-comment">//レポジトリのルートディレクトリは無視する。</span>
<span class="hljs-keyword">if</span> (l.Uri.LocalPath == l.RepositoryRoot.LocalPath) <span class="hljs-keyword">continue</span>;
<span class="hljs-keyword">switch</span> (l.Entry.NodeKind)
<span class="hljs-keyword">case</span> SvnNodeKind.Directory:
<span class="hljs-keyword">if</span> (l.Uri.LocalPath != myPath)
Console.WriteLine(<span class="hljs-string">"Folder\t:{0}"</span>, l.Uri.LocalPath);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> SvnNodeKind.File:
Console.WriteLine(<span class="hljs-string">"\tFile\t:{0}"</span>, Path.GetFileName(l.Uri.LocalPath));
<span class="hljs-keyword">break</span>;
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">client_Notify</span>(<span class="hljs-params"><span class="hljs-keyword">object</span> sender, SvnNotifyEventArgs e</span>)</span>
<span class="hljs-keyword">switch</span> (e.CommandType)
<span class="hljs-comment">//チェックアウト/アップデート中のファイルを表示する</span>
<span class="hljs-keyword">case</span> SvnCommandType.CheckOut:
<span class="hljs-keyword">case</span> SvnCommandType.Update:
<span class="hljs-keyword">case</span> SvnCommandType.Add:
<span class="hljs-keyword">case</span> SvnCommandType.Commit:
Console.WriteLine(e.FullPath + <span class="hljs-string">", Rev. "</span>
+ e.Revision + <span class="hljs-string">"\t : "</span> + e.Action);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">default</span>:
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Collections.Generic;
<span class="hljs-keyword">using</span> System.Linq;
<span class="hljs-keyword">using</span> System.Text;
<span class="hljs-keyword">using</span> System.IO;
<span class="hljs-keyword">using</span> System.Collections.ObjectModel;
<span class="hljs-keyword">using</span> SharpSvn;
<span class="hljs-keyword">namespace</span> <span class="hljs-title">SVNSample</span>
{
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"><summary></span></span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> SharpSVNのサンプル</span>
<span class="hljs-comment"><span class="hljs-doctag">///</span> <span class="hljs-doctag"></summary></span></span>
<span class="hljs-keyword">class</span> <span class="hljs-title">Program</span>
{
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> SvnClient client; <span class="hljs-comment">//Subversion Client</span>
<span class="hljs-function"><span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Main</span>(<span class="hljs-params"><span class="hljs-keyword">string</span>[] args</span>)</span>
{
<span class="hljs-keyword">if</span> (args.Length >= <span class="hljs-number">0</span>)
{
Console.WriteLine(<span class="hljs-string">"Usage: SVNSample [Repo URI] [Work Directory]"</span>);
}
client = <span class="hljs-keyword">new</span> SvnClient(); <span class="hljs-comment">//イベント設定 client.Notify += new EventHandler(client_Notify);</span>
<span class="hljs-keyword">try</span>
{
<span class="hljs-comment">//資格情報を作成してクライアントに登録する。(ネットワーク越しで認証が必要なケース)</span>
<span class="hljs-comment">//var cred = new System.Net.NetworkCredential("ishisaka", "");</span>
<span class="hljs-comment">//client.Authentication.DefaultCredentials = cred;</span>
<span class="hljs-comment">//ワーキングディレクトリの状態によってチェックアウトもしくはアップデートを行う。</span>
CheckoutOrUpdate(args[<span class="hljs-number">0</span>], args[<span class="hljs-number">1</span>]);
<span class="hljs-comment">//listコマンドの実行</span>
Console.WriteLine(<span class="hljs-string">"+++ Repo Directory / File List +++"</span>);
GetRepoList(<span class="hljs-keyword">new</span> Uri(args[<span class="hljs-number">0</span>]));
<span class="hljs-comment">//テスト用のファイルの作成</span>
Console.WriteLine(<span class="hljs-string">"+++ File Cleate \"hello[yyyymmddhhmmss].py\" +++"</span>);
<span class="hljs-keyword">var</span> contents = <span class="hljs-string">"print 'Hello py'\n"</span>;
<span class="hljs-keyword">var</span> dateStr = DateTime.Now.ToString(<span class="hljs-string">"yyyyMMddhhmmss"</span>);
<span class="hljs-keyword">var</span> filePath = args[<span class="hljs-number">1</span>] + <span class="hljs-string">"\\trunk\\hello"</span> + dateStr + <span class="hljs-string">".py"</span>;
File.WriteAllText(filePath, contents);
<span class="hljs-comment">//ADD</span>
Console.WriteLine(<span class="hljs-string">"+++ File Add +++"</span>);
client.Add(filePath);
<span class="hljs-comment">//ステータス</span>
Console.WriteLine(<span class="hljs-string">"+++ Status +++"</span>);
PrintStatus(args[<span class="hljs-number">1</span>]);
<span class="hljs-comment">//コミット</span>
Console.WriteLine(<span class="hljs-string">"+++ Commit +++"</span>);
Commit(args[<span class="hljs-number">1</span>]);
Console.Write(<span class="hljs-string">"何か入力で終了:"</span>);
Console.Read();
}
<span class="hljs-keyword">finally</span>
{
client.Dispose();
}
}
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Commit</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> workingDir</span>)</span>
{
SvnCommitArgs ca = <span class="hljs-keyword">new</span> SvnCommitArgs();
ca.LogMessage = <span class="hljs-string">"ファイルを追加"</span>;
SvnCommitResult results;
client.Commit(workingDir, ca, <span class="hljs-keyword">out</span> results);
Console.WriteLine(<span class="hljs-string">"Commit Time :{0}"</span>, results.Time);
Console.WriteLine(<span class="hljs-string">"Commit Author :{0}"</span>, results.Author);
Console.WriteLine(<span class="hljs-string">"Commit Revision :{0}"</span>, results.Revision);
}
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">PrintStatus</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> workingDir</span>)</span>
{
<span class="hljs-comment">//ステータスを取得する</span>
Collection stats;
client.GetStatus(workingDir, <span class="hljs-keyword">out</span> stats);
<span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">var</span> s <span class="hljs-keyword">in</span> stats)
{
Console.WriteLine(<span class="hljs-string">"File :{0}, Last change time :{1}, Staus :{2}"</span>,
s.FullPath, s.LastChangeTime, s.LocalContentStatus);
}
}
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">CheckoutOrUpdate</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> repo, <span class="hljs-keyword">string</span> dir</span>)</span>
{
<span class="hljs-comment">//チェックアウト</span>
<span class="hljs-keyword">string</span> svnDir = <span class="hljs-string">@".svn"</span>;
<span class="hljs-keyword">if</span> (Directory.Exists(dir + <span class="hljs-string">"\\"</span> + svnDir))
{
<span class="hljs-comment">//.svnディレクトリが存在したらチェックアウト済みと見なし、アップデートする。</span>
Console.WriteLine(<span class="hljs-string">"++ Working Directory Update ++"</span>);
client.Update(dir);
}
<span class="hljs-keyword">else</span>
{
<span class="hljs-comment">//チェックアウトする。</span>
Console.WriteLine(<span class="hljs-string">"++ CheckOut ++"</span>);
client.CheckOut(<span class="hljs-keyword">new</span> Uri(repo), dir);
}
}
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">GetRepoList</span>(<span class="hljs-params">Uri url</span>)</span>
{
<span class="hljs-comment">//Collectionの用意</span>
Collection list;
<span class="hljs-keyword">string</span> myPath = url.LocalPath;
<span class="hljs-comment">//ターゲットの作成</span>
SvnUriTarget repo = <span class="hljs-keyword">new</span> SvnUriTarget(url);
<span class="hljs-comment">//listコマンドの実行</span>
client.GetList(repo, <span class="hljs-keyword">out</span> list);
<span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">var</span> l <span class="hljs-keyword">in</span> list)
{
<span class="hljs-comment">//レポジトリのルートディレクトリは無視する。</span>
<span class="hljs-keyword">if</span> (l.Uri.LocalPath == l.RepositoryRoot.LocalPath) <span class="hljs-keyword">continue</span>;
<span class="hljs-keyword">switch</span> (l.Entry.NodeKind)
{
<span class="hljs-keyword">case</span> SvnNodeKind.Directory:
<span class="hljs-keyword">if</span> (l.Uri.LocalPath != myPath)
{
Console.WriteLine(<span class="hljs-string">"Folder\t:{0}"</span>, l.Uri.LocalPath);
GetRepoList(l.Uri);
}
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> SvnNodeKind.File:
Console.WriteLine(<span class="hljs-string">"\tFile\t:{0}"</span>, Path.GetFileName(l.Uri.LocalPath));
<span class="hljs-keyword">break</span>;
}
}
list.Clear();
}
<span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">client_Notify</span>(<span class="hljs-params"><span class="hljs-keyword">object</span> sender, SvnNotifyEventArgs e</span>)</span>
{
<span class="hljs-keyword">switch</span> (e.CommandType)
{
<span class="hljs-comment">//チェックアウト/アップデート中のファイルを表示する</span>
<span class="hljs-keyword">case</span> SvnCommandType.CheckOut:
<span class="hljs-keyword">case</span> SvnCommandType.Update:
<span class="hljs-keyword">case</span> SvnCommandType.Add:
<span class="hljs-keyword">case</span> SvnCommandType.Commit:
Console.WriteLine(e.FullPath + <span class="hljs-string">", Rev. "</span>
+ e.Revision + <span class="hljs-string">"\t : "</span> + e.Action);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">default</span>:
<span class="hljs-keyword">break</span>;
}
}
}
}
コメント