ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

プログラムから Trac を操作する

C# の勉強がてらプログラムから Trac を操作するアプリを作ることにする。
とりあえずわかっているのは、Trac を外部から操作するためには XmlRpcPlugin を入れて XML-RPC という形で操作するらしいということ。


いろいろ調べたところ、XML-RPC.NET という C#オープンソースライブラリがあるようなのでこれを使ってみる。


試行錯誤しながらやってたけど、どんぴしゃなサイトを見つけてしまった^^;
確か以前にもやろうと思って放置してたやつ。


それでも、自分でやることに意義があるのでめげずにやってみることにする。

環境

前提条件

  • Trac プロジェクトは SampleProject とし、http://localhost:5080/trac/SampleProject/ とする
  • 使用するユーザは、username、password とし、TRAC_ADMIN 権限を割り当てておく。

サンプルプログラム

時間の関係で説明は後日^^;
とりあえずソースのみ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Collections;
using CookComputing.XmlRpc;

namespace TracXmlRpcPluginConsole
{
    // TracXmlRpcPlugin 用コマンド
    public interface ITracXmlRpcPlugin : IXmlRpcProxy
    {
        // チケットのクエリを取得する
        [XmlRpcMethod( "ticket.query" )]
        int[] TicketQuery( string qstr );

        // 指定されたチケット番号の詳細を取得する
        [XmlRpcMethod( "ticket.get" )]
        object[] TicketGet( int id );

        // チケットを新規作成する
        [XmlRpcMethod( "ticket.create" )]
        int TicketCreate( string summary, string description );
    }

    class Program
    {
        static void Main( string[] args )
        {
            try {
                // XML-RPC オブジェクトのインスタンス
                ITracXmlRpcPlugin trac = (ITracXmlRpcPlugin)XmlRpcProxyGen.Create(typeof(ITracXmlRpcPlugin));

                // 接続する URL及びユーザ名、パスワードを設定
                trac.Url = "http://localhost:5080/trac/SampleProject/login/xmlrpc";
                trac.PreAuthenticate = true;
                trac.Credentials = new NetworkCredential( "username", "password" );

                // チケットを登録する
                for ( int i = 0; i < 10; ++i ) {
                    trac.TicketCreate( "remote create test No." + i, "test TEST テスト" );
                }

                // アクティブなチケット一覧を取得
                int[] query = trac.TicketQuery( "status!=closed" );
                foreach ( int i in query ) {
                    // チケットの詳細を取得して表示
                    object[] ret = trac.TicketGet( i );
                    Console.WriteLine( "チケット番号:" + ret[0] );
                    XmlRpcStruct attributes = (XmlRpcStruct)ret[3];
                    foreach ( DictionaryEntry obj in attributes ) {
                        Console.WriteLine( obj.Key + ":" + obj.Value );
                    }
                    Console.WriteLine( "" );
                }

                Console.WriteLine( "正常終了" );
            }
            catch ( Exception ex ) {
                Console.WriteLine( ex.Message );
            }
        }
    }
}

事前準備

  • XML-RPC.NET に含まれている CookComputing.XmlRpc.dll をプロジェクトフォルダにコピー
  • 下記3つの名前空間をインポートしておく
using System.Net;             // NetworkCredential 用
using System.Collections;     // DictionaryEntry 用
using CookComputing.XmlRpc;   // XmlRpc 用

Trac インタフェースの作成

IXmlRpcProxy から継承した Trac インタフェースを作成する。
このインタフェースが Trac との通信を行う。


インフェースメソッドを作成し、XmlRpcMethod でメソッドに関連付けるする RPC 名を設定する。
メソッドの引数及び戻り値はhttp://<サーバ名>/trac/<プロジェクト名>/login/xmlrpcで確認する。


今回はチケットの登録、チケットの一覧、チケットの詳細の3機能を実装する。

Trac インタフェースのインスタンス生成とログイン情報設定

// XML-RPC オブジェクトのインスタンス
ITracXmlRpcPlugin trac = (ITracXmlRpcPlugin)XmlRpcProxyGen.Create(typeof(ITracXmlRpcPlugin));

// 接続する URL及びユーザ名、パスワードを設定
trac.Url = "http://localhost:5080/trac/SampleProject/login/xmlrpc";
trac.PreAuthenticate = true;
trac.Credentials = new NetworkCredential( "username", "password" );
  • XmlRpcProxyGen.Create でTrac インタフェースのインスタンスを生成する
  • Url プロパティで 接続サーバ名を設定
  • PreAuthenticate プロパティは true を指定(詳細不明)
  • Credentials プロパティには、NetworkCredential 型でユーザ名とパスワードを設定

Trac へのアクセス

Trac インタフェースを通じて、Trac にアクセスする。
不明な引数及び戻り値については、デバッガを使用することで型を確認し実装する。