Поскольку вы не предоставили много информации о вашей среде, я сделал следующие предположения:
- Вы находитесь в Windows, но хотите / можете установить Ruby и p4ruby API
- Вы используете Perforce версии 2009.1 или новее (на самом деле я реализовал поддержку и для предыдущих версий Perforce, это немного двусмысленно, см. Ниже).
С учетом сказанного давайте посмотрим на то, что мы хотим: все переименования и перемещения файлов внутри ветви.
База знаний P4 сообщает нам, что переименование (и, в этом отношении, ход) состоит из
- открыть для редактирования
- переместить файл
- отправить
и обозначается как операция move / add в изменении. Я взломал небольшой скрипт на 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 переименование было сделано с помощью integrate с последующим delete (см. Базу знаний). Я добавил поддержку, чтобы найти интегрированное действие, но оставил остальное в качестве упражнения для читателя. Как сейчас, вы не увидите разницы между обычной операцией ветвления и операцией ветвления и удаления.
Любые предложения о том, как сделать это проще, приветствуются.