C#からSubversionを使う
C#からSubversionを使う
//TortoiseSVNやAnkhSVNは優れたGUIツールですが、バッチ的な処理を行う場合にはスクリプト言語やプログラミングコードで処理できた方が便利な場合がありますよね。
//TortoiseSVN和AnkhSVN是出色的GUI工具,但在进行批处理时,能够使用脚本语言或编程代码处理它可能很有用。
//ということで、C# Advent Calendat 2011 12/10分はそのようなお話です。
//所以,C#Advent Calendat 2011 12/10分钟就是这样一个故事。
//C#をはじめとする.NET Fxの言語からSubversionを使うためのライブラリがCOLLABNETから公開されていて、実際にAnkhSVNでも使用されているようです。
//从.NET Fx(包括C#)语言使用Subversion的库是从COLLABNET发布的,似乎实际上是由AnkhSVN使用的。
//以下のCOLLABNETのサイトからダウンロードが可能です。
//您可以从以下COLLABNET站点下载它。
//公開サイト:sharpsvn: Subversion Library for .Net 2.0+
//公共站点:sharpsvn:.Net 2.0+的Subversion库
//また、Nugetを使ってインストールすることもできます。
//您也可以使用Nuget进行安装。
//では、実際に動く物を作ってみましょう。
//所以让我们创造一些实际移动的东西。
//適当なコンソールアプリケーションのプロジェクトを作って、Nugetを起動したら、”SVN”で検索してみましょう。sharpSVNは現状.NET Fx 4.0では動作しないので、プロジェクトのターゲットは.NET Fx 3.5としてください。
//创建一个合适的控制台应用程序项目,启动Nuget,然后搜索“SVN”。由于sharpSVN目前不适用于.NET Fx 4.0,因此项目目标应为.NET Fx 3.5。
//検索後以下のようにsharpsvnが見つかるはずです。
//搜索后你应该找到如下的sharpsvn。
//通常ではとりあえずx86版を選んでおけば良いと思います。
//目前,您通常应该选择x86版本。
//ただし、通常のダウンロード、NuGetで入手できるのはSVN 1.6に対応した安定版で、SVN1.6までとは互換性の無いSVN 1.7のワーキングディレクトリ形式に対応した物ではありません。
//但是,正常下载,NuGet可以获得的是与SVN 1.6兼容的稳定版本,而不是与SVN 1.6或更早版本不兼容的SVN 1.7工作目录格式兼容的版本。
//Tortoise SVNは既にSVN 1.7に対応していることもあり、今から何かを作るのであれば、1.7以降に対応したライブラリを使用した方が良いでしょう。
//Tortoise SVN已与SVN 1.7兼容,因此如果您想从现在开始创建内容,则应使用与1.7或更高版本兼容的库。
//残念ながら1.7に対応したsharpSVNはNuGetでは入手できず、SVN 1.7に対応したsharpSVNは現状Daily Buildとしてのみ公開されているので、以下よりダウンロードして使用します。(最新版のダウンロードで問題ないはずです)
//遗憾的是,与NSG不兼容的sharpSVN不能通过NuGet获得,而与SVN 1.7兼容的sharpSVN目前仅作为Daily Build发布,因此将从以下版本下载和使用。 (下载最新版本应该没有问题)
//Documents & files: Daily-1.7
//文件和文件:每日1.7
//http://sharpsvn.open.collab.net/daily/1.7.x
//ダウンロードしたら適当なフォルダに解凍し、プロジェクトにSharpSvn.dllへの参照を追加します。
//下载后,解压缩到合适的文件夹,并将SharpSvn.dll的引用添加到项目中。
//では実際にコードを見ていきましょう。とは言ってもコードを見れば一目瞭然ですね。
//我们实际看看代码。也就是说,如果你看一下代码就很明显了。
//まずはクライアントの作成。Subversionクライアントのインスタンスを作って、コマンド実行時に呼び出される通知用のイベントを追加します。
//首先,创建一个客户端。
//创建Subversion客户端的实例,
client = new SvnClient();
//并为执行命令时调用的通知添加事件。
//イベント設定
//活动设定
client.Notify += new EventHandler(client_Notify);
private static void client_Notify(object sender, SvnNotifyEventArgs e) {
switch (e.CommandType) {
//チェックアウト/アップデート中のファイルを表示する
//显示正在检出/更新的文件
case SvnCommandType.CheckOut:
case SvnCommandType.Update:
case SvnCommandType.Add:
case SvnCommandType.Commit:
Console.WriteLine(e.FullPath + “, Rev. ” + e.Revision + “\t : ” + e.Action);
break;
default:
break;
}
}
//つぎはワーキングディレクトリにチェックアウトもしくはアップデートを実行する場合のコードです。
//这是检出或更新工作目录的代码:
private static void CheckoutOrUpdate(string repo, string dir) {
//チェックアウト
//检出
string svnDir = @”.svn”;
if (Directory.Exists(dir + “\\” + svnDir)) {
//.svnディレクトリが存在したらチェックアウト済みと見なし、アップデートする。
//如果.svn目录存在,请考虑检出并更新它。
Console.WriteLine(“++ Working Directory Update ++”);
client.Update(dir);
}
else {
//チェックアウトする。
//检出
Console.WriteLine(“++ CheckOut ++”);
client.CheckOut(new Uri(repo), dir);
}
}
//ファイルの追加
//添加文件
//add
client.Add(filePath);
//move(rename)
client.Move(filePath, destPath);
//delete
client.Delete(filePath);
//ワーキングディレクトリのステータスの取得
//获取工作目录状态
private static void PrintStatus(string workingDir) {
//ステータスを取得する
//获取状态
Collection stats;
client.GetStatus(workingDir, out stats);
foreach (var s in stats) { Console.WriteLine(“File :{0},
Last change time :{1},
Staus :{2}”,
s.FullPath,
s.LastChangeTime,
s.LocalContentStatus);
}
}
//コミット
//提交
private static void Commit(string workingDir) {
SvnCommitArgs ca = new SvnCommitArgs();
//ca.LogMessage = “ファイルを追加”;
ca.LogMessage = “添加文件”;
SvnCommitResult results;
client.Commit(workingDir, ca, out results);
Console.WriteLine(“Commit Time :{0}”, results.Time);
Console.WriteLine(“Commit Author :{0}”, results.Author);
Console.WriteLine(“Commit Revision :{0}”, results.Revision);
}
//全体コード。
//总代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections.ObjectModel;
using SharpSvn;
namespace SVNSample
{
/// SharpSVNのサンプル
/// SharpSVN例子
class Program
{
private static SvnClient client; //Subversion Client
static void Main(string[] args) {
if (args.Length <= 0) {
Console.WriteLine("Usage: SVNSample [Repo URI] [Work Directory]");
} client = new SvnClient();
//イベント設定 client.Notify += new EventHandler(client_Notify);
//活动设定 client.Notify += new EventHandler(client_Notify);
try {
//資格情報を作成してクライアントに登録する。(ネットワーク越しで認証が必要なケース)
//创建凭据并在客户端上注册它们。 (需要通过网络进行身份验证的情况)
//var cred = new System.Net.NetworkCredential(“ishisaka”, “”);
//client.Authentication.DefaultCredentials = cred;
//ワーキングディレクトリの状態によってチェックアウトもしくはアップデートを行う。
//根据工作目录的状态检出或更新。
CheckoutOrUpdate(args[0], args[1]);
//listコマンドの実行
//执行list命令
Console.WriteLine(“+++ Repo Directory / File List +++”);
GetRepoList(new Uri(args[0]));
//テスト用のファイルの作成
//创建测试文件
Console.WriteLine(“+++ File Cleate \”hello[yyyymmddhhmmss].py\” +++”);
var contents = “print ‘Hello py’\n”;
var dateStr = DateTime.Now.ToString(“yyyyMMddhhmmss”);
var filePath = args[1] + “\\trunk\\hello” + dateStr + “.py”;
File.WriteAllText(filePath, contents);
//ADD
Console.WriteLine(“+++ File Add +++”);
client.Add(filePath);
//ステータス
//状态
Console.WriteLine(“+++ Status +++”);
PrintStatus(args[1]);
//コミット
//提交
Console.WriteLine(“+++ Commit +++”);
Commit(args[1]);
//Console.Write(“何か入力で終了:”);
Console.Write(“退出:”);
Console.Read();
}
finally {
client.Dispose();
}
}
private static void Commit(string workingDir) {
SvnCommitArgs ca = new SvnCommitArgs();
//ca.LogMessage = “ファイルを追加”;
ca.LogMessage = “添加文件”;
SvnCommitResult results;
client.Commit(workingDir, ca, out results);
Console.WriteLine(“Commit Time :{0}”, results.Time);
Console.WriteLine(“Commit Author :{0}”, results.Author);
Console.WriteLine(“Commit Revision :{0}”, results.Revision);
}
private static void PrintStatus(string workingDir) {
//ステータスを取得する
//获取状态
Collection stats;
client.GetStatus(workingDir, out stats);
foreach (var s in stats) {
Console.WriteLine(“File :{0}, Last change time :{1}, Staus :{2}”,
s.FullPath, s.LastChangeTime, s.LocalContentStatus);
}
}
private static void CheckoutOrUpdate(string repo, string dir) {
//チェックアウト
//检出
string svnDir = @”.svn”;
if (Directory.Exists(dir + “\\” + svnDir)) {
//.svnディレクトリが存在したらチェックアウト済みと見なし、アップデートする。
//如果.svn目录存在,请考虑检出并更新它。
Console.WriteLine(“++ Working Directory Update ++”);
client.Update(dir);
}
else {
//チェックアウトする。
Console.WriteLine(“++ CheckOut ++”);
client.CheckOut(new Uri(repo), dir);
}
}
private static void GetRepoList(Uri url) {
//Collectionの用意
//收集的准备 Collection的准备
Collection list;
string myPath = url.LocalPath;
//ターゲットの作成
//创建目标
SvnUriTarget repo = new SvnUriTarget(url);
//listコマンドの実行
//执行list命令
client.GetList(repo, out list);
foreach (var l in list) {
//レポジトリのルートディレクトリは無視する。
//忽略存储库根目录
if (l.Uri.LocalPath == l.RepositoryRoot.LocalPath) continue;
switch (l.Entry.NodeKind) {
case SvnNodeKind.Directory:
if (l.Uri.LocalPath != myPath) {
Console.WriteLine(“Folder\t:{0}”, l.Uri.LocalPath);
GetRepoList(l.Uri);
}
break;
case SvnNodeKind.File:
Console.WriteLine(“\tFile\t:{0}”, Path.GetFileName(l.Uri.LocalPath));
break;
}
}
list.Clear();
}
private static void client_Notify(object sender, SvnNotifyEventArgs e) {
switch (e.CommandType) {
//チェックアウト/アップデート中のファイルを表示する
//显示正在检出/更新的文件
case SvnCommandType.CheckOut:
case SvnCommandType.Update:
case SvnCommandType.Add:
case SvnCommandType.Commit:
Console.WriteLine(e.FullPath + “, Rev. ” + e.Revision + “\t : ” + e.Action);
break;
default:
break;
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步