يعمل البرنامج النصي بعد الالتزام SVN من سطر الأوامر ، ولكن ليس عند الارتباط بالملفات (الملفات) إلى SVN
-
23-09-2019 - |
سؤال
لديّ خطاف ما بعد الالتزام في SVN يعمل بشكل جيد من سطر الأوامر عندما أركض
env - ./foo.sh /path/to/svn/repos/ 12345
ولكن عندما يتم استدعاء البرنامج النصي من SVN ، لا يبدو أنه يعمل.
ما أقوم به بشكل أساسي هو التحقق من الملفات الملتزمة وإذا تم تعديل ملف معين ، فأنا أقوم بتصدير SVN إلى مشاركة الشبكة. يعمل بشكل جيد من سطر الأوامر.
البرنامج النصي بعد الالتزام هو كما يلي:
#!/bin/sh
REPOS="$1"
REV="$2"
CHANGED=`/usr/bin/svnlook changed -r "$REV" "$REPOS"`
SOURCE="svn+ssh://localhost/path/to/svn/repos/somefile.zip"
DEST="/mnt/build/somefile-r$REV.zip"
if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
`/usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST`
fi
exit 0
هل هناك طريقة لإخراج أي رسائل خطأ إلى ملف عند تشغيل البرنامج النصي ، أو على وجه التحديد خط تصدير SVN (حيث أعتقد أنه قد تكون هناك مشكلة)؟
المحلول
يتم التخلص من الإخراج القياسي من البرنامج النصي الخطاف ، ولكن يعود الخطأ القياسي إلى العميل ، على الأقل في الإصدارات الحديثة من التخريب. اعتقدت أن الأمر كان هكذا لفترة من الوقت ، لكن كتاب SVN 1.4 يقول أن الإخراج يتم تجاهله ، لذلك قد ترغب في التحقق من أنك تقوم بتشغيل إصدار محدث من الخادم-رؤية الخطأ القياسي الدفق هو وسيلة جيدة للحصول على الإنذار المبكر من أنواع الخطأ الشائعة.
لإرسال الإخراج من أمر إلى ملف ، وتضمين إخراج الخطأ القياسي في الملف أيضًا للحفاظ على كل شيء في مكان واحد ، قم بعمله
command >/path/to/logfile 2>&1
يستخدم >>
عوضا عن >
لإلحاق الملف:
command >>/path/to/logfile 2>&1
نظرًا لأن إخراج الخطأ القياسي يتم إرساله مرة أخرى إلى عميل SVN ، يمكنك أيضًا تمرير المعلومات من الإخراج القياسي على هذا النحو ، إما لأمر واحد ،
command 1>&2
أو للنص بأكمله ، عن طريق وضع
exec 1>&2
في الجزء العلوي من البرنامج النصي.
في لمحة ، أرى مشكلة واحدة في البرنامج النصي الخاص بك: على افتراض أن الخلفية على خط تصدير SVN ليست قطعة أثرية للعلامة ، يجب عليك إزالتها. (سيقومون بتنفيذ أمر التصدير الذي كتبته ، ثم يأخذون إخراجه ، وتنفيذ هذا الإخراج كأمر آخر - بالتأكيد ليس ما تقصده.)
if [[ "$CHANGED" =~ "trunk/somedir/somefile.zip" ]]
then
/usr/bin/svn export --non-interactive --trust-server-cert $SOURCE $DEST 1>&2
fi
(لم أكن أعرف عن بناء جملة اختبار الطوابع المزدوجة في باش ، هذا اكتشاف جديد لطيف بالنسبة لي!)