ветвление, когда была ветка с тем же именем, которая больше не существует p4python

При тестировании моего приложения с использованием p4python я столкнулся с интересной проблемой. Некоторое время назад я переходил из каталога основного потока в каталог тестирования, я сделал возврат к этому ответвлению, так как с ним что-то не так, поэтому ветка тестирования исчезла (возврат и отправка). после исправления проблемы я решил снова создать ветку с тем же именем, но P4python сказал, что Can't populate target path when files already exist. этой ветки больше нет. Я не понимаю, почему p4python выдает такую ​​​​ошибку. Это код, который я использую для ветвления:

result = p4.run("populate", path +"@"+ changelist, destination)

поэтому мой вопрос в том, как снова иметь возможность ветки с тем же именем, если старая ветка с этим именем удалена?


person Payam30    schedule 05.04.2020    source источник


Ответы (1)


Команда populate работает только в конкретном случае, когда вы создаете совершенно новую ветку; он не обрабатывает случаи, когда вам может понадобиться сопоставить источник с целевым, поэтому он автоматически завершится ошибкой, если в целевом объекте есть какие-либо файлы (даже удаленные).

Если ветка предназначена только для тестирования, вы можете ее стереть:

p4 obliterate -y destination/...

Или вы можете изменить свой код для учета существующих файлов:

p4.run("integrate", f"{path}@{changelist}", destination)
p4.run("resolve", "-as")
result = p4.run("submit", "-d", 
                f"integrated from {path}@{changelist} to {destination}")
person Samwise    schedule 05.04.2020
comment
Спасибо. Должен ли я запускать эти команды по очереди? Сначала интегрировать, затем решить, а затем отправить? Эта команда разрешения разрешит только этот список изменений? - person Payam30; 06.04.2020
comment
Команда resolve разрешает любые открытые файлы, которые в настоящее время требуют разрешения. Я недостаточно знаю остальную часть вашего приложения, чтобы предложить самый простой способ предотвратить взаимодействие рабочего процесса ветки с другими рабочими процессами; есть много возможных решений, но для обработки каждого возможного пограничного случая (условия гонки с другими клиентами, интерактивное разрешение конфликтов и т. д.) потребуется гораздо больше кода, чем три строки, которые я вам дал! :) - person Samwise; 06.04.2020
comment
Обратите внимание, что Perforce изначально обрабатывает все эти условия за вас очень изящно, но это предполагает, что вы используете его через обычный клиент и можете реагировать на такие вещи, как конфликты слияния, и/или иметь контекстную осведомленность, чтобы вы не наступали на свои собственные пальцы ног. Когда вы пытаетесь полностью автоматизировать все в среде, где люди также работают и могут делать что угодно, вам нужно проделать больше работы, чтобы учесть возможные сценарии проблем и справиться с ними так же разумно, как человек. - person Samwise; 06.04.2020
comment
как насчет принудительной интеграции и принятия источника как разрешенного. как я сделал в своем обновлении в исходном посте. - person Payam30; 22.04.2020
comment
Вы можете сделать это, но это деструктивная операция, поскольку она перезапишет все, что находится в цели. Если в контексте вашего сценария вы знаете, что в цели нет ничего ценного, это хороший компромисс. - person Samwise; 22.04.2020
comment
Не могли бы вы посмотреть на мое обновление? чего я пытаюсь добиться, так это: если заполнение не сработало (потому что была ветка с таким именем, которой больше не существует), используйте integ. но код не доходит до того момента, когда он должен интегрироваться. Он переходит непосредственно к исключениям и останавливает программу. - person Payam30; 25.04.2020
comment
StackOverflow не взимает плату по почте; разместите новый вопрос, если у вас есть новая проблема. :) - person Samwise; 25.04.2020