2010-10-18 18 views
8

Làm cách nào để cấu hình máy chủ Mercurial để hạn chế các cam kết với một chi nhánh được đặt tên khi nó đã bị đóng? Tôi chỉ muốn quản trị viên kho lưu trữ có khả năng mở lại nhánh.Ngăn chặn việc đẩy các cam kết thêm vào các nhánh bị đóng

https://www.mercurial-scm.org/wiki/PruningDeadBranches cho biết rằng các thay đổi kín có thể được xác định bằng "close = 1 trong trường phụ của changeset". Không rõ cách đọc trường phụ của changeset bằng cách sử dụng Mercurial API.

+0

Chết tiệt đúng! Nó _should_ được dễ dàng hơn để ngăn chặn mọi người vô tình cam kết đóng cửa các chi nhánh. – Rory

+2

Mọi người cứ nói "cam kết" nhưng bạn có nghĩa là "đẩy". Bạn sẽ không bao giờ ngăn cản một người cam kết được xác định, bạn chỉ từ chối sự thúc đẩy của họ. –

Trả lời

7

Có một tiện ích mở rộng ACL được phân phối cùng với Mercurial. Bạn có thể chỉ định các nhánh bị đóng băng bằng cách từ chối cam kết với mọi nhánh trừ quản trị viên. Tôi không chắc chắn nếu các chi nhánh được đặt tên có thể tận dụng cơ sở này.

ACL Cấu hình:

[acl.deny.branches] 
frozen-branch = * 

[acl.allow.branches] 
branch_name = admin 
4

Một máy chủ không thể hạn chế cam kết, nhưng nó có thể từ chối chấp nhận push vi phạm ràng buộc. Dưới đây là một cái móc bạn có thể đặt trên một máy chủ từ chối bất kỳ push có bất kỳ changesets rằng đang ở trên một chi nhánh đóng:

#!/bin/sh 
for thenode in $(hg log -r $HG_NODE:tip --template '{node}\n') ; do 
    if hg branches --closed | grep -q "^$(hg id --branch -r $thenode).*\(closed\)" ; then 
      echo Commits to closed branches are not allowed -- bad changeset $thenode 
      exit 1 
    fi 
done 

Bạn muốn cài đặt móc đó như thế này:

[hooks] 
prechangegroup = /path/to/that.sh 

Có gần như chắc chắn một cách để làm điều đó bằng cách sử dụng trong python móc với API bạn tham chiếu, nhưng vỏ móc làm việc ra khá tốt quá.

+0

Mặc dù tôi không thể downvote câu trả lời này, cần lưu ý rằng điều này không làm việc vì $ HG_NODE không có sẵn cho prechangegroup. Việc sửa móc để pretxnchangegroup không hoạt động, hoặc không may, bởi vì sau đó thay đổi cho dù nhánh đó có bị đóng không còn hoạt động như pretxnchangegroup tạm thời thêm các changesets và như vậy nhánh đã được mở lại. Tôi muốn viết một cái móc vỏ nhưng vẫn tự hỏi làm thế nào để làm điều này cho mục đích cụ thể được thảo luận ở đây. –

+0

Tôi có công việc này để hoạt động. Những gì bạn có thể làm là sử dụng hook pretxnchangegroup và sử dụng một kịch bản tương tự như được liệt kê ở trên để kiểm tra cho mỗi nút trong $ HG_NODE: tip liệu một trong các bậc cha mẹ của nó có "close = 1" trong các trường bổ sung của nó. Bạn có thể sử dụng hg log -r $ parentNode --template '{extras}' | grep -q "close = 1" để thực hiện kiểm tra sau. –

1

Đây là móc treo trong quá trình sẽ từ chối các thay đổi bổ sung trên nhánh đã đóng.

from mercurial import context, ui 
def run(ui, repo, node, **kwargs): 
    ctx = repo[node] 
    for rev in xrange(ctx.rev(), len(repo)): 
     ctx = context.changectx(repo, rev) 
     parent1 = ctx.parents()[0] 
     if parent1 != None and parent1.extra().get('close'): 
      ui.warn("Commit to closed branch is forbidden!\n") 
      return True 
    return False 

Móc có thể chạy trong chế độ pretxncommit (kiểm tra trong một địa phương cam kết giao dịch) hoặc chế độ pretxnchangegroup (kiểm tra khi changesets thêm từ repo bên ngoài) với các mục HGRC sau:

[hooks] 
pretxncommit.forbid_commit_closed_branch = python:/path/to/forbid_commit_closed_branch.py:run 
pretxnchangegroup.forbid_commit_closed_branch = python:/path/to/forbid_commit_closed_branch.py:run 

Không chắc chắn nếu hook này sẽ làm việc với các phiên bản Mercurial trước 2.2.

Các vấn đề liên quan