2010-07-30 130 views
0

我在運行服務器上的後續python腳本時遇到問題,尋找推送的提交信息,確保它遵循特定語法,我無法從用戶那裏獲得輸入,這就是爲什麼用戶名和密碼是硬編碼的。我現在也無法獲得在此特定推送之前發生的提交消息列表。git服務器端鉤子

#!/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() 

這段代碼的預期目標是檢查本地製造的提交,並通過他們的預期的圖案解析,以及在JIRA檢查如果PR存在。它是一個服務器端鉤子,在推送到存儲庫時被激活。

任何提示寫在python鉤子將不勝感激。謝謝,麻煩您了。

+0

你的*特定*問題是什麼? – katrielalex 2010-07-30 21:05:22

+0

我無法從本地git回購中獲取信息。或者在我調用git push origin master命令後從用戶那裏獲得。 – myusuf3 2010-07-30 21:21:09

+0

你把這個腳本連接到哪個鉤子? – robert 2010-08-03 21:46:58

回答

2

我建議你看看gitorious(http://gitorious.org/gitorious)。 他們使用ssh來處理認證和權限管理(獲取由ssh給出的用戶名)。 他們也有一些git倉庫掛鉤。我想這可能有助於瞭解他們如何使用ruby處理git鉤子。

1

當你的更新鉤子觸發時,服務器有新的提交:問題是你的鉤子是否允許有問題的移動。您想要從本地(發送)存儲庫獲得哪些信息?

對於憑據問題,通過單個用戶漏斗每個人。例如,GitHub使用git用戶,這就是他們的SSH網址以[email protected]:...開頭的原因。然後在~git/.ssh/authorized_keys中,將用戶名與每個密鑰相關聯。請注意,以下內容應在單行上,但爲了演示目的而包裝。

no-agent-forwarding,no-port-forwarding,no-pty,no-X11-forwarding, 
command="env myuser=gbgcoll /usr/bin/git-shell -c \"${SSH_ORIGINAL_COMMAND:-}\"" 
ssh-rsa AAAAB...

現在要查看誰正在嘗試執行更新,您的hook會檢查$myuser環境變量。

這不會爲您提供每個用戶的Jira憑據。要解決這個問題,請創建一個虛擬的Jira帳戶,該帳戶擁有對所有內容的只讀訪問權限,並且硬編碼 Jira帳戶的憑據已掛鉤。這使您可以驗證給定的PR是否存在。