[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Patch



On Fri, May 08, 2009 at 12:38:21PM +0200, Chris Leick wrote:
> Jens Seidel schrieb:
>> Chris Leick wrote:

>>> --- corStruct.R 2008-02-11 15:05:14.000000000 +0100
>>> +++ corStruct.R.orig    2009-05-08 09:32:56.000000000 +0200
>>
>> Oops, ist corStruct.R.orig wirklich die ursprüngliche Datei und corStruct.R
>> deine Korrektur? Dann hast du die Parameter von diff verwechselt, es sollte
>> diff -u orig neu > meinPatch heißen.
>
> Ich habe die Änderungen in den .orig-Dateien vorgenommen. War das richtig?

Dann ist deine Dateinamenwahl extrem ungewöhnlich. Normalerweise bezeichnet
.orig die ursprüngliche Form vom Upstream-Autor und nicht deine Version.

Im Patch kennzeichnet "-" die Version von Upstream und "+" deine Änderungen.

>> Arbeite nicht mit "cut here", sondern kombiniere die Änderungen für die drei
>> Zeichenketten in einem Patch. Dazu kannst du die einzelnen Patches einfach
>> aneinanderhängen oder besser noch diff rekursiv mit Option -r aufrufen.
>
> Auch wenn es drei verschiedene Dateien betrifft? Wie bekomme ich hier  
> den Pfad in die Datei? Es könnte immerhin sein, dass mehrere Dateien mit  
> gleichem Namen in unterschiedlichen Pfaden liegen.

diff -ru dir1/ dir2/ macht dies automatisch.

Erstelle eine unveränderte Kopie des Quellcodes unter z.B. nlme.TypoFixes/,
korrigiere in diesem Verzeichnis die drei Dateien und wende dann einfach
diff -ru nlme nlme.typeFixes > TypoFixes.diff
an. Hier habe ich an den urspünglichen Verzeichnisnamen nicht .orig
angehangen, aber das geht natürlich genauso.

Alternativ habe ich z.T. manchmal auch viele andere Änderungen in einem
Verzeichnisbaum, erstelle einen rekursiven Patch und lösche dann manuell aus
dem Patch, was nicht reingehört. Dabei sollte man natürlich keine
Syntaxfehler einbauen.

Oder man kann auch diff -u alteDatei neueDatei für jede geänderte Datei aufrufen
und die Ausgabe zum Patch hinzufügen. Die betroffenen Dateinamen sollten im Patch
enthalten sein. Wenn sich nur das oberste Verzeichnis unterscheidet, musst
du diff eben von außerhalb aufrufen, also vorher ein cd .. durchführen. Probiere
es einfach mal und wende den Patch dann wieder an ...

> Wenn ich zu der gleichen Datei zwei Patches erstelle, stimmen ggf. die  
> Zeilennummern des zweiten nur, wenn man den ersten in der vorher  
> einspielt. Wäre es nicht besser alle Patches pro Datei zusammenzufassen?

Nein. Was passiert, wenn der Autor einen Teil einspielen will, den anderen
aber nicht? Verschiedene Dinge gehören in verschiedene Patches. Ob die
Zeilennummern stimmen oder nicht, spielt keine Rolle. Dies ist nur für patch
ein Hinweis, wo er suchen soll. Der Text wird aber durch die umliegenden
Zeilen gefunden.

Es kann aber passieren, dass zwei verschiedene Patches benachbarte oder gar
gleiche Zeilen ändern. Dann gibt es auch eine bestimmte Reihenfolge beim
Patchen einzuhalten. Das sollte hier aber nicht der Fall sein.

Falls du ein ordentliches Patch-Management-System willst, kannst du auch zu
Programmen wie quilt oder Versionsverwaltungen wie git (bzw. stacked git)
greifen. Dies ist aber eher etwas Langfristiges und für dieses Beispiel wie
mit Kanonen auf Spatzen schießen.

> Nächster Versuch (Vorbehaltlich des write()-Tests):
>
> corStruct.R.diff:
>
> These strings need to be translated independently and it is possible to
> reduce these to a single string to reduce translators work.

"These"? Der Patch enthält nur eine Änderung. Da du bei drei gleichen
Strings nur zwei ändern wirst, solltest du vielleicht auch mit schreiben, wo
die dritte Zeichenkette sich versteckt, die du für OK hälst.

> nlme.R.diff:
> lme.R.diff:
>
> Patch fixes a grammatical error (missing "of")

In einem Patch kombinieren.

nlme.R.diff enthält zurzeit auch noch eine andere Änderung, die gehört in
einen separaten Patch.

> gnls.diff:
> Translation of multiple parts of a single string may be difficult.

Besser noch weiter erklären, z.B. an einem Beispiel. Das "may" würde ich
auch herausnehmen. Aktuell können die Zeichenketten mit Sicherheit nicht in
viele Sprachen übersetzt werden! Ich glaube, die Autoren wissen gar nichts
vom Problem. Schreibe z.B. das zurzeit jedes Argument von paste() unabhängig
von den anderen übersetzt wird (da ja eine Zeichenkette auch mehrfach an
verschiedenen Stellen im Programm unterschiedlich verwendet werden könnte).

Hier hast du etwas mit nlme.R.diff verwechselt?

Außerdem ist die Änderung in nlme.R gerade verkehrtherum (Quelle und Ziel
wurde bei diff-Aufruf vertauscht).

Patches sollten nicht nach Dateien benannt werden, sondern nach dem Inhalt.
Also: TypoFixes.diff, TranslationImprovements.diff, ...

Verstanden?

Jens


Reply to: