Отчет о всех переименованиях файлов и перемещениях в ветке Perforce - PullRequest
0 голосов
/ 09 сентября 2010

Есть ли у кого-нибудь код (предпочтительно работающий на Win32), который будет отображать историю всех переименований и перемещений файлов, которые произошли в ветви Perforce?

1 Ответ

1 голос
/ 10 сентября 2010

Поскольку вы не предоставили много информации о вашей среде, я сделал следующие предположения:

  • Вы находитесь в 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 (см. Базу знаний). Я добавил поддержку, чтобы найти интегрированное действие, но оставил остальное в качестве упражнения для читателя. Как сейчас, вы не увидите разницы между обычной операцией ветвления и операцией ветвления и удаления.

Любые предложения о том, как сделать это проще, приветствуются.

...