Git am some_patch применяется атомарным способом? - PullRequest
0 голосов
/ 13 февраля 2019

Я написал автоматизированный код для применения патчей git через библиотеку git python.Однако я хочу знать, есть ли вероятность того, что некоторые из исправлений будут применены, а другие приведут к ошибке.

    try:
        repo.git.execute(["git", "am", "patch")
    except Exception as e:
        for stat in status:
            stat.update({"status": "failure"})
        repo.git.execute(["git", "am", "--abort"])
        return status

1 Ответ

0 голосов
/ 13 февраля 2019

Вам нужно будет более точно определить, что вы подразумеваете здесь под "атомным".В частности, хотя:

[Что] я хочу знать, есть ли [есть] ли вероятность того, что некоторые из исправлений будут применены, а другие приведут к ошибке

Конечно, git am <em>path</em> может потерпеть неудачу, и документация git am описывает, что происходит в этом случае.Если исправления, отформатированные в почтовом ящике, содержат, скажем, семь частей, а первые три применены корректно, но у четвертого возник конфликт слияния или другой сбой, первые три действительно будут применены, а четвертый действительно еще не применен.Если причиной сбоя является конфликт слияния, индекс и рабочее дерево будут в состоянии частично слияния.Если патч просто не был применен вообще, индекс и рабочее дерево будут соответствовать состоянию, созданному путем применения третьего коммита.В любом случае, git am выйдет ненулевым.(В этот момент вы можете использовать git am --abort, чтобы вернуть все обратно к тому, что было до того, как вы применили исправления без , или вручную исправить проблему, а затем запустить git am --continue, чтобы возобновить процесс..)

В документации gitpython упоминается, что git.exc.GitCommandError вызывается, если основная команда Git выходит из ненулевого значения.Поэтому вы бы поймали здесь исключение.

Дополнительное примечание: except Exception обычно слишком широка в Python.Обычно вы должны отлавливать определенные исключения, которые вы ожидаете здесь, которые в этом случае могут быть git.exc.GitCommandError (для git am существует и работает, но сообщил о сбое ) и git.exc.GitError (для * 1029)* что-то вообще пошло не так, например, бинарный файл Git не установлен, или Git утверждает, что это вообще не репозиторий и т. д.).

...