2016-03-20 6 views
2

Ich bereite das Tracking-System eines Kunden auf, das Mercurial (Version 2.0.2) verwendet, um den Status zu erfassen, und alle Änderungen automatisch jede Stunde festschreibt. Ich habe es von Cron nach Rundeck migriert, damit sie den Status erhalten, wenn/falls die Dinge fehlschlagen, was sofort dazu führte, dass der Job begann, die fehlgeschlagenen Aufträge von Rundeck aufgrund von "nichts änderte" -Fehler zu füllen. Ich ging sofort zu Google und ich bin überrascht, dass dieses Problem ausgelöst wird, aber ich habe keine Antworten gefunden. *

Es scheint wie drei sollte eine grundlegende, saubere SH oder Bash Option sein (aber ihre Befehlszeile Umgebung unterstützt Python und pip-Module, falls erforderlich).

My go-to-Antworten für diese Art der Sache ist:

  1. Ausgabe des ‚richtige‘ Befehl, bevor Sie den Befehl ausgeben, die ausfallen könnte, wenn die Dinge in Ordnung sind, dann Ausfall des Befehls gibt tatsächlich Fehler
  2. die Dokumentation zu lesen und die Fehlercodes verwenden, um zu unterscheiden, was passiert ist, die Umsetzung geeignete Antworten **
  3. eine Variante von 1 # tun oder # 2, wo ich den Befehl ausgeben und grep die Ausgabe ***

* Ich werde zugeben, dass ich mich schwer damit beschäftige, nach hg-Material zu suchen, teilweise wegen der Fülle an Informationen, der Ähnlichkeit mit git und meiner schlechten Angewohnheit, in git-Begriffen zu denken. Davon abgesehen sehe ich das Problem dort, einschließlich "[issue2341] hg commit returns error when nothing changed". Ich habe keine Antworten darauf gefunden und finde keine entsprechende Diskussion zu StackOverflow.

** Ich sehe um https://www.selenic.com/mercurial/hg.1.html, dass hg commit "0 zurück auf Erfolg, 1 wenn nichts geändert hat." Leider weiß ich, dass es andere Möglichkeiten gibt, sich zu scheitern. Gerade habe ich einen Dummy-Mercurial-Patch (mq) erstellt und einen Commit mit "abort: cannot commit over an applied mq patch" versucht. In diesem Fall war der Rückgabecode 255.

*** Ich nehme an, dass ich die anfängliche Festschreibung und Erfassung Fehlercode, stdout und stderr ausgeben kann; Verarbeite dann den Text, wenn Return 1 und Fehler ist, oder fahre fort, wie es angemessen ist.

+1

[Es gab viele Antworten] (http://bz.mercurial-scm.org/show_bug.cgi?id=2341), aber sie waren nur Variationen über diese alte Open-Source-Kastanie "es ist kein Käfer, du benutzt es nur falsch. Lass uns in Ruhe." – miken32

+0

Ordentlich notiert - ich meinte, dass ich keine Antworten sah, "die ich mochte" – sage

Antwort

1

Wenn Sie einen Befehl mögen, die nur verpflichtet, wenn etwas hat sich geändert, schreiben Sie einen Befehl, der überprüft, ob sich etwas geändert hat. Sie können es mehr „elegant“, indem sie es als einfaches bash bedingten Schreiben:

if [ -n "$(hg status -q)" ] 
then 
    hg commit -m "Automatic commit $(date)" 
fi 
+0

Ich bin nicht in diese Option verliebt, aber es scheint so gut zu sein wie wir mit verfügbaren Befehlen tun können. – sage

0

Meine erste Problemumgehung (meine am wenigsten bevorzugte der Optionen, die ich erwähne) ist das Hinzufügen eines Rundeck "error handler", ein Befehl, der als Reaktion auf einen Fehler ausgeführt wird. Mein Befehl lautet:

hg commit -m "Automatic commit..." files 2>&1 | grep "nothing changed" && echo "Ignoring 'nothing changed' error" 

Das die ‚nichts geändert‘ dupliziert, sondern unterdrückt den Fehler nur, wenn es die ‚nichts geändert‘ Fehler ist. Hässlich, aber erträglich, wenn niemand bessere Vorschläge hat ...

3

Sie können hg status | wc -l (oder grep Ausgabe) vor begehen, und verpflichten nur, wenn es Änderungen gibt es im Arbeitsverzeichnis

+0

Das ist sauberer, als die Fehlermeldung danach zu erkennen, aber lässt mich immer noch das Gefühl, dass ich Dinge zusammen für eine einfache Operation hacken muss.Außerdem denke ich, dass sie "-q" wollen, da sie nur existierende Dateien aktualisieren und keine neuen Dateien zum Repository hinzufügen, also 'hg status -q | wc -l'. – sage