2012年1月29日日曜日

[python] 修正内容をscpで転送するbzrコマンド。

背景

テスト機でプログラムの動作を確認したいとき、
trunkブランチにコミット、deployしてテスト機にソースを送る。
しかしバグがあった場合、再度コミットするため、
余計なリビジョンが増えてしまって気持ち悪い。

そのため、修正したソースをscpとかで送り、テスト機で確認するってことをよくやる。
その時修正したものいちいちbzr statusで探して、scpコマンド打つのとかマジでめんどい。

そこで、追加・修正したファイルを特定のサーバへ転送するためのbzrコマンドを作った。

探したらあった。


探してみると、やりたいこととまったく同じことしてる人がいた。

bzr scp TARGET で作業ファイルを開発サーバに転送するプラグインを作りました

でも作った。


まぁ、とりあえず作ってみる。
再発明の感は否めないけど。

import os
import subprocess
from urlparse import urlparse
from bzrlib.branch import Branch
from bzrlib.workingtree import WorkingTree
from bzrlib.commands import Command,register_command

version_info = (0, 0, 1, 'dev', 1)
__author__ = 'karino'
__date__   = '2012/01/23'

# serve list
server_list = [\
        ["m-tst","karino","karino@kokukuma.net:/home/karino/program/1"],\
        ["x-tst","karino","karino@kokukuma.net:/home/karino/program/2"],\
        ["g-tst","karino","karino@kokukuma.net:/home/karino/program/3"],\
]

class cmd_deploy(Command):
    local_branch_path = ""

    def run(self):

        # get changes
        print
        changes = self.get_changes()
        if changes==[]:
            print "There is no change."
            return
        else:
            print "--- change files ---"
            for filepath in changes:
                print filepath

        # select server
        print
        print "--- select server ---"
        snum = self.select_server()

        # confirm
        print
        print "--- dryrun ---"
        self.scp(changes, snum, True)
        ok = self.user_input("yes/no > ")

        # scp
        if ok:
            print
            print "--- execute ---"
            self.scp(changes, snum, False)
        return


    def scp(self, changes, snum, dryrun):
        for filepath in changes:

            # 
            local_path  = self.local_branch_path + filepath
            server_path = server_list[snum][2]+filepath

            # 
            if dryrun:
                print "scp -Cpr " + local_path + " " + server_path
            else:
                if subprocess.call(["scp","-Cpr", local_path, server_path]):
                    #print "scp -Cpr "+filepath+" "+path+"  ... failed"
                    pass
                else:
                    #print "scp -Cpr "+filepath+" "+path+"  ... success"
                    pass
        return


    def select_server(self):
        for i in range(len(server_list)):
            print i, ":",server_list[i][0]
        snum = raw_input("Which Server > ")
        if snum.isdigit() and int(snum) in range(len(server_list)):
            return int(snum)
        else:
            return 2


    def user_input(self, prompt):
        ok = raw_input(prompt)
        if ok in ['y','yes']: return True
        return False


    def get_changes(self):
        # get workingtree
        wt = WorkingTree.open_containing(os.getcwd())[0]
        br = Branch.open_containing(os.getcwd())[0]
        print urlparse(br.base).path
        self.local_branch_path = urlparse(br.base).path

        # get changes
        changes = wt.changes_from(wt.basis_tree(),want_unversioned=True)
        result = []
        for add in changes.added:
            result.append(add[0].encode('utf-8'))
        for mod in changes.modified:
            result.append(mod[0].encode('utf-8'))
        return result

register_command(cmd_deploy)

使い方と結果

① 例によって、~/.bazaar/plugins/にファイルを置く。

② bzr deployって打つと、追加・修正されたファイル
(bzr status、addとmodifiedが対象)を表示。

③ 送り先サーバを選ぶと、実行されるscpコマンドが表示され、
yesを打つと、そのコマンドが実行される。

[karino@localhost release]$ bzr deploy
"Key 'makuocmd' already registered"
Unable to load plugin 'makuocmd2' from '/home/karino/.bazaar/plugins'

/home/karino/bzr_test/release/
--- change files ---
123.php
k123.php
setting.yml

--- select server ---
0 : m-tst
1 : i-tst
2 : g-tst
Which Server > 0

--- dryrun ---
scp -Cpr /home/karino/bzr_test/release/123.php karino@kokukuma.net:/home/karino/program/1/123.php
scp -Cpr /home/karino/bzr_test/release/k123.php karino@kokukuma.net:/home/karino/program/1/k123.php
scp -Cpr /home/karino/bzr_test/release/setting.yml karino@kokukuma.net:/home/karino/program/1/setting.yml
yes/no > y

--- execute ---
123.php                             100%
k123.php                            100%
setting.yml                         100%
[karino@localhost release]$ 

0 件のコメント:

コメントを投稿