Чтобы автоматизировать постановку Perforce, я сталкиваюсь с дилеммой, что add
и edit
— это две разные операции, и они работают с файлами с разным статусом SCM, то есть «уже в SCM или нет».
Это отличается от git, где постановка выполняется равномерно add
.
Я хотел бы иметь что-то вроде псевдокода:
filepath = '/path/to/myfile.ext'
if p4.is_under_scm(filepath):
p4.edit(filepath)
else:
p4.add(filepath)
или еще лучше, просто скройте детали с помощью:
p4.staging(filepath)
Как мне добиться этого, вызвав p4
программу командной строки?. Сейчас я не использую никаких привязок к языку программирования.
Возможно, вы захотите использовать команду p4 reconcile
, которая автоматически открывает файлы рабочей области для действия, которое соответствует их текущему состоянию относительно хранилища.
Имейте в виду, что если вы пойдете по этому пути, reconcile
работает только с файлами нераспечатанный, которые являются разные из версии хранилища, поэтому он предназначен для использования после с локальными изменениями (это отличается от стандартного рабочего процесса, когда вы открываете файл с помощью p4 edit
до его редактирование — идея в том, что вы используете reconcile
, чтобы исправлять вещи постфактум, если вам приходилось работать в автономном режиме или что-то в этом роде). Кроме того, если вы передумали о том, что вы делаете с файлом (например, вы удалили локальную копию после того, как она была открыта для edit
, но до того, как вы submit
), вам может потребоваться revert -k
ее и повторно reconcile
, чтобы убедиться, что она открыть для правильного действия.
Для чего-то, что соответствует псевдокоду в вашем вопросе, вам, вероятно, нужна команда p4 have
, которая сообщает вам, соответствует ли локальный файл ревизии хранилища (и если да, то какой). p4 edit
работает только с файлом, который вы have
, тогда как p4 add
будет работать с файлом в вашей рабочей области, который не соответствует существующему файлу хранилища. (Здесь есть очень тонкий момент — файл может быть сопоставить с файлом хранилища, несмотря на то, что он не был синхронизирован с хранилищем! В этом случае вы столкнетесь с конфликтом, когда отправите свой add
.)