2011-07-06 37 views
5

Tôi cần móc đơn giản cho mercurial mà kiểm tra cam kết bình luận bằng cách sử dụng mẫu. Đây là móc của tôi:Làm thế nào để hiển thị đầu ra móc trong cửa sổ nhật ký Tortoise Hg?

#!/usr/bin/env python 
# 
# save as .hg/check_whitespace.py and make executable 

import re 

def check_comment(comment): 
    # 
    print 'Checking comment...' 
    pattern = '^((Issue \d+:)|(No Issue:)).+' 
    if re.match(pattern, comment, flags=re.IGNORECASE): 
     return 1 
    else: 
     print >> sys.stderr, 'Comment does not match pattern. You must start it with "Issue 12323:" or "No Issue:"' 
     return 0 

if __name__ == '__main__': 
    import os, sys 
    comment=os.popen('hg tip --template "{desc}"').read() 
    if not check_comment(comment): 
     sys.exit(1) 
sys.exit(0) 

Nó hoạt động. Nó thậm chí còn hiển thị thông báo lỗi 'Comment does not match pattern. You must start it with "Issue 12323:" or "No Issue:"' khi tôi cam kết từ bảng điều khiển. Nhưng khi tôi cố gắng cam kết từ Tortoise Hg Workbench, chỉ thông báo hệ thống mới được hiển thị: abort: pretxncommit.check_comment hook exited with status 1.

Tôi cần thông báo cho người dùng điều gì sai. Có cách nào để buộc Tortoise Hg để hiển thị đầu ra từ móc?

+0

Chỉ cần đoán, nhưng bạn đã thử viết thư cho sys.out thay vì sys.err chưa? – bbaja42

+0

Có. Nó không giúp được gì. –

Trả lời

5

Tôi đã làm cho nó hoạt động bằng cách biến nó thành móc trong quá trình thay vì móc ngoài. Tuy nhiên, trong quá trình hooks được định nghĩa khá khác nhau.

Đầu tiên, tệp python chỉ cần một hàm duy nhất sẽ được gọi theo tên trong định nghĩa móc. Chức năng móc được chuyển qua các đối tượng ui, repohooktype. Nó cũng được thông qua các đối tượng bổ sung dựa trên loại móc. Đối với pretrxncommit, nó được chuyển qua node, parent1parent2, nhưng bạn chỉ quan tâm đến nút, vì vậy phần còn lại được thu thập trong kwargs. Đối tượng ui được sử dụng để cung cấp thông báo trạng thái và thông báo lỗi.

Nội dung check_comment.py:

#!/usr/bin/env python 

import re 

def check_comment(ui, repo, hooktype, node=None, **kwargs): 
    ui.status('Checking comment...\n') 
    comment = repo[node].description() 
    pattern = '^((Issue \d+:)|(No Issue:)).+' 
    if not re.match(pattern, comment, flags=re.IGNORECASE): 
     ui.warn('Comment does not match pattern. You must start it with "Issue 12323:" or "No Issue:"\n') 
     return True 

Trong hgrc, móc sẽ được xác định với python:/path/to/file.py:function_name, như thế này:

[hooks] 
pretxncommit.check_comment = python:/path/to/check_comment.py:check_comment 

Các .suffix_name trên pretxncommit là để tránh trọng bất kỳ móc được xác định trên toàn cầu, đặc biệt là nếu điều này được xác định trong kho của hgrc của kho lưu trữ thay vì toàn cục. Hậu tố là cách cho phép nhiều câu trả lời cho cùng một móc.

0

Trong trường hợp móc chạy trên kho lưu trữ được phân phối qua ví dụ: hgserve:
tôi sử dụng chức năng Python nhỏ này trong một kịch bản pretxnchangegroup để hiển thị cùng một sản lượng

  • trong nhật ký máy chủ
  • trong TortoiseHg workbench Log chảo hoặc dòng cmd

:

def log(ui, string): 
    print(string) # will show up as "remote:" on the client 
    ui.status("{0}\n".format(string)) # will show up in the same hg process: hgserve ; append newline 
    return 
Các vấn đề liên quan