Как запустить магит синхронно

(let ((default-directory "/home/vision/"))
  (magit-pull)
  (magit-fetch "upstream")
  (magit-merge "upstream/master")
  (magit-push))

Я собираюсь:

Running git fetch upstream
Git is already running

Как я могу дождаться окончания выборки?


person cnd    schedule 21.06.2012    source источник


Ответы (2)


Magit задуман как интерактивный интерфейс для git, поэтому такие вещи, как magit-fetch, на самом деле не предназначены для запуска из вашего кода... Но если вы действительно настаиваете, беглый взгляд на код показывает, что magit-process — это переменная, которая содержит процесс во время его работы, и он очищается, когда это делается. Поэтому вы можете использовать его с циклом, который ждет, пока это не произойдет:

(progn
  (magit-fetch "upstream")
  (while magit-process (sleep-for 0.25))
  (magit-fetch "upstream"))

Но это действительно напрягает — например, что происходит, когда выборка не удалась?

Кстати, еще одна вещь, которую вы можете сделать, это посмотреть на источник, который является однострочной функцией в случае magit-fetch:

(apply 'magit-run-git-async "fetch" remote magit-custom-options)

и напишите код, использующий неасинхронную версию:

(progn
  (apply 'magit-run-git "fetch" "upstream" magit-custom-options)
  (apply 'magit-run-git "fetch" "upstream" magit-custom-options))

(И вы можете предложить патч, чтобы добавить необязательный аргумент флага, но это кажется сомнительной функцией для интерактивного инструмента...)

person Eli Barzilay    schedule 21.06.2012

Похоже, этот вопрос связан с вашим предыдущим вопросом. Вы пытаетесь решить проблему использования git из emacs двумя способами:

  • преобразование скрипта bash построчно в emacs lisp
  • использование существующей библиотеки для взаимодействия с git

Ваш первый подход явно не работал, и ваш второй подход кажется лучше. Однако magit не предназначен для использования в вашем коде. Функции могут измениться в любое время, так как magit интересует только интерфейс. Любое изменение, не нарушающее функциональность, будет считаться безопасным.

Было бы полезно, если бы вы объяснили, какова ваша конечная цель, чтобы вы могли получить лучший ответ. Вам может понадобиться простой псевдоним git, который вы можете вызвать из emacs.

person Nicolas Dudebout    schedule 21.06.2012
comment
Я думаю, что я должен использовать что-то без асинхронности здесь, magit не был разработан для этого, как сказал @Eli Barzilay. Концептуальной конечной цели нет. Мне просто нужно синхронизировать некоторые репозитории git и, возможно, добавить дополнительные сценарии, но это просто, пока я не узнаю, как я могу улучшить его с помощью elisp, например, купить добавление файла конфигурации. - person cnd; 22.06.2012