0

サーバー上で次の python スクリプトを実行して、特定の構文に従っていることを確認するプッシュのコミット情報を探しているときに問題が発生しました。ユーザーから入力を取得できないため、ユーザー名とパスワードがハードコードされています。この特定のプッシュの前に発生したコミット メッセージのリストも取得できません。

#!/usr/bin/python

import SOAPpy 
import getpass 
import datetime
import sys
import re
import logging
import os


def login(x,y):
    try:
        auth = soap.login(x, y)
        return auth
    except:
          sys.exit( "Invalid username or password")

def getIssue(auth,issue):
    try:
        issue = soap.getIssue(auth, issue)
    except:
        sys.exit("No issue of that type found : Make sure all PRs are vaild jira PRs")

def git_get_commit_msg(commit_id):
    return get_shell_cmd_output("git rev-list --pretty --max-count=1 " + commit_id)

def git_get_last_commit_id():
    return get_shell_cmd_output("git log --pretty=format:%H -1")

def getCommitText():
    commit_msg_filename = sys.argv[1]
    try:
        commit_msg_text = open(commit_msg_filename).read()
        return commit_msg_text
    except:
        sys.exit("Could not read commit message")

def git_get_array_of_commit_ids(start_id, end_id):
    output = get_shell_cmd_output("git rev-list " + start_id + ".." + end_id)
    if output == "":
        return None
    commit_id_array = string.split(output, '\n')
    return commit_id_array

def get_shell_cmd_output(cmd):
    try:
        proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
        return proc.stdout.read().rstrip('\n')
    except KeyboardInterrupt:
        logging.info("... interrupted")

    except Exception, e:
        logging.error("Failed trying to execute '%s'", cmd)

def findpattern(commit_msg):
    pattern = re.compile("\w\w*-\d\d*")
    group = pattern.findall(commit_msg)
    print group
    found = len(group)
    found =0
    issues = 0
    for match in group:
            auth = soap.login(jirauser,passwd)
            getIssue(auth,match)
            issues = issues + 1
            found+=1
    if found ==0:
        sys.exit("No issue patterns found.")

    print "Retrieved issues: " + str(issues)  

def update():
    print sys.argv[2]
    print sys.argv[3]
    old_commit_id = sys.argv[2]
    new_commit_id = sys.argv[3]
    commit_id_array = git_get_array_of_commit_ids(old_commit_id, new_commit_id)
    for commit_id in commit_id_array:
        commit_text = git_get_commit_msg(commit_id)
        findpattern(commit_text)

soap = SOAPpy.WSDL.Proxy('some url')
# this line if for repointing the input from dev/null
#sys.stdin = open('/dev/tty', 'r') # this fails horribly.
#ask user for input
#jirauser = raw_inp
#("Username for jira: ")
jirauser = "username"
passwd = "987654321"
#passwd = getpass.getpass("Password for %s: " % jirauser)
login(jirauser,passwd)
#commit_msg = getCommitText()
#findpattern(commit_msg)
update()

このコードの目的は、ローカルで行われたコミットをチェックし、それらを解析して目的のパターンを探し、その PR が存在するかどうかを Jira でチェックすることです。これは、リポジトリへのプッシュでアクティブになるサーバー側のフックです。

Python フックの作成に関するヒントをいただければ幸いです。よろしくお願いします。

4

2 に答える 2

2

gitorious ( http://gitorious.org/gitorious ) をご覧になることをお勧めします。ssh を使用して、認証と権利管理を処理します (ssh によって指定されたユーザー名を取得します)。また、git リポジトリにいくつかのフックがあります。ruby を使って git フックをどのように処理しているかを確認するのに役立つと思います。

于 2010-08-04T14:36:32.240 に答える
1

更新フックが起動するまでに、サーバーには新しいコミットがあります。問題は、フックが問題の参照の移動を許可するかどうかです。ローカル (送信側) リポジトリからどのような情報が必要ですか?

資格情報の問題については、全員を 1 人のユーザーに誘導します。たとえば、GitHub は git ユーザーでそれを行うため、SSH URL は で始まりますgit@github.com:...。次に で~git/.ssh/authorized_keys、ユーザ名を各キーに関連付けます。以下は 1 行にする必要がありますが、プレゼンテーションのために折り返されていることに注意してください。

エージェント転送なし、ポート転送なし、ptyなし、X11転送なし、
command="env myuser=gbgcoll /usr/bin/git-shell -c \"${SSH_ORIGINAL_COMMAND:-}\""
ssh-rsa AAAAB...

誰が更新を行おうとしているのかを確認するために、フックは$myuser環境変数を調べます。

これにより、各ユーザーの Jira 資格情報が提供されるわけではありません。この問題を解決するには、すべてに読み取り専用アクセス権を持つダミーの Jira アカウントを作成し、そのJira アカウントの認証情報をフックにハードコードします。これにより、特定の PR が存在することを確認できます。

于 2010-08-06T10:17:07.697 に答える