スポンサーサイト

-------- --:--:-- --

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Trac】tracとsvnの連携【Subversion】

2012-03-27 00:06:57 Tue

tracとsvnの連携についてメモ。

これやったら何ができるかって言うと、
tracでリポジトリブラウザを参照できることと、
subversionのコミットログに特定の文字列を含めるとチケットに連携できる。


参考URL
http://blog.livedoor.jp/leaf_hiro/archives/51610036.html
http://d.hatena.ne.jp/milkaz/20110513


1.trac-admin /var/www/trac/project/ permission add username TRAC_ADMIN
で管理ユーザへ昇格

僕はBASIC認証を利用していたのでusernameにはBASIC認証のアカウント。


2.管理ユーザでtracのwebインタフェースから連携リポジトリ設定
名称 は任意で後で使う
種別 はSVN
ディレクトリ はSVNサーバ上のパス /var/www/svn/repo1 とかね。


3.trac-admin /var/www/trac/project repository resync {2の名称}
で現在のリビジョンまで trac の project と手動で連携


4./XXX/YYY/svn/ZZZ/hooks でスクリプトを設定
http://server-helper.doorblog.jp/archives/3409060.html

vi /var/www/svn/repo1/hooks/post-commit
DIR_PATH="/data/trac/sample-trac "
/usr/bin/trac-admin $DIR_PATH changeset added "$1" "$2"


5.TracCoreに組み込まれているCommitTicketUpdater, CommitticketReferenceMacro をプラグイン有効にする
Tracは連携を受けて、対応するリポジトリ名のリポジトリのリビジョン番号を検索し、そのコメント内に書かれているコマンド(refsとか)を判断して実行

TracWebインタフェースに管理者でログインする。
管理>プラグイン>Trac x.x.x を開く
下の方の tracopt.ticket.commit_updater.* にある、CommitTicketReferenceMacro, CommitTicketUpdater にチェックを入れ、「変更を適用」


これでsubversionのcommitがあればtracへ通知されるようになりました。

設定完了。

subversionにcommitするときは次のようなコマンドでtracのチケットと連携できる。

refs #nn
close #nn
fix #nn

コマンド名は複数の書き方ができ、関連付けるコマンドはreferences、refs、addresses、re、seeのいずれかで指定する。筆者の場合はよく「refs」を使っている。また、チケットを閉じるコマンドはclose、closed、closes、fix、fixed、fixesのいずれかで指定する。こちらは筆者の場合「fixed」を使っている。
チケット番号の指定には、「#チケット番号」か「ticket:チケット番号」という書式を用いる。例えばチケット1番を指定する場合には、「#1」か「ticket:1」のようになる。
同時に複数のチケットを指定したい場合には「,(カンマ)」やand、&といった文字で区切って指定する。例えば、コミットするソースがチケット5番と7番に関係する場合、コミットメッセージに「refs #5, #7」と書く。 次のページ


■trac連携でfix #nn などのときにcloseじゃなくしたい
vi /usr/local/lib/python2.6/dist-packages/Trac-0.12.2.ja1-py2.6.egg/tracopt/ticket/commit_updater.py
※/usr/lib/python2.4/site-packages/Trac-0.12.2.ja1-py2.4.egg/tracopt/ticket/commit_updater.py

  def cmd_close(self, ticket, changeset, perm):

    if not self.check_perms or 'TICKET_MODIFY' in perm:

      ticket['status'] = 'resolved'         <== ここ

      if not ticket['owner']:

        ticket['owner'] = changeset.author


■tracのチケット削除
http://d.hatena.ne.jp/greennoah/20090310/1236692727
trac-admin /var/www/trac/project/ ticket remove 42

【Python】動的ディスパッチと動的メソッド定義

2012-03-23 00:29:58 Fri

パイソニアな人にはもはや今更のことですが、JavaのReflectionみたいなことを。

まあ、先人の知恵を借りれば何も語ることはないのですが。

http://d.hatena.ne.jp/yuheiomori0718/20120116/1326715412
http://d.hatena.ne.jp/littlefive/20110419/1303210605

とりあえず咀嚼したことを。

■動的ディスパッチ



obj = "abc" # objはstrオブジェクトであるtype(obj)とかで

getattr(obj, 'upper')() # strクラスのupperメソッドを実行している



まあコメントそのままです。

■動的メソッド定義



colours = {"black": "000",
"red": "f00",
"green": "0f0",
"yellow": "ff0",
"blue": "00f",
"magenta": "f0f",
"cyan": "0ff",
"white": "fff"}

class MyString(str):
pass

for name, code in colours.iteritems():
def _in_colour(self, code=code): # 連想配列を繰り返してメソッドを定義し続ける。このstatementでcodeにデフォルト値を代入している
return '%s' % (code, self)
setattr(MyString, "in_" + name, _in_colour) # ここでMyString型にメソッドを動的に追加している。メソッド名は文字列。

print MyString("Hello, world!").in_blue() # 動的に拡張されたMyStringのメソッドを実行。



プロトタイプチェーンとか暗黙参照とか気にせずに言えばjavascriptのprototypeみたいなもんか。

オブジェクトに対してメソッドを動的に追加しているのではなく、クラスに対して追加している、っていう感じか。

いやー、どの言語もこういう文字列遊びって楽しいなー。


【Python】関数の引数について

2012-03-23 00:13:48 Fri

パイソニストには当たり前のことですが、関数がとる引数のアスタリスクについてメモ。

あ、どうでもいいことですが、2012/03/23 現在、
IntellijIDEAのプラグインでpythonとrubyってpythonの2倍近くrubyがDLされていてびっくりしました。
rubyが10万DL、pythonが5万とかでした。
pythonの方がpydevなどIDEが多いからなのかそれとも…と色々邪推してしまいました。
というのは置いといて…。


下記の先人の知恵を借りれればたいていわかります。

http://jutememo.blogspot.jp/2008/09/python_13.html
http://d.hatena.ne.jp/eth0jp/20100219/1266526197
http://www.daisaru11.jp/blog/python-%E3%83%A1%E3%83%A2/%E9%96%A2%E6%95%B0%E5%BC%95%E6%95%B0%E3%81%AE%E5%8F%97%E3%81%91%E6%B8%A1%E3%81%97/

簡単に。


def hoge(*args):
pass

hoge(1,2,3,4,5,6,7,8,9,'a','b','c')



アスタリスク1つはタプルとして可変長引数を受け取るという意味。


def hoge(**args):
pass

hoge(a=1,b=2,c=3)



アスタリスク2つはdictionaryとして可変長引数を受け取るという意味。


def hoge(*args, **dict):
pass

hoge(1,2,3,4,5,6,7,8,9,'a','b','c',a=1,b=2,c=3)



こういう引数の場合は、1~cまでがargsに、{a:1,b:2,c:3}がdictに代入されて関数が実行されます。


def hoge(*args, **dict):
pass

hoge(1,2,3,4,5,6,7,8,9,'a','b','c',a=1,b=2,c=3,0,10,11,12,'d')



じゃあこれはどうなるかというと


SyntaxError: non-keyword arg after keyword arg



になります。

そりゃまあ仕方ない。

a=1のような keyword arg(キーワード引数)の後にnon-keyword arg(ノンキーワード引数)を指定することはできない言語仕様だからのようです。

そりゃそっか。

あ、先人様がおまけで書いてくれていましたが、zipメソッド便利~。


a = (1, 2, 3)
b = (4, 5, 6)
zipped = zip(a,b)
print zipped #[(1, 4), (2, 5), (3, 6)]

a2, b2 = zip(*zipped)
print a2 #(1, 2, 3)
print b2 #(4, 5, 6)



【WinMerge】ディレクトリ間の比較

2012-03-22 23:52:44 Thu

環境や設定によって違うっぽいのでよくわからんけど、もし困ったときの備忘録。

win mergeで2つのディレクトリ比較をするとき、
2つのディレクトリを同時にドロップしてしまうとサブディレクトリなどが展開しない。

1つずつディレクトリをドロップしていって
一度ポップアップ経由で比較をするとディレクトリすべてが展開されていて比較がしやすい。

WS000279.jpg

ポップアップっていうのはこんな感じの。

でも、今改めてやってみたら大丈夫だった。

まあダメだったら試してみるってことで。

【Intellij IDEA】Flexで html wrapper を出力する

2012-03-09 00:46:15 Fri

intellij idea の Flexプラグインでデフォルトのままで実行するとswfファイルが出力されるのですが、
これを包むHTMLをFlexBuilderやFlashBuilderみたいに出力されるにはどうしたらいいんだろうと迷っちゃいました。

なので、html wrapperの作成方法をメモ。

答えはここにも余裕で書いていました。
http://www.jetbrains.com/idea/webhelp/create-html-wrapper-for-flex-application-dialog.html

Tool -> Flex -> Create HTML Wrapper
これやん!

WS000247.jpg


できました。
イエス。

名言集
全記事(数)表示
全タイトルを表示
ブログ内検索
Loading
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。