Nov 12, 2007

[Trac] Trac で画像のプレビューが表示されない

「Trac で画像のプレビューが表示されないのだけれど・・・」という相談を受けた。 で、調べた結果をメモ。

症状の内容

Trac Wiki の添付アップロード画面(ex. http://example.com/trac/attachment/wiki/WikiStart?action=new) や添付ファイル表示画面(ex. http://example.com/trac/attachment/wiki/WikiStart/photo.jpg) で、以下のエラーメッセージが表示され画像のプレビューが表示されない。

HTML preview not available, since the file size exceeds 262144 bytes. You may download the file instead.

回避方法

trac.ini の mimeviewer セクションに max_preview_size という設定項目があるので、それを変更。 デフォルトでは 262144 になっているので、適当な値 (1Mbyte の場合は 1048576) にするだけ。

[mimeviewer]
enscript_modes = text/x-dylan:dylan:4
enscript_path = enscript
max_preview_size = 262144
mime_map = text/x-dylan:dylan,text/x-idl:ice,text/x-ada:ads:adb

補足

trac.ini の max_preview_size を変更する前にアップロードしてプレビューが表示されていない画像は、 max_preview_size を変更してもプレビューは表示されない模様。詳しく調べていないので断定はできないけれど。 その場合は再度添付作業をやり直す必要がある。

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 30, 2007

[Trac] 既存の Trac 0.9 のデータを Trac 0.10 に移行する

既存の Trac 0.9 環境を Trac 0.10 に移行したときの作業メモ。

yum でインストールして、trac-admin で既存データの upgrade を行うだけ。

# yum update trac.noarch
Loading "installonlyn" plugin
Setting up Update Process
Setting up repositories
    (SNIP)
Updated: trac.noarch 0:0.10.3.1-2.fc5
Complete!
# trac-admin /home/trac/myproject hotcopy /home/trac/myproject.backup
Hotcopying /home/trac/myproject to /home/trac/myproject.20070801 ... Hotcopy done.
# trac-admin /usr/local/beattrac upgrade --no-backup
Upgrade done.
# trac-admin /usr/local/beattrac wiki upgrade
 /usr/share/trac/wiki-default/TracGuide => TracGuide
  TracGuide already up to date.
 /usr/share/trac/wiki-default/TracBackup => TracBackup
 /usr/share/trac/wiki-default/TracRoadmap => TracRoadmap
 /usr/share/trac/wiki-default/TracIni => TracIni
 /usr/share/trac/wiki-default/TracAccessibility => TracAccessibility
 /usr/share/trac/wiki-default/TracUnicode => TracUnicode
 /usr/share/trac/wiki-default/TracInstall => TracInstall
 /usr/share/trac/wiki-default/TracEnvironment => TracEnvironment
 /usr/share/trac/wiki-default/InterMapTxt => InterMapTxt
 /usr/share/trac/wiki-default/TracQuery => TracQuery
 /usr/share/trac/wiki-default/TracReports => TracReports
 /usr/share/trac/wiki-default/TitleIndex => TitleIndex
  TitleIndex already up to date.
 /usr/share/trac/wiki-default/TracTicketsCustomFields => TracTicketsCustomFields
 /usr/share/trac/wiki-default/WikiPageNames => WikiPageNames
 /usr/share/trac/wiki-default/TracUpgrade => TracUpgrade
 /usr/share/trac/wiki-default/TracRss => TracRss
 /usr/share/trac/wiki-default/RecentChanges => RecentChanges
  RecentChanges already up to date.
 /usr/share/trac/wiki-default/WikiProcessors => WikiProcessors
 /usr/share/trac/wiki-default/TracSyntaxColoring => TracSyntaxColoring
 /usr/share/trac/wiki-default/TracPlugins => TracPlugins
 /usr/share/trac/wiki-default/TracPermissions => TracPermissions
 /usr/share/trac/wiki-default/TracChangeset => TracChangeset
 /usr/share/trac/wiki-default/TracRevisionLog => TracRevisionLog
 /usr/share/trac/wiki-default/TracFastCgi => TracFastCgi
 /usr/share/trac/wiki-default/TracTickets => TracTickets
 /usr/share/trac/wiki-default/TracLogging => TracLogging
  TracLogging already up to date.
 /usr/share/trac/wiki-default/WikiFormatting => WikiFormatting
 /usr/share/trac/wiki-default/TracLinks => TracLinks
 /usr/share/trac/wiki-default/TracTimeline => TracTimeline
 /usr/share/trac/wiki-default/TracSearch => TracSearch
 /usr/share/trac/wiki-default/CamelCase => CamelCase
 /usr/share/trac/wiki-default/TracBrowser => TracBrowser
 /usr/share/trac/wiki-default/TracImport => TracImport
 /usr/share/trac/wiki-default/WikiHtml => WikiHtml
 /usr/share/trac/wiki-default/TracWiki => TracWiki
 /usr/share/trac/wiki-default/TracCgi => TracCgi
 /usr/share/trac/wiki-default/TracStandalone => TracStandalone
 /usr/share/trac/wiki-default/WikiMacros => WikiMacros
 /usr/share/trac/wiki-default/TracInterfaceCustomization => TracInterfaceCustomization
 /usr/share/trac/wiki-default/TracModPython => TracModPython
 /usr/share/trac/wiki-default/WikiRestructuredTextLinks => WikiRestructuredTextLinks
 /usr/share/trac/wiki-default/TracNotification => TracNotification
 /usr/share/trac/wiki-default/TracSupport => TracSupport
 /usr/share/trac/wiki-default/WikiRestructuredText => WikiRestructuredText
 /usr/share/trac/wiki-default/InterWiki => InterWiki
 /usr/share/trac/wiki-default/TracAdmin => TracAdmin
 /usr/share/trac/wiki-default/SandBox => SandBox
  SandBox already up to date.
 /usr/share/trac/wiki-default/WikiNewPage => WikiNewPage
 /usr/share/trac/wiki-default/WikiDeletePage => WikiDeletePage
 /usr/share/trac/wiki-default/InterTrac => InterTrac
#

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 26, 2007

[Trac] 静的リソースの trac.ini での指定方法

Trac の静的リソースには、個々の Trac インスタンス毎のものと、同一サーバ上の全 Trac から参照されるものの二種類がある。 それぞれストレージ上の設置場所が異なるので、trac.ini では指定方法をかえなければならない。 今回はロゴを変更したかったので、Trac インスタンス単位のリソースとして画像を設置してみた。

静的リソースの trac.ini での指定方法

Trac インスタンス毎のリソース
ストレージの "/usr/share/trac/htdocs/" が trac.ini の "common/" に相当する。
全 Trac から参照されるのリソース
ストレージの "$TRAC_ENVIRONMENT_HOME/htdocs/" が trac.ini の "site/" に相当する。
http://www.example.com/trac/wiki/TracInterfaceCustomization

Change the src setting to site/ followed by the name of your image file. The width and height settings should be modified to match your image's dimensions (the Trac chrome handler uses "site/" for files within the project directory htdocs and "common/" for the common ones).

ロゴの登録方法

$TRAC_ENVIRONMENT_HOME/htdocs/logo.png という名前でロゴ画像を設置し、trac.ini に

[header_logo]
height = -1
link = site/logo.png
を指定する。

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 20, 2007

[Trac] Trac チケット起票時の "Assign to" フィールドをコンボボックス化する

Trac のチケットを起票する際、デフォルトでは "Assign to" フィールドは TextField になっている。 そのため、担当者のアカウント名を調べて入力するという作業が必要になる。 これが意外と面倒なので、"Assign to" を選択式に設定してみた。

設定方法

設定は非常に簡単。 $TRAC_HOME/myproject/conf/trac.ini の [ticket] セクションにある restrict_owner を false → true に変更するだけ。 この設定はデフォルトで false になっている。

[ticket]
restrict_owner = true

詳細情報

Trac の Help から関連情報を転載。 コンボボックスにプロジェクトメンバーが表示されない場合、下記の通り当該メンバーに Setting の変更などを行ってもらい、Trac セッションを作成する必要がある。

Assign-to as Drop-Down List
If the list of possible ticket owners is finite, you can change the assign-to ticket field from a text input to a drop-down list. This is done by setting the restrict_owner option of the [ticket] section in trac.ini to “true”. In that case, Trac will use the list of all users who have logged in and set their email address to populate the drop-down field.
To appear in the dropdown list, a user needs be registered with the project, i.e. a user session should exist in the database. Such an entry is automatically created in the database the first time the user submits a change in the project, for example when editing the user's details in the Settings page. Also, the user must have TICKET_MODIFY permissions.

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 19, 2007

[Trac] Trac の XML-RPC API にチャレンジ

Trac XML-RPC Plugin
http://trac-hacks.org/wiki/XmlRpcPlugin
root/xmlrpcplugin/0.10/tracrpc/api.py
http://trac-hacks.org/browser/xmlrpcplugin/0.10/tracrpc/api.py

Trac 0.10.3 の XML-RPC API

Trac XML-RPC Plugin を導入すると、http://example.com/mytrac/xmlrpc (Trac のトップ画面の URL に /xmlrpc を付加する)で API を閲覧することができる。 Trac 0.10.3 に 0.10 用の XML-RPC Plugin を導入した環境では下記の API が使用できる。


wiki
Function Description Permission required
struct wiki.getRecentChanges(dateTime.iso8601 since) Get list of changed pages since timestamp WIKI_VIEW
int wiki.getRPCVersionSupported() Returns 2 with this version of the Trac API. WIKI_VIEW
string wiki.getPage(string pagename, int version=None) Get the raw Wiki text of page, latest version. WIKI_VIEW
string wiki.getPageVersion(string pagename, int version=None) Get the raw Wiki text of page, latest version. WIKI_VIEW
string wiki.getPageHTML(string pagename, int version=None) Return page in rendered HTML, latest version. WIKI_VIEW
string wiki.getPageHTMLVersion(string pagename, int version=None) Return page in rendered HTML, latest version. WIKI_VIEW
array wiki.getAllPages() Returns a list of all pages. The result is an array of utf8 pagenames. WIKI_VIEW
struct wiki.getPageInfo(string pagename, int version=None) Returns information about the given page. WIKI_VIEW
struct wiki.getPageInfoVersion(string pagename, int version=None) Returns information about the given page. WIKI_VIEW
boolean wiki.putPage(string pagename, string content, struct attributes) writes the content of the page. WIKI_CREATE
array wiki.listAttachments(string pagename) Lists attachments on a given page. WIKI_VIEW
base64 wiki.getAttachment(string path) returns the content of an attachment. WIKI_VIEW
boolean wiki.putAttachment(string path, base64 data) (over)writes an attachment. Returns True if successful.This method is compatible with WikiRPC. putAttachmentEx has a more extensive set of (Trac-specific) features. WIKI_MODIFY
boolean wiki.putAttachmentEx(string pagename, string filename, string description, base64 data, boolean replace=True) Attach a file to a Wiki page. Returns the (possibly transformed) filename of the attachment. Use this method if you don't care about WikiRPC compatibility. WIKI_MODIFY
boolean wiki.deleteAttachment(string path) Delete an attachment. WIKI_DELETE
array wiki.listLinks(string pagename) Not implemented WIKI_VIEW
string wiki.wikiToHtml(string text) Render arbitrary Wiki text as HTML. WIKI_VIEW

search - Search Trac.
Function Description Permission required
array search.getSearchFilters() Retrieve a list of search filters with each element in the form (name, description). SEARCH_VIEW
array search.performSearch(string query, array filters=[]) Perform a search using the given filters. Defaults to all if not provided. Results are returned as a list of tuples in the form (href, title, date, author, excerpt). SEARCH_VIEW

ticket.milestone - Interface to ticket milestone objects.
Function Description Permission required
array ticket.milestone.getAll() Get a list of all ticket milestone names. TICKET_VIEW
struct ticket.milestone.get(string name) Get a ticket milestone. TICKET_VIEW
int ticket.milestone.delete(string name) Delete a ticket milestone TICKET_ADMIN
int ticket.milestone.create(string name, struct attributes) Create a new ticket milestone with the given attributes. TICKET_ADMIN
int ticket.milestone.update(string name, struct attributes) Update ticket milestone with the given attributes. TICKET_ADMIN

ticket.severity - Interface to ticket severity.
Function Description Permission required
array ticket.severity.getAll() Get a list of all ticket severity names. TICKET_VIEW
string ticket.severity.get(string name) Get a ticket severity. TICKET_VIEW
int ticket.severity.delete(string name) Delete a ticket severity TICKET_ADMIN
int ticket.severity.create(string name, string value) Create a new ticket severity with the given value. TICKET_ADMIN
int ticket.severity.update(string name, string value) Update ticket severity with the given value. TICKET_ADMIN

ticket.type - Interface to ticket type.
Function Description Permission required
array ticket.type.getAll() Get a list of all ticket type names. TICKET_VIEW
string ticket.type.get(string name) Get a ticket type. TICKET_VIEW
int ticket.type.delete(string name) Delete a ticket type TICKET_ADMIN
int ticket.type.create(string name, string value) Create a new ticket type with the given value. TICKET_ADMIN
int ticket.type.update(string name, string value) Update ticket type with the given value. TICKET_ADMIN

system - Core of the XML-RPC system.
Function Description Permission required
array system.multicall(array signatures) Takes an array of XML-RPC calls encoded as structs of the form (in a Pythonish notation here): {'methodName': string, 'params': array} XML_RPC
array system.listMethods() This method returns a list of strings, one for each (non-system) method supported by the XML-RPC server. XML_RPC
string system.methodHelp(string method) This method takes one parameter, the name of a method implemented by the XML-RPC server. It returns a documentation string describing the use of that method. If no such string is available, an empty string is returned. The documentation string may contain HTML markup. XML_RPC
array system.methodSignature(string method) This method takes one parameter, the name of a method implemented by the XML-RPC server. It returns an array of possible signatures for this method. A signature is an array of types. The first of these types is the return type of the method, the rest are parameters. XML_RPC
array system.getAPIVersion() Returns a list with two elements. First element is the major version number, second is the minor. Changes to the major version indicate API breaking changes, while minor version changes are simple additions, bug fixes, etc. XML_RPC

ticket.resolution - Interface to ticket resolution.
Function Description Permission required
array ticket.resolution.getAll() Get a list of all ticket resolution names. TICKET_VIEW
string ticket.resolution.get(string name) Get a ticket resolution. TICKET_VIEW
int ticket.resolution.delete(string name) Delete a ticket resolution TICKET_ADMIN
int ticket.resolution.create(string name, string value) Create a new ticket resolution with the given value. TICKET_ADMIN
int ticket.resolution.update(string name, string value) Update ticket resolution with the given value. TICKET_ADMIN

ticket.priority - Interface to ticket priority.
Function Description Permission required
array ticket.priority.getAll() Get a list of all ticket priority names. TICKET_VIEW
string ticket.priority.get(string name) Get a ticket priority. TICKET_VIEW
int ticket.priority.delete(string name) Delete a ticket priority TICKET_ADMIN
int ticket.priority.create(string name, string value) Create a new ticket priority with the given value. TICKET_ADMIN
int ticket.priority.update(string name, string value) Update ticket priority with the given value. TICKET_ADMIN

ticket.component - Interface to ticket component objects.
Function Description Permission required
array ticket.component.getAll() Get a list of all ticket component names. TICKET_VIEW
struct ticket.component.get(string name) Get a ticket component. TICKET_VIEW
int ticket.component.delete(string name) Delete a ticket component TICKET_ADMIN
int ticket.component.create(string name, struct attributes) Create a new ticket component with the given attributes. TICKET_ADMIN
int ticket.component.update(string name, struct attributes) Update ticket component with the given attributes. TICKET_ADMIN

ticket.version - Interface to ticket version objects.
Function Description Permission required
array ticket.version.getAll() Get a list of all ticket version names. TICKET_VIEW
struct ticket.version.get(string name) Get a ticket version. TICKET_VIEW
int ticket.version.delete(string name) Delete a ticket version TICKET_ADMIN
int ticket.version.create(string name, struct attributes) Create a new ticket version with the given attributes. TICKET_ADMIN
int ticket.version.update(string name, struct attributes) Update ticket version with the given attributes. TICKET_ADMIN

ticket - An interface to Trac's ticketing system.
Function Description Permission required
array ticket.query(string qstr="status!=closed") Perform a ticket query, returning a list of ticket ID's. TICKET_VIEW
array ticket.getRecentChanges(dateTime.iso8601 since) Returns a list of IDs of tickets that have changed since timestamp. TICKET_VIEW
array ticket.getAvailableActions(int id) Returns the actions that can be performed on the ticket. TICKET_VIEW
array ticket.get(int id) Fetch a ticket. Returns [id, time_created, time_changed, attributes]. TICKET_VIEW
int ticket.create(string summary, string description, struct attributes={}, boolean notify=False) Create a new ticket, returning the ticket ID. TICKET_CREATE
array ticket.update(int id, string comment, struct attributes={}, boolean notify=False) Update a ticket, returning the new ticket in the same form as getTicket(). TICKET_APPEND
int ticket.delete(int id) Delete ticket with the given id. TICKET_ADMIN
struct ticket.changeLog(int id, int when=0) Return the changelog as a list of tuples of the form (time, author, field, oldvalue, newvalue, permanent). While the other tuple elements are quite self-explanatory, the permanent flag is used to distinguish collateral changes that are not yet immutable (like attachments, currently). TICKET_VIEW
array ticket.listAttachments(int ticket) Lists attachments for a given ticket. Returns (filename, description, size, time, author) for each attachment. TICKET_VIEW
base64 ticket.getAttachment(int ticket, string filename) returns the content of an attachment. TICKET_VIEW
string ticket.putAttachment(int ticket, string filename, string description, base64 data, boolean replace=True) Add an attachment, optionally (and defaulting to) overwriting an existing one. Returns filename. TICKET_APPEND
boolean ticket.deleteAttachment(int ticket, string filename) Delete an attachment. TICKET_ADMIN
array ticket.getTicketFields() Return a list of all ticket fields fields. TICKET_VIEW

ticket.status - Interface to ticket status.
Function Description Permission required
array ticket.status.getAll() Get a list of all ticket status names. TICKET_VIEW
string ticket.status.get(string name) Get a ticket status. TICKET_VIEW
int ticket.status.delete(string name) Delete a ticket status TICKET_ADMIN
int ticket.status.create(string name, string value) Create a new ticket status with the given value. TICKET_ADMIN
int ticket.status.update(string name, string value) Update ticket status with the given value. TICKET_ADMIN

Java から Trac XML-RPC API にアクセスしてみる

試しに Java から Trac 上の Ticket を取得してみた。 ライブラリをインストールするのが面倒だったので、自前で HTTP コネクションを張っている。

サンプルコード

public void testTracApi() throws Exception {

  URL url = new URL("http://example.com/trac/xmlrpc");
  HttpURLConnection con = (HttpURLConnection) url.openConnection();
  con.setDoOutput(true);
  con.setDoInput(true);
  con.setRequestMethod("POST");
  con.addRequestProperty("content-type", "text/xml");
  OutputStream os = null;

  try {
    os = con.getOutputStream();
    String request = 
      "<methodCall>\n" + 
      "  <methodName>ticket.get</methodName>\n" +
      "  <params>" + 
      "  <param><value><int>3</int></value></param>" + 
      "  </params>" + 
      "</methodCall>\n";
    os.write(request.getBytes());
  } finally {
    if (os != null) {
      os.close();
    }
  }

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  InputStream is = null;
  try {
    is = con.getInputStream();
    int ch = 0;
    while ((ch = is.read()) >= 0) {
      baos.write(ch);
    }
  } finally {
    if (is != null) {
      is.close();
    }
  }

  System.out.println("" + baos.toString("UTF-8"));
}

レスポンス

<?xml version='1.0'?>
<methodResponse>
<params>
<param>
<value><array><data>
<value><int>3</int></value>
<value><int>1179403566</int></value>
<value><int>1179403566</int></value>
<value><struct>
<member>
<name>status</name>
<value><string>new</string></value>
</member>
<member>
<name>description</name>
<value><string>基本的な設定を行う。</string></value>
</member>
<member>
<name>reporter</name>
<value><string>et</string></value>
</member>
<member>
<name>cc</name>
<value><string></string></value>
</member>
<member>
<name>resolution</name>
<value><string></string></value>
</member>
<member>
<name>component</name>
<value><string>Continuum</string></value>
</member>
<member>
<name>summary</name>
<value><string>Continuum 設定</string></value>
</member>
<member>
<name>priority</name>
<value><string>major</string></value>
</member>
<member>
<name>keywords</name>
<value><string></string></value>
</member>
<member>
<name>version</name>
<value><string></string></value>
</member>
<member>
<name>milestone</name>
<value><string>[Continuum] M1</string></value>
</member>
<member>
<name>owner</name>
<value><string>me</string></value>
</member>
<member>
<name>type</name>
<value><string>task</string></value>
</member>
</struct></value>
</data></array></value>
</param>
</params>
</methodResponse>

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 17, 2007

[Trac] Mylar で Eclipse + Trac Ticket 連携にチャレンジ

Mylar とは

Eclipse Mylar Project によると、Mylar とは

Eclipse Mylar is a task-focused UI that reduces information overload and makes multi-tasking easy.
というものだそうだ。要するに、Eclipse 上で Eclipse UI に従ってタスク管理をすることができるというプラグインのこと。 面白いのは、Trac 用の Mylar Connector が用意されていて、Trac 側で XML-RPC プラグインを用意しておくと Mylar で Trac のチケットを管理できるようになるということ。 Trac はチケットの上手な活用が肝になるので、Eclipse と連携できると便利。 ということで、早速試してみた。
Eclipse Mylar
http://www.eclipse.org/mylar/
Trac XML-RPC プラグイン
http://trac-hacks.org/wiki/XmlRpcPlugin

Trac XML-RPC プラグインのインストール

これは、上記の Trac XML-RPC プラグインのページに従ってインストール作業をすれば OK。

Eclipse Mylar のインストール

Eclipse 3.3M7 で Mylar のインストールを試してみた。 Mylar は Callisto の後継となる Europa に含まれているので、インストールは非常に簡単。 Subversion にも Mylar 用プラグインがあったので、ついでにインストールしておいたが、 何の役に立っているのか良くわかっていない(^^; まぁ、大は小を兼ねるということで。

[Mylar インストール(1)]
Mylar は Europa でインストールできるので、Software Updates の機能を使用する。

[Mylar インストール(2)]
"Search for new features to install" を選択して次へ。

[Mylar インストール(3)]
今回は Mylar 関連のプラグインとして Europa に登録されている Mylar プラグインと Subclipseに含まれている Mylar プラグインをインストールするので、Europa と Subclipse にチェックして次へ。

[Mylar インストール(4)]
Mylar 関連のプラグインをチェックして次へ。図では全て選択してあるが、Connector は必要なものだけで良い。例えば、Trac にしか接続しないのであれば、Trac Connector だけ選択しておけば良い。

[Mylar インストール(5)]
後はお決まりのライセンス確認。次へ。

[Mylar インストール(6)]
インストールされるプラグインを確認。次へ。

[Mylar インストール(7)]
インストールの最終確認。次へ。

[Mylar インストール(8)]
Eclipse リブートの確認。次へ。

Eclipse Mylar の設定

Eclipse Mylar プラグインのインストールが終了して、Eclipse の再起動が終わったら Mylar の設定を行う。

[Mylar 設定(1)]
Eclipse のリブートが完了すると、Mylar の設定画面が表示される。特に変更すべき内容も無かったのでデフォルトの設定のまま次へ(変更したい方はどうぞ)。

[Mylar 設定(2)]
"Task List" View を右クリックして "New" を選択すると、"Query..." が表示されるのでこれを選択。

[Mylar 設定(3)]
デフォルトではタスクリポジトリに "Eclipse.org" しか登録されていないので、自分の Trac を登録する。"Add Task Repository" を選択。

[Mylar 設定(4)]
Server に Trac の URL を入力。Label は任意の文字列で良い。後は、認証が必要であれば認証情報を入力。Trac の場合、Access Type は XML-RPC にする。一通り入力が終わったら、"Validate Settings" を押して一度タスクリポジトリに接続してみる。エラーが出なければ設定完了。

[Mylar 設定(5)]
今追加したタスクリポジトリを選択して次へ。

[Mylar 設定(6)]
クエリの内容を入力する。今回は全てのチケットを表示する様にしておくため何も設定を行わずに次へ。

[Mylar 設定(7)]
"Task List" にチケットが表示されたら設定完了。後は、ここからチケットの起票や更新が可能となる。便利。

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 29, 2007

[Trac] Trac のバージョンアップメモ

Debian Sarge の Stable で提供されている Trac は未だに 0.8.x のまま。 残念なことに、最新は 0.10.x まで進化していて 0.8.x では動かないプラグインが山の様に存在する。 なかなか素敵なプラグインを発見したのに 0.8.x では動かないことが分かりガッカリ、という経験を繰り返したので Trac をバージョンアップすることに。

Debian Sarge で Trac を 0.10.x にバージョンアップ

当然 Sarge の Stable では提供されていないので、tar ball を自分で取得してインストールする。 Trac のインストール方法に関しては やどりぎ@NET さんの trac + TracBurndownプラグインでスクラム開発のすすめ を参考にさせていただいた。多謝。

Trac 0.10.x の取得 & 解凍

2007/03/29 現在、0.10.3.1 が最新の様なのでそれを取得する。 取得したらついでに解凍しておく。

$ wget http://ftp.edgewall.com/pub/trac/trac-0.10.3.1.tar.gz
--19:53:27--  http://ftp.edgewall.com/pub/trac/trac-0.10.3.1.tar.gz
           => `trac-0.10.3.1.tar.gz'
Resolving ftp.edgewall.com... 83.168.202.212
Connecting to ftp.edgewall.com[83.168.202.212]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 443,713 [application/octet-stream]

100%[====================================>] 443,713      140.37K/s    ETA 00:00

19:53:34 (139.99 KB/s) - `trac-0.10.3.1.tar.gz' saved [443713/443713]

$ tar zxvf ./trac-0.10.3.1.tar.gz 
trac-0.10.3.1/
trac-0.10.3.1/AUTHORS
trac-0.10.3.1/cgi-bin/
trac-0.10.3.1/cgi-bin/trac.cgi

  (snip)

/usr/lib/python2.3/traceback.pyo
/usr/lib/python2.3/trace.pyo
/usr/sbin/traceroute
$

Trac のインストール

とりあえず Trac のインストーラを実行してみる。

$ cd trac-0.10.3.1
# python ./setup.py install --force
running install
error: invalid Python installation: unable to open /usr/lib/python2.3/config/Makefile (No such file or directory)
#

というわけで、どうやら Python の環境が足りないらしい。 これは python-dev というパッケージをインストールすれば良いらしい。

# apt-get install python-dev

Reading Package Lists... 0%

Reading Package Lists... 0%

  (snip)

The following extra packages will be installed:
  python2.3-dev
The following NEW packages will be installed:
  python-dev python2.3-dev
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 1488kB of archives.
After unpacking 4678kB of additional disk space will be used.
Do you want to continue? [Y/n] Y


0% [Working]
            
Get:1 http://www.jp.debian.org sarge/main python2.3-dev 2.3.5-3sarge2 [1481kB]

            
0% [1 python2.3-dev 2288/1481kB 0%]
                                   
37% [1 python2.3-dev 564816/1481kB 38%]
66% [1 python2.3-dev 990528/1481kB 66%]
                                       
99% [Waiting for headers]
                         
Get:2 http://www.jp.debian.org sarge/main python-dev 2.3.5-2 [6638B]

                         
100% [Working]
              
Fetched 1488kB in 1s (800kB/s)
Selecting previously deselected package python2.3-dev.
(Reading database ... 24304 files and directories currently installed.)
Unpacking python2.3-dev (from .../python2.3-dev_2.3.5-3sarge2_i386.deb) ...
Selecting previously deselected package python-dev.
Unpacking python-dev (from .../python-dev_2.3.5-2_all.deb) ...
Setting up python2.3-dev (2.3.5-3sarge2) ...

Setting up python-dev (2.3.5-2) ...
#

再度 Trac のインストーラを実行。

# python ./setup.py install --force
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/trac
copying trac/__init__.py -> build/lib/trac
copying trac/About.py -> build/lib/trac
copying trac/attachment.py -> build/lib/trac
copying trac/config.py -> build/lib/trac
copying trac/core.py -> build/lib/trac

  (snip)

copying wiki-default/WikiProcessors -> /usr/share/trac/wiki-default
copying wiki-default/WikiRestructuredText -> /usr/share/trac/wiki-default
copying wiki-default/WikiRestructuredTextLinks -> /usr/share/trac/wiki-default
copying wiki-default/WikiStart -> /usr/share/trac/wiki-default
creating /usr/share/trac/wiki-macros
copying wiki-macros/HelloWorld.py -> /usr/share/trac/wiki-macros
copying wiki-macros/Timestamp.py -> /usr/share/trac/wiki-macros
copying wiki-macros/TracGuideToc.py -> /usr/share/trac/wiki-macros

Thank you for choosing Trac 0.10.3.1. Enjoy your stay!
#
今度は正常にインストールされた。

Trac 0.10.x の動作確認

やどりぎ@NET さんの情報でそのままでは動作しないことは分かっていたのだが、 とりあえずアクセスしてみた。情報通り TracError が発生して動作しなかった。 エラーページに記載されていたコマンドをそのまま実行。

# trac-admin /tmp/trac/myprojects upgrade
Please perform a "resync" after this upgrade.
Upgrade done.
#
今度は正常に動作した。 これで Trac 0.8.x → 0.10.x のバージョンアップはとりあえず完了(と思いたい)。

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 14, 2006

[Trac] Trac にチャレンジ(5)

カスタムレポートの作成

Trac はバグや TODO、その他 issue などを Ticket として管理する。 レポート機能を使用することで Ticket の一覧画面を簡単にカスタマイズできる。 例えば、「バージョンが 1.0.0 の Ticket 全て」「マイルストーン MS_001 の Ticket の内クローズされていないもの」といった画面を作成できる。 レポートは非常に便利な機能なので、自前の Report 作成にチャレンジしてみた。

カスタムレポートの作成方法

カスタムレポートの作成方法は Trac のヘルプに記述されている。
Trac Reports
https://www.in-vitro.jp/projects/wiki/TracReports
Trac Permissions
https://www.in-vitro.jp/projects/wiki/TracPermissions

アカウントにレポート生成権限を付与

デフォルト状態のアカウントはレポート生成権限を持っていない。 そのため、trac-admin コマンドを使用してレポート生成権限を与える。

# trac-admin /tmp/trac/myprojects permission add me REPORT_CREATE
ちなみに、レポート関連の権限には REPORT_VIEW, REPORT_CREATE, REPORT_MODIFY, REPORT_DELETE, REPORT_ADMIN, REPORT_SQL_VIEW がある。 REPORT_CREATE を付与するついでに REPORT_MODIFY を付与しておくと、デフォルトで用意されているレポートの定義情報を見られるようになる。

レポートの作成

REPORT_CREATE 権限を所有しているアカウントでログインすると、"View Tickets" 画面に "New Report" というリンクが表示される。 "New Report" からレポート生成画面に移動し、Report Title、Description、SQL Query for Report を入力するとレポートが生成される。 今回は特定のコンポーネント用の Ticket を表示するレポートを作成してみた。 作成した、とは言ってもほとんどデフォルトで用意されているレポートの Copy & Paste。

Active Tickets by Component [MyComponent]

SELECT p.value AS __color__,
   t.milestone AS __group__,
   (CASE status 
      WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;'
      ELSE 
        (CASE owner WHEN '$USER' THEN 'font-weight: bold' END)
    END) AS __style__,
   id AS ticket, summary, component, status, 
   resolution,version, severity, priority, owner,
   changetime AS modified,
   time AS _time,reporter AS _reporter
  FROM ticket t,enum p
  WHERE status IN ('new', 'assigned', 'reopened') AND 
        p.name=t.priority AND p.type='priority' AND
        component='MyComponent'
  ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'), 
        (CASE status WHEN 'closed' THEN modified ELSE -p.value END) DESC
All Tickets By Component[MyComponent]  (Including closed)

SELECT p.value AS __color__,
   t.milestone AS __group__,
   (CASE status 
      WHEN 'closed' THEN 'color: #777; background: #ddd; border-color: #ccc;'
      ELSE 
        (CASE owner WHEN '$USER' THEN 'font-weight: bold' END)
    END) AS __style__,
   id AS ticket, summary, component, status, 
   resolution,version, severity, priority, owner,
   changetime AS modified,
   time AS _time,reporter AS _reporter
  FROM ticket t,enum p
  WHERE p.name=t.priority AND p.type='priority' AND
        component='MyComponent'
  ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'), 
        (CASE status WHEN 'closed' THEN modified ELSE -p.value END) DESC

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 10, 2006

[Trac] Trac にチャレンジ(4)

Ticket のフィールドをカスタマイズする

Ticket にはデフォルトで Summary、Component、Version などいくつかのフィールドが用意されている。 また、デフォルトのフィールドでは不足の際はカスタムフィールドを追加することができる。 ということで、カスタムフィールドの追加にチャレンジ。

Custom Ticket Fields
http://projects.edgewall.com/trac/wiki/TracTicketsCustomFields

カスタムフィールドに関する設定は /tmp/trac/myprojects/conf/trac.ini で行う。 今回は Ticket の種類 (Memo、Bug、Todo) を指定する select 型のフィールドを追加してみる。
[ticket-custom]
ticket_type = select
ticket_type.label = Type
ticket_type.options = Memo|Bug|Todo
ticket_type.value = 0

[カスタムフィールドが追加された Ticket]

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jun 02, 2006

[Trac] Trac にチャレンジ(3)

マクロの追加

Trac built-in Wiki 用のマクロを追加してみた。 マクロは以下で公開されている。

MacroBazaar
http://projects.edgewall.com/trac/wiki/MacroBazaar
TracHacks - plugin
http://trac-hacks.org/wiki/plugin
今回追加したマクロは以下の通り。
Javadoc
http://projects.edgewall.com/trac/wiki/MacroBazaar#Javadoc
AddComment
http://trac-hacks.org/wiki/AddCommentMacro
TOC
http://trac-hacks.org/wiki/TocMacro
マクロは *.py をサイトからダウンロードしてきて、/tmp/trac/myprojects/wiki-macros (パスは環境毎に異なる)にコピーするだけで良い。 PukiWiki や Hiki などと同じ感覚で大丈夫。

Milestone を Google Calendar に表示する

Trac は Roadmap を iCalendar 用データファイルとしてエクスポートする機能を持っている。 このデータファイルには、Milestone やチケットの情報が含まれている。 都合の良いことに、Google Calendar は iCalendar のデータファイルをインポートする機能を持っている。 というわけで、Trac の Roadmap 情報を Google Calendar にインポートできるか試してみた。

Milestone の作成

まず Milestone を作成する。 先日試した様に trac-admin を使用する。 Milestone を作成する際には、必ず完了期日を指定する。 Google Calendar では完了期日の指定されていない Milestone は表示されない。

# trac-admin /tmp/trac/myprojects milestone add MyMilestone "Jun 18, 2006"
ちなみに、完了期日の設定されていない Milestone に完了期日を設定する場合は
# trac-admin /tmp/trac/myprojects milestone time MyMilestone "Jun 18, 2006"
という様に、"add" コマンドの代わりに "time" コマンドを使用する。

Roadmap のエクスポート

Roadmap ページに行くと、"Download in other formats: iCalendar" というリンクがある。 ここをクリックすると Roadmap の情報がエクスポートされる。

Google Calendar にインポート

Google Calendar の "settings" から "Import Calendar" タブを選択する。 先ほどエクスポートしたデータファイルを選択し、インポート先のカレンダーを指定。 "Import" ボタンを押下するとデータがインポートされる。

[データファイルのインポート] [インポート完了]
[インポートされた Milestone] [Milestone の詳細情報]

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 30, 2006

[Trac] Trac にチャレンジ(2)

Trac の動作環境が整ったので、実際に使用できるようにプロジェクトの初期設定を行う。 プロジェクトにはコンポーネントやマイルストーンなどの初期値が設定されている。 初期値をそのまま使うことはないので、初期値を削除して実際に使用する値をセットする。 この作業はコマンドラインから trac-admin コマンドを実行して行う。

TracAdmin
http://projects.edgewall.com/trac/wiki/TracAdmin

component の設定

コンポーネントの初期値は component1, component2 となっている。 さすがに component1 という名前のコンポーネントを作成することはないだろう。 ということで、これを削除して新しいコンポーネントを追加する。

# trac-admin /tmp/trac/myprojects component list

Name        Owner
--------------------
component1  somebody
component2  somebody

# trac-admin /tmp/trac/myprojects component remove component1
# trac-admin /tmp/trac/myprojects component remove component2
# trac-admin /tmp/trac/myprojects component list

Name  Owner
-----------

# trac-admin /tmp/trac/myprojects component add MyComponent me
# trac-admin /tmp/trac/myprojects component list

Name            Owner
---------------------
MyComponent     me

#

version の設定

# trac-admin /tmp/trac/myprojects version list

Name  Time
----------

1.0
2.0

# trac-admin /tmp/trac/myprojects version remove 1.0
# trac-admin /tmp/trac/myprojects version remove 2.0
# trac-admin /tmp/trac/myprojects version list

Name  Time
----------

# trac-admin /tmp/trac/myprojects version add 1.0.0
# trac-admin /tmp/trac/myprojects version list

Name   Time
-----------

1.0.0

#

milestone の設定

# trac-admin /tmp/trac/myprojects milestone list

Name        Time
----------------

milestone1
milestone2
milestone3
milestone4

# trac-admin /tmp/trac/myprojects milestone remove milestone1
# trac-admin /tmp/trac/myprojects milestone remove milestone2
# trac-admin /tmp/trac/myprojects milestone remove milestone3
# trac-admin /tmp/trac/myprojects milestone remove milestone4
# trac-admin /tmp/trac/myprojects milestone list

Name  Time
----------

#

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 29, 2006

[Trac] Trac にチャレンジ

Trac とは

Trac は Web インターフェースの Wiki + BugTracker + Subversion Viewer。 聞くところによると結構便利らしい。 WebSVN をインストールしようかと思っていたのだけれど、どうせなら BugTracker も一緒に欲しいということで Trac にしてみた。

Trac
http://www.edgewall.com/trac/
The Trac Configuration File
http://projects.edgewall.com/trac/wiki/TracIni

Trac のインストールや設定は以下のサイトを参考にさせていただいた。多謝。 (参考というより、指示通りに作業しただけ・・・)
鷹の島 - Trac をインストールしてみたよ
http://espion.just-size.jp/archives/05/297225719.html
[trac] default_charset
http://zippo.taiyo.co.jp/~gotoh/diary/?200502a&to=200502023#200502023

Trac のインストール

Trac を Debian Sarge にインストールしたときのメモ。 Debian では apt で Trac をインストールできる。便利。 Trac 本体と Python でマルチバイトを扱うライブラリをインストールする。

# apt-get install trac
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libsqlite0 python python-clearsilver python-sqlite python2.3
  python2.3-clearsilver python2.3-sqlite python2.3-subversion
Suggested packages:
  python-doc python-tk python-profiler python2.3-doc python2.3-profiler
  enscript python-docutils
Recommended packages:
  python2.3-iconvcodec python2.3-cjkcodecs python2.3-japanese-codecs
  python-egenix-mxdatetime
The following NEW packages will be installed:
  libsqlite0 python python-clearsilver python-sqlite python2.3
  python2.3-clearsilver python2.3-sqlite python2.3-subversion trac
0 upgraded, 9 newly installed, 0 to remove and 0 not upgraded.
Need to get 4654kB of archives.
After unpacking 15.7MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://www.jp.debian.org sarge/main libsqlite0 2.8.16-1 [176kB]
Get:2 http://www.jp.debian.org sarge/main python2.3 2.3.5-3sarge1 [2906kB]
Get:3 http://www.jp.debian.org sarge/main python 2.3.5-2 [127kB]
Get:4 http://www.jp.debian.org sarge/main python2.3-clearsilver 0.9.13-3.2 [81.0kB]
Get:5 http://www.jp.debian.org sarge/main python-clearsilver 0.9.13-3.2 [4820B]
Get:6 http://www.jp.debian.org sarge/main python2.3-sqlite 1.0.1-2 [29.1kB]
Get:7 http://www.jp.debian.org sarge/main python-sqlite 1.0.1-2 [2608B]
Get:8 http://www.jp.debian.org sarge/main python2.3-subversion 1.1.4-2 [1130kB]
Get:9 http://www.jp.debian.org sarge/main trac 0.8.1-3sarge4 [199kB]
Fetched 4654kB in 22s (209kB/s)
Preconfiguring packages ...

 ...略
# apt-get install python2.3-japanese-codecs
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  python2.3-japanese-codecs
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 273kB of archives.
After unpacking 1237kB of additional disk space will be used.
Get:1 http://www.jp.debian.org sarge/main python2.3-japanese-codecs 1.4.9-3 [273kB]
Fetched 273kB in 1s (241kB/s)
Selecting previously deselected package python2.3-japanese-codecs.
(Reading database ... 15287 files and directories currently installed.)
Unpacking python2.3-japanese-codecs (from .../python2.3-japanese-codecs_1.4.9-3_i386.deb) ...
Setting up python2.3-japanese-codecs (1.4.9-3) ...
#

Trac の設定

Trac プロジェクトの作成

# mkdir /tmp/trac
# cd /tmp/trac
# trac-admin myprojects initenv
Creating a new Trac environment at /tmp/trac/myprojects

Trac will first ask a few questions about your environment
in order to initalize and prepare the project database.

 Please enter the name of your project.
 This name will be used in page titles and descriptions.

Project Name [My Project]> my projects

 Please specify the absolute path to the project Subversion repository.
 Repository must be local, and trac-admin requires read+write
 permission to initialize the Trac database.

Path to repository [/var/svn/test]> /var/svn/svndb

 Please enter location of Trac page templates.
 Default is the location of the site-wide templates installed with Trac.

Templates directory [/usr/share/trac/templates]>
Creating and Initializing Project
 Inserting default data
 Configuring Project
  trac.repository_dir

  ...略

Congratulations!

# chown -R www-data:www-data /tmp/trac

Trac と Apache2 の連携

私の環境では、Trac のメインの用途は Subversion に対する Web インターフェースとなる。 そのため、Trac も Subversion と同一のユーザを使用することにした。 また、アクセス元制限もついでにかけておくことに。

# cat /etc/apache2/sites-available/trac
Alias /trac "/usr/share/trac/htdocs/"
ScriptAlias /proj "/usr/share/trac/cgi-bin/trac.cgi"

<Location "/proj">
  SetEnv TRAC_ENV "/tmp/trac/myprojects"

  SSLRequireSSL

  AuthType Basic
  AuthName "please login"
  AuthUserFile /var/svn/svndb/.svnpasswd
  Require valid-user

  order allow,deny
  allow from 192.168.1.
</Location>

<Location "/trac">
  SSLRequireSSL

  AuthType Basic
  AuthName "please login"
  AuthUserFile /var/svn/svndb/.svnpasswd
  Require valid-user

  order allow,deny
  allow from 192.168.1.
</Location>

# a2ensite trac
Site trac installed; run /etc/init.d/apache2 reload to enable.
# /etc/init.d/apache2 reload
Reloading web server config...done.cts"
# 

Trac の設定

Trac 画面のヘッダ、フッタを設定する。 Subversion 内のファイルの文字エンコーディングも設定する。

# cat /tmp/trac/myprojects/conf/trac.ini
[header_logo]
src = trac_banner.png
alt = my projects
height = 73
link = https://www.example.com/proj
width = 236

[trac]
default_charset = japanese.shift_jis
  ...略
#

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |