مشكلة مع .صافي التطبيق تحت لينكس لا تعمل من شيل

StackOverflow https://stackoverflow.com/questions/54503

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أعمل على .صافي بعد ارتكاب ربط تغذية البيانات إلى OnTime عبر الصابون SDK.هوك بلدي يعمل على ويندوز حسنا, ولكن على الإنتاج لدينا RHEL4 التخريب الخادم ، فإنه لن ينجح عندما دعا من قذيفة النصي.

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

عندما كنت تنفيذ ذلك مع المعلمات من سطر الأوامر, أنه يعمل بشكل صحيح.عندما يتم تنفيذها عبر قذيفة النصي ، أحصل على الخطأ التالي:(يبدو أن هناك بعض المشاكل مع عملية تنفيذ إس التي تستخدم للحصول على بيانات السجل من أجل تنقيح):

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]

لقد حاولت استخدام mkbundle و mkbundle2 لجعل قائمة بذاتها يمكن أن يكون اسمه post-commit, ولكن يمكنني الحصول على رسالة خطأ مختلفة:

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]

أي أفكار لماذا قد يكون الفشل من قذيفة النصي أو ما قد يكون خطأ في المجمعة الإصدار ؟

تحرير: @Herms, لقد حاولت ذلك مع صدى يبدو الحق.أما بالنسبة $1/hooks/post-commit.exe, لقد حاولت السيناريو مع مسار كامل إلى .صافي الجمعية مع نفس النتائج.

تحرير: @ليون, لقد حاولت كل من $1 $2 و "$@" مع نفس النتائج.بل هو التخريب بعد ارتكاب هوك ، ويستغرق المعلمتين ، حتى تلك التي تحتاج إلى تمرير على طول .صافي الجمعية.على "$@" وكان ما كان الموصى بها في أحادية الموقع على الدعوة .صافي الجمعية من قذيفة النصي.قذيفة النصي هو تنفيذ .صافي الجمعية مع المعلمات الصحيحة ، وإنما هو رمي استثناء لا ارميك عند تشغيل مباشرة من سطر الأوامر.

تحرير: @فينكو, أنا لا أرى أي اختلاف في البيئة وغيرها من الأشياء مثل BASH_LINENO و BASH_SOURCE

تحرير: @لوقا, أنا متعب ، ولكن هذا لا فرق سواء.أنا لاحظت هذه المشكلة عند اختبار من TortoiseSVN على آلة (عندما تدير عملية فرعية من التخريب الخفي) ، ولكن وجدت أيضا أن أحصل على نفس النتائج عند تنفيذ البرنامج النصي من السنانير الدليل (أي ./post-commit REPOS REV, حيث post-commit هو فوق sh النصي.القيام mono post-commit.exe REPOS REV يعمل بشكل جيد.المشكلة الرئيسية هي أن تنفيذ, أنا بحاجة إلى شيء من اسم post-commit بحيث أنه سوف يطلق.ولكنه لا يعمل من قذيفة النصي ، كما ذكر أعلاه ، mkbundle لا يعمل مع مشكلة مختلفة.

هل كانت مفيدة؟

المحلول

فمن الطبيعي لبعض العمليات تعليق حول لفترة من الوقت بعد إغلاق المعياري (ie.يمكنك الحصول على نهاية ملف القراءة منها).تحتاج إلى استدعاء proc.WaitForExit() بعد قراءة جميع البيانات ولكن قبل التحقق ExitCode.

نصائح أخرى

مجرد عشوائية الفكر التي قد تساعد مع التصحيح.حاول تغيير الخاص بك قذيفة النصي:

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

تحقق لمعرفة ما إذا كان الخط فإنه يطبع مباريات الأوامر كنت أتوقع أن تشغيل.فمن الممكن الخاص بك وسيطة سطر الأوامر المناولة في شيل لا تفعل ما تريد أن تفعله.

أنا لا أعرف ماذا المدخلات الخاصة بك إلى البرنامج النصي ومن المتوقع أن يكون, لكن 1 دولار قبل أن المسار يبدو قليلا من مكان لي.

هل أنت متأكد من أنك تريد أن تفعل

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

$@ يوسع على جميع الحجج."$@" توسع إلى كل الحجج الانضمام إلى مسافات.أشك أنك شيل غير صحيحة.لم تكن الدولة بالضبط ما أردت البرنامج النصي بحيث لا يحد من قدراتنا على تقديم الاقتراحات.

مقارنة متغيرات البيئة في قذيفة من داخل النص.

محاولة وضع "cd $1/السنانير/" قبل الخط الذي يمتد أحادية.قد يكون لديك بعض الجمعيات في هذا المجلد التي توجد عند تشغيل أحادية من هذا المجلد في شل ولكن لم يتم العثور عليها عند تشغيل البرنامج النصي الخاص بك.

بعد التحقق من أن قانون بلدي هل تعمل من سطر الأوامر ، وجدت أنه لم يعد يعمل!ذهبت أبحث في بلدي .صافي كود لمعرفة إذا كان أي شيء منطقيا.

هنا هو ما كان:

        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;
        }

لقد غيرت هذه:

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

يبدو أن عملية التسكع أطول قليلا أنا الحصول على الإخراج ، وبالتالي proc.ExitCode هو رمي خطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top