لماذا يعمل خطاف SVN قبل الالتزام محليًا ، ولكن ليس على الالتزام؟

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

سؤال

لديّ خطاف ما قبل الالتزام التالي للاستخدام JavaScript Lint للتحقق من ملفات JavaScript قبل الالتزام:

#!/bin/env bash

REPOS="$1"
TXN="$2"

ECHO=/bin/echo
GREP=/bin/grep
SED=/bin/sed

SVN=/usr/bin/svn
SVNLOOK=/usr/bin/svnlook
FILES_CHANGED=`$SVNLOOK changed -r$TXN $REPOS | $SED -e "s/^....//g"`

JSL=/usr/local/bin/jsl
JSL_CONF=/usr/local/etc/jsl.conf

for FILE in $FILES_CHANGED
do
        if $ECHO $FILE | $GREP "\.js$"
        then
                $SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
                JSL_ERROR_CODE=$?
                if [ $JSL_ERROR_CODE != 0 ]
                then
                        exit $JSL_ERROR_CODE
                fi
        fi
done

# If we got here, nothing is wrong.
exit 0

هذا الرمز يعمل محليا على النحو التالي:.

لكن لا خطأ بشكل صحيح على SVN الالتزام.

لقد قمت بالفعل بتفسير:

  • لا يوجد مسار $ ، أقوم بتعيين جميع مسارات الأوامر بشكل صريح.
  • أقوم بمسح رمز الخطأ الصحيح من أمر JSL للخروج.
  • أنا أدفع stdout إلى Stderr لأمر JSL بحيث يتم عرضه في فشل الالتزام.

ماذا ينقصني؟

لك،
تريفور

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

المحلول 2

اكتشفت الإجابة بعد طريق طويل ومتعرج. في الأساس ، في البرنامج النصي أعلاه أنا أستخدم -R في أوامر SVN الخاصة بي ، لكن في ما قبل ارتكاب صنارة صيد عليك أن تستعمل -t, ، وليس -R. النص الكامل أدناه:

#!/bin/sh

REPOS="$1"
TXN="$2"

ECHO=/bin/echo
GREP=/bin/grep
SED=/bin/sed

SVNLOOK=/usr/bin/svnlook
FILES_CHANGED=`$SVNLOOK changed -t$TXN $REPOS | $SED -e "s/^....//g"`

JSL=/usr/local/bin/jsl
JSL_CONF=/usr/local/etc/jsl.default.conf

for FILE in $FILES_CHANGED
do
    if $ECHO $FILE | $GREP "\.js$"
    then
        $SVNLOOK cat -t$TXN $REPOS $FILE | $JSL -conf $JSL_CONF -stdin -nologo 1>&2
        JSL_ERROR_CODE=$?
        if [ $JSL_ERROR_CODE != 0 ]
        then
            exit $JSL_ERROR_CODE
        fi
    fi
done

# If we got here, nothing is wrong.
exit 0

نصائح أخرى

من المحتمل أن يتوقع أحد البرامج التي تقوم بتشغيلها تعيين بعض متغيرات البيئة.

من إنشاء وتكوين المستودع:

لأسباب أمنية ، يقوم مستودع التخريب بتنفيذ نصوص الخطاف مع بيئة فارغة - أي أنه لا توجد متغيرات بيئة على الإطلاق ، ولا حتى المسار $ أو ٪. ولهذا السبب ، فإن الكثير من المسؤولين يشعرون بالحيرة عندما يعمل نص الخطاف الخاص بهم بشكل جيد ، لكن لا يعمل عند تشغيله عن طريق التخريب. تأكد من تعيين متغيرات البيئة بشكل صريح في الخطاف و/أو استخدام المسارات المطلقة للبرامج.

حاول تنفيذها محليًا دون تعيين أي متغيرات بيئة ومعرفة ما إذا كان ذلك يعمل.

عادة ما ينتهي بي الأمر إلى استيراد كل بيئتي في السطر الأول من نصوص الخطاف:

source /home/username/.bash_profile

إذا كان الخطأ الذي تبحث عنه قادمًا svn في خط الأنابيب بدلاً من ذلك jsl, ، ومن بعد $? لن تحتوي على رمز الإرجاع. يستخدم ${PIPESTATUS[@]} في حين أن. إنها مجموعة تحتوي على رموز الإرجاع لكل عضو في خط الأنابيب. ستكون هناك طريقة سريعة للتحقق من أي فشل غير محدد:

$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ! ${PIPESTATUS[@]} =~ 1 ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]

أو

$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ${PIPESTATUS[@]} != *1* ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top