2016-06-25 11 views
5

(लंबी कहानी ...)क्या गिट-लागू "दूषित पैच" का कारण बनता है?

मैं वर्तमान सदी के लिए एक विशाल पीएचपी आवेदन परवरिश के बीच में हूँ ... ;-) ... जबकि अन्य टीमों बनाए रखने के लिए जारी है इसका मौजूदा संस्करण

यह अब तक 275 पैच तक पहुंच गया है। समस्या यह है कि हमने जो बदलाव किए हैं, उनमें से एक है <? टैग <?php, और कोड में कई समान परिवर्तनों को परिवर्तित करना है। जिनमें से सभी, निश्चित रूप से, पैच लगाने से रोकते हैं, क्योंकि (वास्तव में ...) स्रोत कोड मैच नहीं है।

तो, मैंने पैच फ़ाइलों को संपादित करने के लिए एक छोटी सी स्क्रिप्ट लिखने के लिए सोचा: पैच में टैग बदलने के लिए।

जो मुझे मिल रहा है, हालांकि, corrupt patch है।

तो, मैं क्या जानना चाहता हूं: इस संदेश का कारण बनता है? यही कहना है कि गिट की किस तरह की त्रुटियां तलाश रही हैं, जब यह इस संदेश के साथ आता है? मुझे "मेरे ट्वीकर को ट्विक" करने की ज़रूरत है ... अहम ... ताकि संपादित पैच काम कर सकें। (नायब मूल पैच-फ़ाइलें, इससे पहले कि मैं उन्हें tweak, नहीं "भ्रष्ट" हैं, तो यह कुछ मैं कर रहा हूँ होना चाहिए।)

मेरे स्क्रिप्ट पूर्वोक्त पीएचपी टैग को बदलने के लिए प्रयास कर रहा है, और <?php echo, और एक समारोह-नाम। वैश्विक प्रीग-प्रतिस्थापन से कुछ भी नहीं। मैं आसानी से नहीं देखता कि मैं क्या कर सकता हूं, जो हम करेंगे, क्या हम गिट को "संरचनात्मक चिंता" कहेंगे। लेकिन जाहिर है, कुछ है।

उदाहरण पैच: corrupt patch at line 37 ...

From 342c5939da8cf4cbe495be7d635cd627bd2a44ed Mon Sep 17 00:00:00 2001 
From: xxx <[email protected]> 
Date: Wed, 17 Feb 2016 03:45:31 +0000 
Subject: [PATCH 001/275] Make it all work 


--- 
catalog/includes/modules/shipping/upsFreeGround.php | 2 +- 
catalog/product_info_v3.php       | 6 +++--- 
2 files changed, 4 insertions(+), 4 deletions(-) 

diff --git a/catalog/includes/modules/shipping/upsFreeGround.php b/catalog/includes/modules/shipping/upsFreeGround.php 
index 45a6da4..55ccecb 100755 
--- a/catalog/includes/modules/shipping/upsFreeGround.php 
+++ b/catalog/includes/modules/shipping/upsFreeGround.php 
@@ -194,7 +194,7 @@ function quote($method = '') { 

     // Can probably combine this with the above, eventually 
     $allFreeBW2016Plaques = false; 
-   if (STORES_ID == 10) { 
+   if ((STORES_ID == 10) || (STORES_ID == 26)) { 
      $allFreeBW2016Plaques = true; 
      foreach ($order->products as $aProduct) { 
        $thisNote = $aProduct['product_specific_notes']; 
diff --git a/catalog/product_info_v3.php b/catalog/product_info_v3.php 
index 09d88de..10d9b76 100644 
--- a/catalog/product_info_v3.php 
+++ b/catalog/product_info_v3.php 
@@ -186,7 +186,7 @@ function doRequestComplete() { 
     } 
    } 
<?php -if ((STORES_ID == 10) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
+if (((STORES_ID == 10) || (STORES_ID == 26)) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
function doCheckBW2016PlaqueProperty() { 
    thePropertyNumber = document.getElementById('propertyToCheck'); 
    if (thePropertyNumber.value == "") { 
@@ -1426,7 +1426,7 @@ if($combo_count>0) { ?> 
         ?> 
         </div> <!-- div_add_to_cart --> 
      </div> <!-- cart_info_row2 --> 
-   <?php if ((STORES_ID == 10) && (in_array($products_id, $bwFreePlaqueIDList2016))) { 
+   <?php if (((STORES_ID == 10) || (STORES_ID == 26)) && (in_array($products_id, $bwFreePlaqueIDList2016))) { 
       // First, let's see if we are "sold out" 
       $query = "select bw_plaque_2016_id from bw_plaque_2016 where first_one_free='1' limit 1"; 
       $bwpRes = tep_db_query($query); 
@@ -1629,7 +1629,7 @@ DIVCONTAINER; 
</table> <!--pageTable for sure --> 

<script type='text/javascript'> 
- <?php if ((STORES_ID == 10) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
+ <?php if (((STORES_ID == 10) || (STORES_ID == 26)) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
    function doFreePlaquePriceChange() { 
     // Change the quantity to 1 
     $('quantityToAdd').setValue('1'); 
-- 
2.6.4 (Apple Git-63) 
+0

क्या पैच फ़ाइलों में sha1 हैश हैं? – melpomene

+0

मुझे यकीन नहीं है कि मैं क्या देख रहा हूं। क्या आप मुझे बता सकते हैं कि पैच फ़ाइल में ऐसी चीज कैसी दिखती है? क्या ऐसी किसी भी हैश को अनदेखा करने के लिए आवेदन करना संभव है? (मैं समझता हूं कि एक पैच में भ्रष्टाचार विरोधी जांच हो सकती है ... लेकिन, अगर ऐसा होता है, तो मैं इस मामले में इसे अनदेखा करना चाहता हूं।) –

+0

क्या आप भ्रष्ट पैच का उदाहरण पोस्ट कर सकते हैं? – melpomene

उत्तर

5

tl; डॉ: मुझे लगता है कि आप किसी भी तरह एक लाइन जब एक पंक्ति है कि केवल <? के होते हैं बदलने समाप्त होने को हटा दिया है संदेह है।

आपकी स्क्रिप्ट ने या तो पैच में एक महत्वपूर्ण पंक्ति हटा दी है, या आपने हेडर बदल दिए हैं। catalog/product_info_v3.php के अंतर का पहला हिस्सा विकृत है।

इसका हेडर है:

@@ -186,7 +186,7 @@ function doRequestComplete() { 

कौन सा के बारे में जानकारी बताती है कि हंक preimage (मूल फ़ाइल) और postimage (इस पैच लागू द्वारा उत्पादित) से मेल खाती है। Preimage जानकारी को - द्वारा पूर्ववर्ती किया गया है, और यह -186,7 है, यह दर्शाता है कि इस हंक में 186 लाइन से शुरू होने वाली प्रीमीज से 7 लाइनें शामिल हैं। पोस्टिमेज जानकारी + द्वारा उपसर्ग की गई है, और यह +186,7 है, जो दर्शाती है कि यह हंक 7 लाइनों को उत्सर्जित करेगा पोस्टिमेज के लिए, लाइन 186 से शुरू हो रहा है।

ये 7 लाइनें या तो संदर्भ (जो सामान्य रूप से रेखाएं हैं, एक जगह के साथ prefixed) शामिल हैं, लाइनें केवल preimage में मौजूद हैं (- के साथ prefixed), या लाइनें केवल पोस्टिमेज में मौजूद है (+ के साथ उपसर्ग)।

तो इसकी इस प्रकार के प्रत्येक लाइन लेबलिंग पर हंक को देखते हुए:

context:   } 
    context:  } 
    context: <?php -if ((STORES_ID == 10) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
postimage: +if (((STORES_ID == 10) || (STORES_ID == 26)) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
    context: function doCheckBW2016PlaqueProperty() { 
    context:  thePropertyNumber = document.getElementById('propertyToCheck'); 
    context:  if (thePropertyNumber.value == "") { 

context लाइनों, फिर से, दोनों preimage और postimage में होगा। तो प्रीमिटेज के लिए कुल 6 लाइनें हैं, और पोस्टिमेज के लिए 7 लाइनें हैं।

लेकिन आपके हेडर ने कहा कि प्रीमीज के लिए 7 लाइनें थीं! तो या तो हेडर गलत है या निर्देश गलत हैं। (और गिट लाइन 37 पर प्रीमीज की एक और पंक्ति देखने की उम्मीद कर रहा है, लेकिन इसके बजाय यह एक नई हेडर लाइन है, इसलिए गिट ने यह निर्धारित किया है कि आपकी पैच फ़ाइल दूषित है।)

इस पैच की रेखाएं बताती हैं कि आप जोड़ रहे हैं if पोस्टिमेज के लिए लाइन, जो प्रीमिमेज में मौजूद नहीं थी। यदि यह सही है, तो आपने अपना हेडर तोड़ दिया है, और यह -186,6 +186,7 होना चाहिए जो दर्शाता है कि पोस्टिमेज में एक पंक्ति जोड़ा जा रहा है।

वैकल्पिक रूप से, अगर आप बदलते if लाइन थे, तो आप अपने preimage राज्य नहीं दिखाए हैं, और आप postimage रेखा के ऊपर एक लाइन होनी चाहिए।

ध्यान से देख रहे हैं, ऐसा लगता है कि आप वास्तव में ऊपर दी गई पंक्ति में <?php के बाद एक नई लाइन चूक गए हैं। आपका संदर्भ शायद <?php -if ... नहीं था क्योंकि मुझे संदेह है कि यह वैध PHP नहीं है, if के सामने एक हाइफ़न के साथ।

मैं संदेह कि इस हंक दिखना चाहिए:

@@ -186,7 +186,7 @@ function doRequestComplete() { 
     } 
    } 
<?php 
-if ((STORES_ID == 10) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
+if (((STORES_ID == 10) || (STORES_ID == 26)) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
function doCheckBW2016PlaqueProperty() { 
    thePropertyNumber = document.getElementById('propertyToCheck'); 
    if (thePropertyNumber.value == "") { 

कौन भ्रष्ट नहीं है, और अब वहाँ preimage (छह संदर्भ लाइनों के 7 लाइनों, के साथ साथ लाइन है कि केवल preimage में मौजूद हैं निर्देश के रूप में, - लगी होती हैं कि) और postimage (छह संदर्भ लाइनों, के साथ साथ लाइन है कि केवल postimage कि + लगी होती हैं में मौजूद है के 7 लाइनों।)

तो अब हम एक कानूनी पैच है हेडर से मेल करें।

+0

ड्रैट ... "अप-वोट" बटन केवल एक बार काम करता है। **: - डी ** * "अनमोल!" * अब, मुझे अगले आधे घंटे में अवशोषित करने दें जो आपने अभी कहा है। ### * "आह, मैं कुछ देखता हूं ..." * –

0

एडवर्ड के उत्कृष्ट इस प्रश्न का उत्तर देते हुए, मैंने "पहले" और "बाद" पैच फ़ाइलों पर एक नजदीकी नजर डाली।   अभी तक यकीन है कि कैसे मेरे नियमित अभिव्यक्ति ऐसा किया नहीं हूँ ठीक है, मैं ’, लेकिन यहाँ, जाहिरा तौर पर, यह क्या किया है:

मूल पैच-फ़ाइल:

<? 
-if ((STORES_ID == 10) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
+if (((STORES_ID == 10) || (STORES_ID == 26)) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 

.. और मेरे regex के बाद एक के माध्यम से मिला:

<?php -if ((STORES_ID == 10) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
+if (((STORES_ID == 10) || (STORES_ID == 26)) && (in_array($products_id, $bwFreePlaqueIDList2016))) { ?> 
function doCheckBW2016PlaqueProperty() { 

समस्या क्या है? "न्यूलाइन" चला गया है।

दोनों महसूस कर हैरान और एक छोटे से अब मूर्ख सा, मैं अपने (PHP) कोड को देखा:

$content = preg_replace('/\<\?\s*(?=[^xp=])/', '<?php ', $content); 

और-डी-डी-डी ..., "वहाँ यह है।": -/

की आशय इस स्पष्ट रूप में त्रुटि (? किसी भी तरह ...) रेगुलर एक्सप्रेशन का उपयोग करना है" शून्य लंबाई सकारात्मक लुक-आगे अभिकथन "(?=<? को खोजने के लिए टैग कि पहले से ही <?php या <?xml नहीं हैं।

(अजीब!) "डी 'ओह!"

मैं करने के लिए एक सकारात्मक लुक-आगे अभिकथन उपयोग कर रहा हूँ वर्णों की निम्नलिखित सूची में " के लिए एक परीक्षण लागू करें। इस मामले में, मुझे नकारात्मक का उपयोग करना चाहिए: (?![px=]) बहुत यकीन है कि नई लाइन को खपत से बचाएगा। (। मैं फ़ाइल एक समय में एक लाइन मैं सिर्फ पूरी बात में slurping कर रहा हूँ पढ़ रहा हूँ नहीं।)

# 2 संपादित करें: इतने सारे मिलीसेकेंड में ... और,, सही जवाब टिप्पणी # 1 में दिखाई देता है: \s* नई लाइन का उपभोग कर रहा है, और नकारात्मक-लुकहेड (जो बिल्कुल काम नहीं कर रहा है) अनावश्यक है। (! वास्तव में, \s* नहीं वहाँ सब पर होना चाहिए) सकारात्मक अग्रदर्शी का उपयोग करते हुए एक बार फिर से, और \s* को दूर करने, और सिर्फ एक ही बात फिर एक रिक्ति के बजाय <?php साथ की जगह ... स्क्रिप्ट काम करता है:

$content = preg_replace('/\<\?(?=[^xp=])/', '<?php', $content); 

आप सब जो मुझे मदद की यह एक यह पता लगाने की अधिकांश-गंभीर और असंयत धन्यवाद। (और विशेष रूप से एडवर्ड के लिए, जिन्होंने हमें इतने विस्तार से समझाया कि उन पैच-फाइलों को वास्तव में प्रारूपित किया गया है!)

+0

समस्या आपकी '\' * '' n' 'से मेल खाती है। सकारात्मक लुकहेड ठीक है। या तो नई लाइन से मेल न करें या '(\ s *)' का उपयोग न करें और प्रतिस्थापन में मैच एम्बेड करें। – maaartinus

संबंधित मुद्दे