Frage

Ich arbeite an einer .Netto-post-commit-hook, um die feed-Daten in OnTime über Ihre Soap-SDK.Mein Haken funktioniert auf Windows gut, aber auf unsere Produktion RHEL4 subversion-server, es wird nicht funktionieren, wenn Sie aufgerufen wird, von einem shell-Skript.

#!/bin/sh
/usr/bin/mono $1/hooks/post-commit.exe "$@"

Wenn ich es dann ausführen mit Parametern von der Befehlszeile aus, es funktioniert einwandfrei.Bei der Ausführung über das shell-Skript, erhalte ich die folgende Fehlermeldung:(sieht aus wie es ist einige problem mit die Prozess-Ausführung des SVN, die ich verwenden, um die log-Daten, die für die überarbeitung):

Unhandled Exception: System.InvalidOperationException: The process must exit before getting the requested information.
  at System.Diagnostics.Process.get_ExitCode () [0x0003f] in /tmp/monobuild/build/BUILD/mono-1.9.1/mcs/class/System/System.Diagnostics/Process.cs:149
  at (wrapper remoting-invoke-with-check) System.Diagnostics.Process:get_ExitCode ()
  at SVNLib.SVN.Execute (System.String sCMD, System.String sParams, System.String sComment, System.String sUserPwd, SVNLib.SVNCallback callback) [0x00000]
  at SVNLib.SVN.Log (System.String sUrl, Int32 nRevLow, Int32 nRevHigh, SVNLib.SVNCallback callback) [0x00000]
  at SVNLib.SVN.LogAsString (System.String sUrl, Int32 nRevLow, Int32 nRevHigh) [0x00000]
  at SVNCommit2OnTime.Program.Main (System.String[] args) [0x00000]

Ich habe versucht, mit mkbundle und mkbundle2 machen Sie einen stand-alone könnten benannt werden post-commit, aber ich bekomme eine andere Fehlermeldung:

Unhandled Exception: System.ArgumentNullException: Argument cannot be null.
Parameter name: Value cannot be null.
  at System.Guid.CheckNull (System.Object o) [0x00000]
  at System.Guid..ctor (System.String g) [0x00000]
  at SVNCommit2OnTime.Program.Main (System.String[] args) [0x00000]

Irgendwelche Ideen, warum es vielleicht scheitern, von einem shell-Skript oder was könnte falsch sein mit der gebündelten version?

Edit: @Herms, Ich habe es schon versucht mit einem echo, und es sieht richtig aus.Wie für die $1/hooks/post-commit.exe, Ich habe versucht, das Skript mit und ohne vollständigen Pfad zu der .net-assembly mit dem gleichen Ergebnis.

Edit: @Leon, Ich habe versucht, sowohl die $1 $2 und "$@" mit dem gleichen Ergebnis.Es ist ein subversion post commit hook, und es nimmt zwei Parameter, so dass diejenigen, die übergeben werden müssen entlang der .net-assembly.Die "$@" war das, was empfohlen wurde, auf der mono-Website für Berufung ein .net-assembly aus einem shell-Skript.Das shell-Skript ist ausführen .net Montage-und mit den richtigen Parametern, aber es wirft eine Ausnahme, die nicht ausgelöst, wenn Sie direkt von der Befehlszeile.

Edit: @Vinko, Ich sehe keine Unterschiede in der Umwelt andere als Dinge wie BASH_LINENO und BASH_SOURCE

Edit: @Lukas, Ich müde, aber das macht keinen Unterschied, entweder.Zuerst bemerkte ich das problem beim testen von TortoiseSVN auf meinem Rechner (wenn er läuft, als ein sub-Prozess des subversion-daemon), aber auch festgestellt, dass ich die gleichen Ergebnisse erhalten, wenn die Ausführung des Skripts aus dem Haken directory (d.h. ./post-commit REPOS REV, wo post-commit ist die über sh-Skript.Tun mono post-commit.exe REPOS REV funktioniert einwandfrei.Das Hauptproblem ist, dass das ausführen, ich brauche etwas zu haben, was der name post-commit so dass es genannt werden.Aber es funktioniert nicht von einem shell-Skript, und wie oben erwähnt, die mkbundle funktioniert nicht mit einem anderen problem.

War es hilfreich?

Lösung

Es ist normal, dass einige Prozesse für eine Weile zu hängen, um, nachdem sie ihre stdout schließen (dh. Sie erhalten eine End-of-Datei aus, sie zu lesen). Sie müssen proc.WaitForExit() aufzurufen, nachdem alle Daten zu lesen, aber vor Exitcode zu überprüfen.

Andere Tipps

Nur ein zufälliger Gedanke, die mit Debugging helfen könnten. Versuchen Sie, Ihre Shell-Skript:

#!/bin/sh
echo /usr/bin/mono $1/hooks/post-commit.exe "$@"

Überprüfen, ob die Zeile den Befehl druckt übereinstimmt Sie erwarten, um es auszuführen. Es ist möglich, Ihr Befehlszeilenargument in dem Shell-Skript ist die Behandlung nicht tun, was Sie wollen, dass es zu tun.

Ich weiß nicht, was Ihre Eingabe in das Skript erwartet wird, aber der $ 1 vor dem Pfad sieht ein bisschen fehl am Platz zu mir.

Sind Sie sicher, dass Sie tun

/usr/bin/mono $1/hooks/post-commit.exe "$@"

$ @ erweitert, um alle Argumente. „$ @“ Erweitert, um alle Argumente durch Leerzeichen verbinden. Ich vermute, Sie Shell-Skript nicht korrekt ist. Sie haben es nicht genau sagen, was Sie das Skript wollte, zu tun, damit unsere Möglichkeiten beschränkt auf Vorschläge zu machen.

die Umgebungsvariablen in der Shell vergleichen und aus dem Skript.

Versuchen Sie "cd $ 1 / Haken /" vor der Zeile setzen, die Mono läuft. Sie können einige Baugruppen in diesem Ordner haben, die gefunden werden, wenn Sie Mono aus diesem Ordner in der Shell ausgeführt, sind aber nicht gefunden werden, wenn Sie das Skript ausführen.

Nachdem festgestellt, dass mein Code hat Arbeit von der Kommandozeile, ich fand, dass es nicht mehr funktioniert! Ich ging in meinen .net Code suchen, um zu sehen, ob etwas Sinn.

Hier ist, was ich hatte:

        static public int Execute(string sCMD, string sParams, string sComment,
                                  string sUserPwd, SVNCallback callback)
        {
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.EnableRaisingEvents = false;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.Verb = "open";
            proc.StartInfo.FileName = "svn";
            proc.StartInfo.Arguments = Cmd(sCMD, sParams, sComment, UserPass());
            proc.Start();
            int nLine = 0;
            string sLine = "";
            while ((sLine = proc.StandardOutput.ReadLine()) != null)
            {
                ++nLine;
                if (callback != null)
                {
                    callback.Invoke(nLine, sLine);
                }
            }
            int errorCode = proc.ExitCode;
            proc.Close();
            return errorCode;
        }

Ich änderte sich dies:

            while (!proc.HasExited)
            {
                sLine = proc.StandardOutput.ReadLine();
                if (sLine != null)
                {
                    ++nLine;
                    if (callback != null)
                    {
                        callback.Invoke(nLine, sLine);
                    }
                }
            }
            int errorCode = proc.ExitCode;

Es sieht aus wie der Prozess um ein bisschen mehr hängt als ich Ausgang bin immer, und damit die proc.ExitCode einen Fehler werfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top