2012-01-19 26 views
9

Tôi là quá trình viết một kịch bản cập nhật, mà kéo phiên bản mới nhất của một số kho, và xây dựng lại các dự án. Tôi muốn thực hiện việc xây dựng có điều kiện, vì vậy tôi cố gắngMercurial: kiểm tra xem cuối cùng kéo/cập nhật giới thiệu những thay đổi

hg pull -u && ant clean build 

và sự thay đổi

hg pull; hg update && ant clean build 

Tuy nhiên, kiến ​​xây dựng luôn được gọi, thậm chí khi không có gì đã thay đổi. Tôi biết rằng tôi có thể sử dụng hg incoming để kiểm tra các thay đổi trước khi thực hiện thao tác kéo, nhưng điều này gây lãng phí cho tôi.

Làm cách nào để kiểm tra các thay đổi mới mà không phải liên hệ với máy chủ hai lần (một lần cho hg incoming, một lần cho hg pull)?

UPDATE: Đây là xây dựng kịch bản của tôi bây giờ:

update() { 
    TIP=$(hg tip --template "{node"}) 
    hg pull -u 
    if test "$TIP" != $(hg tip --template "{node}"); then 
    ant clean build 
    fi 
} 

(cd repo1; update) 
(cd repo2; update) 

Và đối với người tự hỏi tại sao tôi làm sạch xây dựng mọi thời gian, có hai lý do cho điều đó:

  1. Các kho phụ thuộc vào nhau, và khi API trong một trong số chúng thay đổi, tôi cần phải xây dựng lại hoàn toàn để tìm những nơi mà những thay đổi API này phá vỡ mã
  2. Trình biên dịch Java cố định hằng số, cũng từ các tệp lớp khác. Bây giờ, khi tôi thay đổi một hằng số trong một lớp trở lại một trường có thể thay đổi, tất cả các tệp lớp khác sử dụng hằng số đó vẫn bị ảnh hưởng bởi một bản dựng và điều này có thể dẫn đến các lỗi nhỏ mà tôi muốn tránh.
+1

Không phải là hệ thống xây dựng thích hợp, đọc: không kiến, có thể tạo các bản dựng gia tăng không? – jmg

+0

kiến ​​có thể làm các bản dựng tăng dần, nhưng tôi muốn tránh các lỗi tinh vi, vì vậy tôi làm một bản dựng sạch mọi lúc. –

+1

Vậy làm cách nào để tạo các bản dựng tăng dần của riêng bạn giúp tránh các lỗi tinh vi? –

Trả lời

9

Bạn không nên chỉ chạy hg incoming hai lần vì nó sẽ thực sự tải về tất cả các changesets hai lần sau đó. Điều này bởi vì bạn không thể chỉ nhìn trộm tại kho lưu trữ từ xa mà không cần chạy đầy đủ hg pull.

Vì vậy, lưu changesets đến trong một gói và kéo từ đó thay vì:

hg incoming --bundle incoming.hg && hg pull --update incoming.hg && echo "Go!" 

Các hg incoming lệnh hoạt động như một người bảo vệ cho các lệnh sau: && là ngắn circuiting lệnh để là người đầu tiên mà trả về một mã thoát khác không sẽ làm cho toàn bộ cấu trúc không thành công với mã thoát đó. Điều này có nghĩa là hg pull và bất kỳ lệnh nào sau đây sẽ không được thực thi khi có dấu hiệu hg incoming không có gì để kéo.

+2

Ông đã không thực sự gọi đến hai lần. Nhưng tôi đã không nhận ra rằng tải xuống đến các thay đổi đầy đủ, do đó, việc gửi đến và kéo có hiệu lực tải xuống mọi thứ hai lần. –

+0

Lạ, 'hg pull --update && echo" Go "' luôn làm 'echo', nhưng' hg pull --update incoming.hg && echo "Go" 'chỉ khi thay đổi mới được giới thiệu. Có lý do nào cho điều đó không? –

+0

@AdamHouldsworth: Vâng, việc gửi đến và kéo thực sự giống nhau (chỉ cần gửi đi các thay đổi). Các tài liệu hướng dẫn không rõ ràng về điều này, vì vậy bạn không thể đổ lỗi cho suy nghĩ rằng nó rẻ để chạy đến. –

3

Theo dõi để @ Adam

Quotes từ hg help incoming

Đối với kho lưu trữ từ xa, sử dụng --bundle tránh tải changesets hai lần nếu đến được theo sau bởi một kéo.

...

Trả về 0 nếu có thay đổi đến, 1 nếu không.

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