2010-09-09 48 views

回答

1

因爲你沒給很多有關環境的信息,我做出以下假設:

  • 您使用的是Windows,但願意/能夠安裝Ruby和p4ruby API
  • 你是運行Perforce版本2009.1或更高版本(我實際上實現了對Perforce先前版本的支持,這只是有點模棱兩可,請參見下文)。

說到這裏,我們來看看我們想要的:在分支中對所有文件進行重命名和移動。 的P4 knowledge-base告訴我們,一個重命名(和舉動,對於這個問題)由

  • 打開要編輯
  • 移動文件
  • 提交

,並指定爲「在變更中移動/添加'操作。我已經破解了一個小小的Ruby腳本,該腳本查看給定分支的所有更改(p4 changes //branch/...),併爲每個更改查找(p4 describe @change)是否存在「移動/添加」操作併發出該文件。

#!/usr/bin/env ruby 

require 'P4' 

branch = ARGV[0] 

p4 = P4.new 
p4.connect 

begin 
    p4.run_changes("-i", branch).each do |change| 
    p4.run_describe(change["change"]).each do |c| 
     files = c["depotFile"] 
     files.each do |f| 
     if c["action"][files.index(f)] =~ /move\/add/ 
      puts "File #{f} was RENAMED in change #{c["change"]} (original: #{c["fromFile"][files.index(f)]})" 
     end 
     if c["action"][files.index(f)] =~ /integrate/ 
      # TODO find a corresponding delete in the same changelist, which would 
      # this mark as a 'move' for P4 versions prior 2009.1 
      puts "File #{f} was INTEGRATED in change #{c["change"]}" 
     end 
     end 
    end 
    end 

rescue P4Exception 
    p4.errors.each { |e| $stderr.puts(e) } 
    raise 
end 

p4.disconnect 

C:\> ruby p4report.rb //some/perforce/branch/... 

一些更多的注意事項:

  • 提供的是,大致測試,使用您自己的風險
  • 根據爲分支,這可能需要一段時間的更改數量,它不是很優雅地列出所有的變化,然後檢查每個變化,即不要使用在您的倉庫的根(//depot/...
  • 代碼中的TODO清楚地表明:對於Perforce之前2009.1 a 重命名是通過完成然後刪除(見知識庫)。我已經添加了支持來找到整合行動,但剩下的作爲練習給讀者。就像現在一樣,你不會看到正常的分支操作和「分支 - 刪除」操作之間的區別。

有關如何使這更容易的任何建議,歡迎。