Mercurial-Hook wird nicht ordnungsgemäß ausgeführt

7

Dies sollte eine sehr einfache Sache sein, aber aus irgendeinem Grund funktioniert es nicht mit meinem Mercurial-Repository. Ich möchte nur, dass der Remote-Repo hg update automatisch ausführt, wenn jemand darauf drückt. Also ich habe das in meiner .hg / hgrc Datei:

%Vor%

Einfach, oder? Aber aus irgendeinem Grund wird dies nie ausgeführt. Ich habe auch versucht, ein Shell-Skript zu schreiben, das das getan hat. .hg / hgrc sah so aus:

%Vor%

und hg-update sahen so aus:

%Vor%

Aber auch das wird nicht aktualisiert. Der Inhalt von hg help wird in works.txt geschrieben, für hg update wird jedoch nichts ausgegeben. Gibt es etwas Offensichtliches, dass ich hier vermisse? Das hat mich tagelang geplagt und ich kann es einfach nicht zur Arbeit bringen.

Aktualisieren

Okay, wenn ich den Schalter -v in der Befehlszeile von meiner Workstation verwende, der zum Remote-Repo schiebt, werden keine ausführlichen Nachrichten gedruckt, selbst wenn ich diese echo -Zeilen in .hg/hgrc habe. Wenn ich jedoch einen Push von einem Klon des Repos auf dem gleichen Dateisystem mache (ich bin über SSH angemeldet), bekomme ich Folgendes:

%Vor%

So klappt es, aber nochmal nur wenn ich vom selben Dateisystem drücke. Es funktioniert nicht, wenn ich versuche, von einer anderen Workstation über das Netzwerk zum Repo zu gelangen.

    
Marc W 11.05.2009, 15:25
quelle

9 Antworten

10

Ich habe einige Zeit damit verbracht, selbst darüber zu recherchieren. Ich denke, die Antwort auf das Problem wird knapp beschrieben hier :

  

Die Ausgabe muss nach stderr (oder / dev / null) umgeleitet werden, da stdout   wird für den Datenstrom verwendet.

Im Grunde werden Sie nicht zu stderr umleiten und somit stdout verschmutzen.

    
Barry 03.09.2010, 10:01
quelle
10

Nun, nachdem ich die gleichen Frustrationsschritte wie Marc W vor einiger Zeit gemacht hatte, fand ich endlich die Lösung für das Problem, zumindest, wenn Remote-Serving mit dem hgwebdir WSGI-Skript gemacht wurde.

Ich habe herausgefunden, dass Mercurial bei Verwendung dieser Art von Remote-Push über HTTP oder HTTPS einfach alles ignoriert, was Sie in die .hg / hgrc-Datei oder Ihr Repository schreiben. Die Eingabe des Hooks in der hgwebdir-Konfiguration funktioniert jedoch.

Also, wenn die untere Zeile in Ihrem hgwebdir.wsgi -Skript etwas wie

ist %Vor%

Der Abschnitt [hooks] config muss in die erwähnte hgweb.config gehen.

Ein Nachteil ist, dass diese Hooks für jedes Repository ausgeführt werden, das im Abschnitt [paths] dieser Konfiguration aufgeführt ist. Obwohl HG eine andere WSGI-fähige Funktion (hgweb statt hgwebdir) anbietet, um nur ein einziges Repository zu bedienen, scheint dieses keine Hooks zu unterstützen (auch keine Konfiguration). Dies kann jedoch umgangen werden, indem ein hgwebdir wie oben beschrieben verwendet wird und Apache RewriteRule alles in das gewünschte Unterverzeichnis abbildet. Dieser funktioniert für mich:

%Vor%

Viel Spaß mit Ihren Remote-Hooks über HTTP: D

    
smf68 02.02.2010 12:37
quelle
3

Zunächst möchte ich ein paar Kommentare oben korrigieren.

  • Haken werden auch beim Überschieben des Dateisystems aufgerufen.
  • Es ist nicht notwendig, den Haken im Repo zu behalten, auf dem sie arbeiten sollen. Sie können auch den gleichen Haken wie in Ihrer Frage auf der Benutzerseite schreiben. Sie müssen das Ereignis von changegroup nach outgoing ändern und auch die URL des Remote-Repos mit der Option -R angeben. Wenn der schiebende Benutzer über ausreichende Berechtigungen für den Remote-Repo verfügt, wird der Hook erfolgreich ausgeführt.

.hg / hgrc

%Vor%

Nun zu Ihrem Problem .... Ich schlage vor, sowohl prechangegroup und changegroup Hooks zu erstellen und einige Debugging-Ausgaben zu drucken.

.hg / hgrc

%Vor%

Und drücken Sie auch den Schalter -v, damit Sie wissen, welcher Hook läuft. Wenn Sie immer noch nicht herausfinden können, veröffentlichen Sie die Ausgabe. Ich könnte vielleicht helfen.

    
Aamir 17.05.2009 00:28
quelle
3

Mein Problem war, dass meine hgwebdir-Anwendung als "hg" -Benutzer ausgeführt wurde, aber das Repository gehörte mir. Daher musste ich dieses Konfigurationsbit zu hgweb.config hinzufügen, damit es die Hooks ausführt:

%Vor%     
flowblok 14.08.2011 23:54
quelle
2

Sie müssen es in der Remote -Repository-Datei hgrc haben. Es klingt, als ob es in Ihrem lokalen Repo ist.

Edit: Es hängt auch davon ab, wie Sie drängen. Einige Methoden rufen auf der rechten Seite keine Haken auf. (ssh tut, ich denke, HTTP tut, Dateisystem tut nicht )

Edit2: Was passiert, wenn Sie "lokal" auf den Computer des entfernten Repos drücken? Sie haben möglicherweise unterschiedliche Benutzer / Berechtigungen zwischen dem Webserver und der hgrc-Datei. (Siehe [server] und vertrauenswürdige Direktiven für hgrc.)

    
Macke 11.05.2009 20:17
quelle
2

Ich hatte das gleiche Problem von Windows Eclipse über http, aber nach der Erfassung von stderr stellte ich fest, dass der vollständige Pfad zur Datei hg.bat benötigt wurde. Mein Hooks-Bereich sieht jetzt so aus:

%Vor%

Hoffe das hilft jemand anderem.   SteveT

    
SteveT 19.10.2010 20:34
quelle
1

Probieren Sie das Debugging von hook aus , um zu sehen, warum es so ist läuft nicht.

Wahrscheinlich ein Berechtigungsproblem oder etwas ähnliches.

    
John Weldon 11.05.2009 15:41
quelle
1

dauerte eine Weile, aber ich habe es funktioniert.

Ich habe mit

angefangen %Vor%

das & gt; & amp; 2 pipes es auf Standardfehler so Remote-Konsolen werden es zeigen.

wenn remote sollte dies in der Konsole ausgegeben werden, wenn es ausgeführt wird

%Vor%

Es war nicht.

Ich habe hgweb.cgi benutzt, also bin ich ohne Unterschied zu hgweb.wsgi gewechselt.

Was ich entdeckt habe ist, dass einige Hooks nicht remote aufgerufen werden.

wenn ich es auf

umgestellt habe %Vor%

Das Hook-Tag und das Commit scheinen nicht aufgerufen zu werden, aber eingehende und Changeset werden aufgerufen. Ich habe die anderen nicht bestätigt.

Jetzt, da ich es funktionierte, wechselte ich zurück zu hgweb.cgi und alles funktioniert gleich.

    
Pete Brumm 08.11.2010 14:18
quelle
1

Der Grund, den ich dafür gefunden habe, hat nichts mit der Umleitung von stdout zu stderr zu tun. Wie Sie vielleicht auf der Wiki-Seite sehen, ist es in der aktuellen Version des Wikis nicht angegeben Ссылка

Das Problem, das ich gefunden habe, ist um Berechtigungen .

In meinem ursprünglichen Setup hatte ich einen Benutzer, sagen wir hguser mit einem Repo auf seinem Heim und einem Skript /etc/init.d/hg.init , um hg serve zu starten. Das Problem hg serve wurde von root ausgeführt, während die meisten Dateien unter dem Repo hguser betrafen (einige von ihnen wechselten irgendwann zu root , aber es macht mir nichts aus, da ich korrigiere sie mit chown )

Lösung:

  • chown -R hguser:hguser /home/hguser/repo (um ALLE Dateien zu korrigieren, zurück zu hguser)
  • starte su hguser -c "hg serve ..." (in meinem Fall von /etc/init.d/hg.init )
  • changegroup = hg update -C unter [hooks] in repo/.hg/hgrc wie üblich

Jetzt sollte es auf push

funktionieren

PS: In meinem Fall werde ich lieber auf den Kopf eines bestimmten Zweiges aktualisieren, also verwende ich hg update -C -r staging , um den Staging-Server nur für den Kopf des beabsichtigten Zweigs zu aktualisieren, selbst wenn tip von ist ein anderer Zweig (wie zB development )

Übrigens mein hg.init Skript endete wie folgt: (beachte den su hguser Teil)

%Vor%

PS: Dankeschön an Ссылка

    
arhak 29.05.2015 21:06
quelle