2016-06-25 20 views
5

(lange Geschichte ...)Was verursacht git-apply "korrupter Patch?"

ich in der Mitte bin eine gigantische PHP-Anwendung zu bringen, zu diesem Jahrhundert bis ... ;-) ... während andere Teams halten weiterhin an die bestehende Version davon.

Dies hat bisher zu etwa 275 Patches geführt. Das Problem ist, dass eine der Änderungen, die wir vorgenommen haben, darin besteht, <? Tags in <?php und einige ähnliche Änderungen im Code zu konvertieren. All dies verhindert natürlich die Anwendung von Patches, denn (tatsächlich ...) stimmt der Quellcode nicht mit überein.

Also, ich dachte, ein kleines Skript zu schreiben, um die Patch-Dateien zu bearbeiten: um die Tags im Patch zu ändern.

Was ich bekomme, ist jedoch corrupt patch.

Also, was ich gerne wissen würde: was verursacht diese Nachricht? Das heißt, auf welche Art von Fehlern wartet Git, wenn es auf diese Nachricht kommt? Ich muss meinen Tweaker "zwicken" ... ahem ... damit die bearbeiteten Patches funktionieren. (NB die Original-Patch-Dateien, bevor ich sie zwicken, sind nicht „verdorben“, so dass es etwas sein, muss ich tue.)

Mein Skript versucht, die oben genannten PHP-Tag zu ändern, und <?php echo, und ein Funktionsname. Nichts mehr als ein globales Preg-Replace. Ich sehe nicht leicht, was ich tun könnte, das wäre, sagen wir, "strukturelle Besorgnis" gegenüber Git. Aber offensichtlich ist etwas.

Beispiel Patch: 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

Haben die Patch-Dateien sha1-Hashes? – melpomene

+0

Ich bin mir nicht sicher, wonach ich suchen würde. Kannst du mir sagen, wie so etwas in der Patch-Datei aussehen würde? Ist es möglich zu sagen, dass solche Hashes ignoriert werden sollen? (Ich verstehe, dass ein Patch eine Anti-Korruptions-Kontrolle enthalten könnte ... aber wenn es so ist, möchte ich es in diesem Fall ignorieren.) –

+0

Können Sie ein Beispiel für einen beschädigten Patch veröffentlichen? – melpomene

Antwort

5

tl; dr: Ich vermute, dass Sie irgendwie eine Zeilenende entfernt haben, wenn eine Linie Transformation, die nur aus <? besteht.

Ihr Skript hat entweder eine wichtige Zeile im Patch entfernt oder Sie haben die Header geändert. Der erste Teil des diff von catalog/product_info_v3.php ist fehlerhaft.

Sein Kopf ist:

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

Welche Informationen über die angibt, wie die Hunk zum Urbild entspricht (die Originaldatei) und der postimage (hergestellt von der Anwendung dieses Patches). Der Urbildinformation ist ein Präfix - vorangestellt und gibt -186,7 an, was darauf hinweist, dass dieses Stück 7 Zeilen vom Urbild beginnend bei Zeile 186 enthält. Die Nachbildinformation hat das Präfix + und ist +186,7, was anzeigt, dass dieses Stück 7 Zeilen ausgibt zum postimage, in Zeile 186. beginnend

Diese 7 Linien entweder Kontext gehören können (die Zeilen gemeinsam sind, mit einem Raum vorangestellt), Linien, die nur in dem Urbild existieren (Präfix mit einem -) oder Linien, die existiert nur im Postimage (vorangestellt mit +).

am Hunk Betrachtet man dann jede Zeile mit seiner Art Beschriftung:

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 == "") { 

Die context Linien wiederum wird in sowohl das Urbild und die postimage. Also gibt es insgesamt 6 Zeilen für das Urbild und 7 Zeilen für das Postbild.

Aber Ihr Header sagte, dass es 7 Zeilen für das Urbild gab! Entweder ist der Header falsch oder die Anweisungen sind falsch. (Und Git erwartet in Zeile 37 eine andere Zeile des Urbildes, aber stattdessen ist es eine neue Kopfzeile, also hat Git festgestellt, dass Ihre Patch-Datei beschädigt ist.)

Die Zeilen in diesem Patch legen nahe, dass Sie die hinzufügen if Zeile zum Postimage, die nicht im Urbild vorhanden war. Wenn das korrekt ist, dann haben Sie Ihre Kopfzeile gebrochen, und es sollte -186,6 +186,7 sein, die anzeigt, dass dem Postimage eine Zeile hinzugefügt wird.

Alternativ, wenn Sie die Linie if Wechsel sind, dann haben Sie seinen Urbild Zustand ausgelassen, und Sie sollten eine Zeile oberhalb der postimage Linie haben.

Wenn Sie genau hinsehen, sieht es so aus, als hätten Sie in der Zeile oben tatsächlich eine Zeilenschaltung nach der <?php verpasst. Dein Kontext war wahrscheinlich nicht <?php -if ... da ich vermute, dass PHP nicht valide ist, mit einem Bindestrich vor der if.

ich vermuten, dass dieses Stück sollte wie folgt aussehen:

@@ -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 == "") { 

Welche nicht beschädigt ist, und jetzt gibt es 7 Zeilen Urbild (die sechs Kontextzeilen sowie die Linie, die im Urbild existiert nur , die mit den - Präfix) und 7-Linien von postimage (die sechs Kontextzeilen sowie der Zeile, die nur in der postimage existiert, die mit den + Präfix.)

so, jetzt haben wir eine rechtliche Patch, wie die Betriebsanleitung Passe die Kopfzeile an.

+0

Drat ... der "up-vote" Knopf funktioniert nur EINMAL. **: - D ** * "Unbezahlbar!" * Nun, lass mich die nächste halbe Stunde damit verbringen, das aufzunehmen, was du gerade gesagt hast. ### * "Ahh, ich sehe etwas ..." * –

0

Verfolgt Edwards superlative Antwort auf diese Frage, habe ich mir die "vor" und "nach" Patch-Dateien genauer angeschaut.   Nun, ich ’ ist noch nicht sicher, wie meine reguläre Ausdrücke dieses tat, aber hier offenbar ist, was es tat:

Die Original-Patch-Datei:

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

.. und die eine nach meinem Regex mit ihm durchkam:

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

Was ist das Problem? Die "Newline" ist weg.

beide Gefühl verwirrt und ein bisschen jetzt dumm, ich schaute auf meine (PHP) Code:

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

und-d-d-d ..., „da ist es.": -/

Die Absicht dies offensichtlich-in-Fehler (? Irgendwie ...) regulärer Ausdruck ist die Verwendung eines "Null-Länge positiven Vorgriff Behauptung" (?=<? zu finden Tags, die nicht bereits <?php oder <?xml sind.

(Whack!) "D'oh!"

ich bin eine positive Vorgriff Behauptung mit zu Wenden Sie einen Test für "nicht in der folgenden Liste der Zeichen an. In diesem Fall sollte ich eine negative Look-ahead verwenden: (?![px=]) Ziemlich sicher, dass die Newline vor konsumiert werden. (Ich bin nicht auf die Datei eine Zeile zu einem Zeitpunkt zu lesen Ich bin nur in der ganzen Sache schlürfen..)

Edit # 2: ... Und in so viele Millisekunden, die richtige Antwort erscheint in Kommentar # 1: Der \s* verbraucht den Zeilenumbruch, und ein negativer Lookahead (der anscheinend überhaupt nicht funktioniert) ist unnötig. (! In der Tat sollte \s* nicht da sein überhaupt) einmal positive Vorschau Verwendung wieder, und die \s* zu entfernen und durch einen Raum mit nur <?php statt der gleichen Sache gefolgt ersetzen ... das Skript funktioniert:

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

Meist-aufrichtig und überschwänglich dank an alle, die mir Abbildung dieses eine geholfen. (Und besonders Edward, der uns allen so detailliert erklärt hat, wie diese Patch-Dateien tatsächlich formatiert sind!)

+0

Das Problem ist, dass dein '\ s *' zu '\ n' passt. Das positive Lookahead ist in Ordnung. Entweder stimmen Sie nicht mit der neuen Zeile überein oder verwenden Sie '(\ s *)' und betten Sie die Übereinstimmung in die Ersetzung ein. – maaartinus