كيفية استخدام svnlook في svn للبحث عن العناصر المتغيرة

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

  •  20-12-2019
  •  | 
  •  

سؤال

هل يمكن أن ترشدني إلى الطريقة svnlook يعمل أدناه.أريد تضمين هذا في خطاف لمنع الالتزامات في علامة أسفل /tags:

$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
هل كانت مفيدة؟

المحلول

سيسمح خطاف ما قبل الالتزام بالتخريب بالالتزام إذا أعاد رمز الخروج الخاص بـ 0.خلاف ذلك، سيتم ربط الخطاف المسبق يفشل ولن تتم معالجة الالتزام.

ال $SVNLOOK changed -t "$TXN" "$REPOS" سوف تظهر التغييرات في $REPOS الذي حدث في $TXN.يجب أن يتم تعيين متغيرات الصدفة بواسطتك.إذا نظرت إلى pre-commit البرنامج النصي الذي يأتي مع Subversion، سترى:

$TXN=$1
$REPO=$2

إخراج ال svnlook changed يبدو الأمر مثل هذا:

$ $SVNLOOK changed -t $TXN $REPOS
A   trunk/vendors/deli/
A   trunk/vendors/deli/chips.txt
A   trunk/vendors/deli/sandwich.txt
A   trunk/vendors/deli/pickle.txt
U   trunk/vendors/baker/bagel.txt
_U  trunk/vendors/baker/croissant.txt
UU  trunk/vendors/baker/pretzel.txt
D   trunk/vendors/baker/baguette.txt

العمود الأول هو ما إذا كان هناك شيء ما شمقسم, أددد، أو دالنخبة.يشير العمود الثاني إلى السمات.

والباقي هو اسم الملف الذي تم التصرف بناء عليه.يمكنك مشاهدة هذا baguette.txt تم حذفه، وأن خاصية على croissant.txt تم تغييره، ولكن لم يتم تحديث الملف نفسه.

لنفترض أن شخصًا ما حاول تغيير علامة.إخراج svnlook changed سوف تبدو مثل هذا:

$SVNLOOK changed -t $TXN $REPOS
U   tags/4.2.1/vendors/baker/bagel.txt

الأمر grep هو هذا:

grep "^U\W.*\/tags\/" 

هذا يبحث عن السطر الذي يبدأ بـ ^U يعني كان تحديثثم يبحث عن سلسلة تبدأ بـ /tags.أمم...قد تكون هذه مشكلة.لا يتطابق مع إخراج svnlook changed يأمر.

ربما ينبغي أن يكون:

grep -q "^U.[[\s+tags/"

سيطابق هذا أي سلسلة تبدأ بـ U, ، ومن المحتمل أن يتبعه حرف آخر، متبوعًا بمسافة بيضاء، ثم الكلمة مباشرة tags/.

قد ترغب في التحقق من هذا التعبير.

ال && هو مشغل القائمة.إذا كان التعبير على الجانب الأيسر من && يتم التنفيذ بنجاح (أييقوم بإرجاع رمز الخروج صفر)، سيتم تنفيذ البيان الموجود على الجانب الأيمن.وإلا فلن يتم تنفيذ العبارة الموجودة على اليمين.

وهكذا، إذا كان لديك grep يطابق نمطًا يبدو وكأن شخصًا ما قام بتحديث علامة، فسيكون ذلك صحيحًا.البيان على الجانب الأيمن من && سيتم تنفيذه.

هكذا،

/bin/echo "Cannot commit to tags!" 1>&2

سيتم تنفيذه.يتم إرسال هذا إلى STDERR والذي سيتم إرساله إلى عميل Subversion، ولكن فقط إذا كان رمز الخروج الخاص بخطاف الالتزام المسبق صفرًا.

وبالتالي أمر مشغل القائمة التالي exit 1 سيتم تنفيذه إذا /bin/echo ناجح.(قد لا يكون كذلك، لكنه عادة ما يكون كذلك).وبهذا، يخرج خطاف الالتزام المسبق برمز خروج غير صفري، ويفشل الخطاف، و Cannot commit to tags! سيتم إرسالها إلى عميل SVN ليراها المستخدم.

لا يوجد أي سبب على الإطلاق في العالم لكي يبدو هذا البيان على هذا النحو.وهذا معادل تقريبًا، وأسهل للفهم:

if $SVNLOOK changed -t $TXN $REPOS | grep -q "^U.[[\s+tags/"
then
    /bin/echo "Cannot commit to tags!" 1>&2"
    exit 1
fi
exit 0

بعد كل شيء، تحتاج إلى وضع هذا في برنامج نصي شل يسمى pre-commit على أي حال ولها متغيرات شل $SVNLOOK, $REPOS, ، و $TXN تعيين على أي حال.

السبب وراء عدم تكافؤ هذا تمامًا هو أن هذا سيفشل في الالتزام حتى لو كان /bin/echo فشل.


إذا كنت تبحث عن ربط مسبق للتحكم في العلامات، فيجب عليك إلقاء نظرة عليه مِلكِي.لقد تم اختبار ذلك على مئات المواقع، وسيمنحك المزيد من التحكم في مستودعك وسيقوم بالتحقق بشكل أفضل من الأخطاء.

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

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/**
access = read-only
users = @ALL

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/
access = add-only
users = @ALL

[file I can modify and delete tags]
file = /tags/**
access = read-write
users = jazzr

نلقي نظرة على هوك.إنه يعمل مع تثبيت Perl القياسي 5.8.8 وما فوق.لا يتطلب أي وحدات أخرى.ومع ذلك، إذا كنت تستخدم LDAP أو Active Directory للتحكم في الوصول إلى Subversion، فيمكنك تثبيت Net::LDAP وحدة Perl واستخدم مجموعات LDAP أو Active Directory في خطاف الالتزام المسبق للتحكم في الوصول.

نصائح أخرى

$SVNLOOK changed -t "$TXN" "$REPOS" طباعة كافة المسارات التي تم تغييرها.انظر هنا لمزيد من المعلومات حول المعلمات:http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.changed.html

بعد ذلك، يتم نقل قائمة المسارات التي تم تغييرها إلى grep الذي يتحقق مما إذا كان هناك أي شيء قد تغير يحتوي على "/tags/" في المسار، | grep "^U\W.*\/tags\/".

&& هو عامل التشغيل AND في الصدفة.إذا وجد أمر grep تطابقًا، فإنه يُرجع رمز الحالة 0 والذي يعادل في هذه الحالة "TRUE" وسيتم تنفيذ الأمر بعد &&، وإلا فلن يتم تنفيذه.

الجزء بعد &&، /bin/echo "Cannot commit to tags!" 1>&2 يقوم بتشغيل أمر الصدى ويكتب الرسالة من 1 (قياسي) إلى &2 وهو الخطأ القياسي.إذا نجح ذلك، فسيخرج الأمر برمز الحالة 1 exit 1.سيؤدي ذلك إلى عودة البرنامج النصي الخاص بك مع رمز حالة غير صفري وسوف يفشل التزامك في إعادة "الالتزام بالعلامات!" رسالة إلى المستخدم.

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