Git Pre-Commit-Hook, der nach offenen Anwendungen sucht

Ich verwende Git, um ein Projekt zu verwalten, das einige Binärdateien enthält, die vor dem Festschreiben geschlossen werden müssen. Also brauche ich einen Git-Hook, der überprüft, ob die Anwendung, die diese Dateien geöffnet hat, ausgeführt wird.

Hier ist das Skript, das ich verwende

#!/usr/bin/env osascript

tell application "System Events"
    set apps to the name of every process whose background only is false
end tell

if "Some App" is in apps then
    error "Some App is running. Can't commit until Some App is quit" number 5
end if

Aber ich erhalte diesen Fehler, wenn ich das Pre-Commit übergebe oder ausführe. Auch wenn "Some App" nicht läuft.

.git/hooks/pre-commit:50:106: execution error: An error of type -10810 has occurred. (-10810)

Berechtigungen für die Datei sind

-rwxr-xr-x@ 1 toddgeist  staff   263 Dec  7 07:33 pre-commit

Antworten (2)

Sie sagen nicht, auf welches Problem Sie stoßen, also lassen Sie mich raten.

Wenn Sie Schwierigkeiten haben, den Teil „-- eine Nachricht anzeigen und mit einem Nicht-Null-Status beenden“ zu formulieren, verwenden Sie den Fehlerbefehl :

#!/usr/bin/env osascript

tell application "System Events"
    set apps to the name of every process whose background only is false
end tell

if "Some Application" is in apps then
    error "Some Application is running" number 5
end if

Die Zahl (5 im Beispiel) spielt keine Rolle; osascript wird mit Status 1 beendet, egal welche Nummer Sie wählen. Sie haben keine Kontrolle über die Formatierung der Nachricht, aber der Exit-Status ungleich Null blockiert den Commit.

Wenn Sie Probleme haben, den Pre-Commit-Hook überhaupt zum Laufen zu bringen, denken Sie daran, ihn als .git/hooks/pre-commit zu speichern und ihn ausführbar zu machen .

(Update) Wenn Sie den Fehler -10810 erhalten, versuchen Sie es ohne Systemereignisse. So was

#!/usr/bin/env osascript

set someApp to "Some App"
set appIsRunning to false
if application someApp is running then
    set appIsRunning to true
end if
if appIsRunning then
    error "Can't commit. Please quit Some App" number 5
end if
ja das war das problem.
bekomme immer noch einen Fehler. Aktualisierung der Frage
Fehler -10810 ist ein allumfassender Launch Services-Fehler, was bedeutet, dass einige Apps aus einem unbekannten Grund nicht gestartet werden konnten. Das Problem liegt nicht im AppleScript selbst (da OSA Script einen spezifischeren Fehler ausgeben würde), obwohl der von Ihnen gepostete Code einen Syntaxfehler aufweist (nicht übereinstimmende Anführungszeichen).
Leider war der Syntaxfehler nur ein Tippfehler beim Kopieren und Einfügen. Korrigiert
Wenn ich den Aufruf von System Events herausnehme, funktioniert es. Daher können Systemereignisse möglicherweise nicht auf diese Weise aufgerufen werden
Das Beispielskript, das ich oben gepostet habe, war ein direktes Kopieren/Einfügen von meinem verifizierten funktionierenden Pre-Commit-Hook. Die einzige Änderung, die ich vorgenommen habe, war, "Comic Life", die App, mit der ich getestet habe, durch "Some Application" zu ersetzen. Systemereignisse können definitiv so aufgerufen werden.
Die einzige Möglichkeit, dieses Skript zum Ausführen zu bringen, besteht darin, den Block „Tell Application „System Events““ zu entfernen. MacOSX 10.10.1
Ich denke, das hat etwas damit zu tun, dass "Hilfs-Apps" nicht verwendet werden können. Wenn dies der Fall ist, funktionieren Systemereignisse nicht. Das war aber nicht wirklich meine Frage. Diese Antwort gab mir die Informationen, die ich brauchte, um mit Applescript einen Git-Hook zu erstellen. Also akzeptiere ich es.
Ich wiederhole, dass ich bei der Verwendung von Systemereignissen keinen Fehler erhalte.

Wenn Ihr Osascript (oben) funktioniert, können Sie es über ein Shell-Skript starten. Verwandeln Sie das Osascript mit dem Skripteditor in eine App. Dann könnte dieses Shell-Skript Ihr Git-Pre-Commit-Hook sein. Etwas wie:

#!/bin/bash
/usr/bin/osascript $HOME/bin/YOUR_OSASCRIPT.app 2>/dev/null

Ich verwende diese Technik, um Skripte über crontab zu starten, damit es in Ihrer Situation funktionieren sollte.