patchen...wie denn?

  • hallo!


    hier wird so selbstverständlich davon ausgegangen, dass jeder weiss, wie man einen patch installiert. kann mir das vielleicht trotzdem nochmal jemand erklären? ;)


    ich bin im vdr verzeichnis und würde gerne den epgsearch_progressbar_menu_whatson.c.diff anwenden.


    help!
    danke!

  • cat epgsearch_progressbar_menu_whatson.c.dif | patch -p1 --dry-run


    wenn ohne Fehler dann das --dry-run weglassen ....

    KODI, tvh, arch x86_64, Octopus net 2 x Duoflex C/C2/T2 , NUC7i3BNH, Crucial MX300 2TB, LG LM 669S

    Linux is the best OS I have ever seen -- Albert Einstein

  • mhh danke erstmal, jetzt bekomme ich folgende meldung...



    vdr:/usr/local/src/VDR # cat epgsearch_progressbar_menu_whatson.c.diff | patch -p1 --dry-run
    can't find file to patch at input line 3
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |--- ./menu_whatson.c~putchar 2004-12-29 14:33:25.000000000 +0100
    |+++ ./menu_whatson.c 2004-12-29 14:36:18.000000000 +0100
    --------------------------
    File to patch:





    Zitat

    Original von Monroe
    Klar, weil wir davon ausgehen, dass jeder dir FAQs gelesen hat, oder bei sowas konsultiert.


    habs versucht...leider gibt es kein globales faq wo drin steht, welches faq das richtige für das aktuelle problem ist. vertue ich mich? ;)


  • Probiers doch mal mit -p0

  • ...welches ist das richtige Verzeichnis?


    ...hab schon einiges selbst erarbeitet, aber das Patchen wird auf so abstraktem Niveau erläutert, daß ich echt nicht zum Erfolg komme.


    Vielleicht nimmt sich mal jemand beherzt der WIKI Seite "Patchen" an und begibt sich auf das Niveau von jemandem, der nicht weiß was


    Zitat

    Hier habe ich durch den -p1 Parameter den Pfad "graphlcd-0.0.7" abgeschnitten. Dies wäre nicht nötig gewesen wenn ich den Patch im übergeordneten Verzeichniss aufgerufen hätte (auf die Verzeichnissnamen achten!)


    konkret zu bedeuten hat. (¿Was bedeutet einen Pfad abschneiden und welche Folgen hat das?) Ich glaube ja, daß die "Erklärer" es gut und ernst meinen, aber ein Beispiel, das alles nur noch unverständlicher macht... :rolleyes:


    Was müssen denn für Pakete installiert sein, damit man "patchen" kann.


    PS: Ich bin am heulen, jaja ich weiß..:gemein

    Einmal editiert, zuletzt von rudibert ()

  • Ich bleibe mal bei dem in der FAQ angefangenen Beispiel.


    Dort steht in der diff-Datei:


    |diff -uN graphlcd-0.0.7/global.h graphlcd-0.0.8beta/global.h
    |--- graphlcd-0.0.7/global.h 2003-06-20 10:03:38.000000000 +0200
    |+++ graphlcd-0.0.8beta/global.h 2003-11-08 15:28:57.000000000 +0100


    das bedeutet, dass er versucht die datei graphlcd-0.0.7/global.h zu patchen.
    Du mußt also in $VDRPFAD/PLUGINS/src sein, da sonst dieses Unterverzeichnis nicht gefunden wird. Heißt es bei dir anders, z.b. "graphlcd-07" dann findet er es nicht. Aus diesem Grund geht man meist immer in das Verzeichnis das gepatcht werden soll also dein "graphlcd-07" oder wie auch immer es heißt und nutzt den -p - Schalter, dieser bewirkt, dass die ersten Pfadangaben ignoriert werden.
    Es braucht dich also nicht zu interessieren ob der Patchersteller es graphlcd-0.0.7 graphlcd oder graphlcd-entwicklung genannt hat, du sagst einfach "ignoriere einen Pfad: -p1"

  • Danke erstmal, Torsten -> hat ein wenig zum Verständnis beigetragen.


    .../plugins/src bedeutet ja wohl, daß ich die deb-src auch runterladen muß, oder anders gefragt: Patchen geht IMMER nur in den Sources? (Scripte müssten sich doch auch direkt patchen lassen, und wo ist dann das Standard Verzeichnis?):idee

  • Rein technisch kannst du alles patchen, also auch kompeliertes Zeugs.
    Allerdings wirst du das in der praxis quasi nie anfinden, denn durch die verschiedenen Systeme ergeben sich unterschiedliche Dateien wenn sie auch mit gleichem Sourcecode kompeliert werden, das liegt an verschiedenen gcc-versionen, verschiedenen Bibliotheken anderen Parametern etc.


    Im vdr-bereich sind alles nur patches für die Sourcen (oder scripte) also alles was Ascii-Code ist.



    Was genau meinst du mit Standartverzeichnis? Durch den Parameter -p[Zahl] kannst du es ja immer so hinbiegen, dass du einfach in das Verzeichnis gehst wo gepatcht wird, ob das nun
    /usr/src/vdr/PLUGINS/src/graphlcd oder /tim/buk/tu/lcd-plugin/ ist ist ihm vollkommen egal.

  • Ist ja alles scön und gut ...


    Aber ... es wird in der Faq nur gezeigt was man eintippen muß damit man patchen kann.


    Was ist bei Hunks bzw. rejects ...


    Ich habs selber beim NoEPG für 1.3.21 gehabt und hab versucht in der Wiki bzw. im Portal ne Lösung fürs manuelle patchen zu finden, bin aber nicht fündig geworden.


    Kann nicht mal bitte jemand der etwas von der Sache versteht mal DEUTLICH an Beispielen erklären (bzw. FAQ oder Wiki) wir so ein diff-File aufgebaut ist, was es will und was es soll , wofür die einzelnen Zahlen stehen .... u.u.u.


    Braucht ja kein Roman zu sein, kurze Beispiele die andeuten was gemeint ist reichen ja ... (vorher --> Befehl --> nachher).


    Da man ja relativ viel patchen ""muss"" wäre das bestimmt für viele hilfreich ... vor allem wenns mal nicht auf Anhieb klappt, weil man schon 3 patches eingespielt hat und der 4te jetzt rumzickt ...


    MFG
    Marco

    Leider momentan kein VDR

    Einmal editiert, zuletzt von mbc ()

  • ..verzeihung Torsten, aber ich hatte ja angedeutet, daß ich verwirrt bin durch die Erläuterungen:


    Zitat

    Hierbei anzumerken ist auch noch, dass es vollkommen egal ist wo die Datei liegt. Man muß sie also nicht immer ins aktuelle Verzeichnis hineinkopieren, sondern man gibt den Pfad einfach mit an.
    Allgemein gilt also:
    entpacker ParameterFürStandardausgabe pfad/patchdatei | patch -p1


    Standardausgabe ist das Terminal --->gut soweit klar, aber worauf bezieht sich aktuelles Verzeichnis??????


    Aktuell???

    --->von heute? oder
    --->da wo ich das letzte mal jemanden getroffen habe? :prost2 oder
    --->"find / aktuell"? :rolleyes:


    ...is ehrlich nicht bös gemeint, aber mein Eindruck ist, daß sich das Patchen einigen Leuten nicht intuitiv erschließt.


    Wenn ich mit dpkg etwas installiere, kann ich mich auf / befinden und muß selbstverständlich den Pfad zum Installationsfile angeben, aber ich muß ihm nicht sagen, wohin das Paket installiert werden muß, oder "p-sonstwas eingeben" um Verzeichnisse abzuschneiden. So entfällt auch die Sorge durchs abschneiden etwas zu patchen, was gar nicht zu patchen wäre wegen falscher Version.


    Beispiel: Ich würde gern VDRADMIN dahingehend patchen, daß er EPG_DIRECT beherrscht, aber es gibt nur einen Patch für 0.94. Da ich mit meinem 0.96 nach einigen Einstellungen nun aber ganz zufrieden bin, möchte ich nicht wieder auf die vorherige Version zurück...nur für den Patch! Also wie komme ich jetzt zu der Sicherheit, daß der Patch auch bei 0.96 keinen Schaden anrichtet, und auf welches Verzeichnis muß mein cat-Befehl zeigen, wenn ich alle meine Patches in

    Zitat

    /usr/src/<verzeichnisnamedespatches>


    sammle.


    Zum Verständnis des Unverständnisses:
    VDRADMIN hat ja einige Verzeichnisse in denen sich etwas befindet, oder die es in seinem perl-sript text in variablen beschreibt oder aufruft--->aktuelles Verzeichnis ist also für den leidgeplagten Patchunkundigen der Horror:vader


    ..in der Hoffnung auf Gnade, Selbstbeherrschung und Nachsicht verbleibt..:angst

    4 Mal editiert, zuletzt von rudibert ()

  • print work directory...gut das war mir bekannt, schweift aber dolle von der Fragestellung ab :(

    3 Mal editiert, zuletzt von rudibert ()

  • Ok Marco,
    ich habe es einmal versucht, aber nicht schlagen wenn es daneben oder unverständlich ist.
    --
    Patchen für Dummies
    (in Anlehnung an die bekannte Buchreihe)


    Was ist ein Patch?
    Ein Patch (oder auch diff-Datei genann) ist nichts anderes als eine Differenzmenge zwischen 2 Dateien. Im vdr-Bereich sind diese Dateien zu 99,99% Textdateien wie z.B. Scripte oder Quellcodes.
    Da man bei unterschieden ja auch dokumentieren muß was wo unterschiedlich ist enthält die Datei ein paar Steuerinformationen, so reicht es nicht zu sagen "Datei 10 wurde gelöscht" wenn man gar nicht dazu sagt ob in der alten oder in der neuen Datei, apropos Datei, der Patch enthält außerdem eine Information um welche Datei es überhaupt geht.


    Wie ist ein Patch aufgebaut?


    Nehmen wir an wir haben eine fiktive Datei D1:

    Code
    Zeile 1
    Zeile 2
    Zeile 3
    Zeile 4
    Zeile 5


    Und fiktive Datei D2:

    Code
    Zeile 1
    Zeile 2
    Zeile 3 neu
    Zeile 4
    Zeile 5


    dann ergäbe das eine Patchdatei mit dem Inhalt:

    Diff
    --- D1  2005-02-21 18:44:01.000000000 +0100
    +++ D2  2005-02-21 18:44:40.000000000 +0100
    @@ -1,5 +1,5 @@
     Zeile 1
     Zeile 2
    -Zeile 3
    +Zeile 3 neu
     Zeile 4
     Zeile 5


    Als erstes gibt es nformationen welche Datein betroffen sind, die ausgangsdatei (--- -Zeile) und die Zieldatei (+++ -Zeile).
    Außerdem gibt es eine Angabe "@@ -1,5 +1,5 @@" dieses heißt soviel wie "irgendwo bei der 5. Zeile ist was unterschiedlich" das patchprogramm weiß also später in welche Zeile es erst einmal springen muß.
    Weiterhin gibt es nun Zeilen mit + und mit -, das ist ... genau ... das was getan wird. Es wird nach einer Zeile mit dem inhalt "Zeile 3" gesucht und diese gelöscht, dann wird eine Zeile mit dem Inhalt "Zeile 3 neu" eingefügt.


    Das Patchprogramm bekommt also nun Informationen wo was wodurch ersetzt werden soll.


    Soviel zur Information was eigentlich ein Patch ist und wie er aufgebaut ist.


    Nun geht es weiter.


    Wie liegt ein Patch vor?


    Ein Patch kann auf mehrere Arten vorliegen.
    a) als gepackte Datei
    b) als ungepackte Datei
    c) als Archiv mit mehreren gepackten Dateien


    Beispiele:


    a) patch.gz, patch.diff.gz, patch.diff.bz2
    b) patch.diff, patch.patch
    c) patch.tgz, patch.tar.bz2, patch.zip


    Die Namen sind frei wählbar, man erkennt aber meist sehr schnell worum es sich handelt, mehr Informationen dazu gibt es gleich noch.


    Bitte was? "mehrere gepackte Dateien"? Was das sein soll? Die Erklärung ist ganz einfach. Stellt euch vor ihr wollt ein Programm mit 100 Dateien patchen und jeder patch wäre eine einzelne Datei. Beim Patchrstellen würdet ihr irre werden und der der die Patches einspielen muß ebenfalls.
    Daher kommen Patches öfters in der Variante c) vor, da sind dann intern mehrere Patch-Dateien enthalten, aber für das einspielen ändert das gar nix, man merkt davon nicht einmal etwas.


    Wie spielt man einen Patch ein?


    Kurz:
    Man übergibt ihn an das Programm "patch".


    Ausführlich:
    Das Programm "patch" dient zum einspielen der Patches, dazu muß man dem Programm sagen wo der Patch zu finden ist, also z.B.:
    torsten@torstenpc:/tmp > patch < /irgendwo/in/dem/verzeichnisbaum/liegt/diese/datei.diff
    schon legt er los.
    Er versucht nun im aktuellen Verzeichnis, in diesem Fall also "/tmp" eine Datei namens D1 zu finden um sie zu patchen (ich nehme die Beispiele von oben weiterhin).
    Bei mir geht das, denn ich habe die Datei dort angelegt, doch würde ich mich im verzeichnis "/freigabe" befinden, dann gäbe es einen fehler:

    Code
    torsten@torstenpc:/freigabe > patch < /tmp/patch.diff
    can't find file to patch at input line 3
    Perhaps you should have used the -p or --strip option?
    The text leading up to this was:
    --------------------------
    |--- D1 2005-02-21 18:44:01.000000000 +0100
    |+++ D2 2005-02-21 18:44:40.000000000 +0100
    -------------------------
    File to patch:


    Gesundheit.
    Die entscheidenden Informationen stehen hier:
    can't find file to patch at input line 3
    er kann eine Datei aus dem Patch nicht finden. Dieses ist meist ein Zeichen dafür, dass man sich in einem falschen Verzeichnis befindet.
    Doch es kann auch etwas anderes sein, er deutet es schon an:
    Perhaps you should have used the -p or --strip option?
    Was soll das heißen?
    Die Erklärung ist auch hier sehr einfach wenn man es einmal verstanden hat :)


    Nehmen wir an meine Dateien sind über viele Unterverzeichnisse verteilt, dann würde ich ja kirre werden, wenn ich in jedes Unterverzeichnis gehen müßte um die zu analyiseren. Daher versteht die Patchdatei auch Verzeichnisse, nun könnte meine Datei anfangen mit:
    |--- tmp/D1 2005-02-21 18:44:01.000000000 +0100
    |+++ tmp/D2 2005-02-21 18:44:40.000000000 +0100
    Er würde also die Dateien IMMER im Unterverzeichnis "./tmp" suchen, aktuell also in /freigabe/tmp.
    Es geht zu schnell, ich merks :)
    Situation:
    Ich bin in: /freigabe
    der Patch sucht in: ./tmp
    der Patch sucht nach: D1
    Also sucht der Patch nach /freigabe/tmp/D1
    Diese Datei habe ich gar nicht, es gibt bei mit in /freigabe noch nicht einmal ein Unterverzeichnis names "tmp", allerdings habe ich meine Datei schon nach "/freigabe" kopiert.
    Ich bin in: /freigabe
    der Patch sucht in: ./tmp
    der Patch sucht nach: D1
    Ich habe: /freigabe/D1


    Ich kann also:
    a) ein Verzeichnis tmp anlegen und die Datei reinkopieren
    b) dem Patcher sagen: "Hey du depp, ignoriere einfach mal dein erstes Verzeichnis"


    Man wird a) nie machen, denn b) ist die Lösung der Wahl, genau das ist der "-p1" Parameter.
    -p1 schneidet ein Verzeichnis weg -p2 zwei Verzeichnisse etc.


    Ich kann also in /freigabe bleiben und meinen patch mit:
    patch -p1 < /tmp/patch.diff
    einspielen.


    Nun ein paat Worte zu den Archiven also den Patchvorkommen a) und c) von oben.
    Statt "patch < /tmp/patch" könnte ich auch schreiben "cat /tmp/patch.diff|patch" also den Inhalt an patch "pipen", das ist technisch quasi dasselbe in diesem Fall.
    Das Programm "patch" kann nur ascii-Dateien also entpackte verstehen. Man kann nun
    a) die Archive auspacken und einzeln patchen
    b) einem Programm diese Arbeit machen lassen
    Naja :) Keine Worte oder?
    Nehmen wir b), das geht ganze einfach.
    Für die gängigen Formate wie "tgz/tar.gz" und "gz" und auch "bz2" gibt es cat-Ableger, diese heißen einfach:
    zcat, bzcat
    einfach das entsprechende benutzen:
    zcat /tmp/patch.diff.gz|patch
    fertig.


    Was kann beim Patchen passieren?
    Eigentlich "nur" 3 Dinge.
    a) nix :)
    b) Hunks
    c) Rejects


    Passiert nix, dann ist alles ok, der Patchvorgang schaut etwa so aus:
    torsten@torstenpc:/tmp > patch < patch.diff
    patching file D1
    torsten@torstenpc:/tmp >


    fertig.


    Hunks sind kleine Mißstände, die Patch aber korrigierenkann, sie sehen so aus:
    torsten@torstenpc:/tmp > patch < patch.diff
    patching file D1
    Hunk #1 succeeded at 2 (offset 1 line).
    torsten@torstenpc:/tmp >


    Das heißt nix anderes als dass er einen Hunk hatte (#Nummer zählt er hoch) und zwar mußte er eine Patchzeile um 1 Zeile verschieben.
    Was war passiert?
    Meine D1 war nichtmehr so wie oben, sondern war nun:

    Code
    Zeile 0
    Zeile 1
    Zeile 2
    Zeile 3
    Zeile 4
    Zeile 5


    also eine Zeile mehr in der Gegend wo er patchen muß, er hat sich also gewundert und nochmal genauer hingeschaut, hat seine "Zeile 3" gefunden die er ersetzen soll und munter weitergemacht.
    Hunks sind im normalfall genauso wie "nix" solange alles läuft einfach ignorieren, sie treten sehr schnell auf sobald mal irgendwo eine Dokumentarzeile eingefügt wurde oder ähnliches.


    Kommen wir zu den Rejects.
    Unsere neue Datei D1:

    Code
    Zeile 1
    Zeile 2
    Zeile 4
    Zeile 5


    Unsere Zeile "Zeile 3" fehlt also, genau das wo er patchen soll:
    das schaut so aus:


    torsten@torstenpc:/tmp > patch < patch.diff
    patching file D1
    Hunk #1 FAILED at 1.
    1 out of 1 hunk FAILED -- saving rejects to file D1.rej


    igitt.
    Aber er sagt ja: "saving rejects to file D1.rej"
    Also schauen wir da mal rein:


    nix neues, er sagt nur noch einmal was er machen sollte, nämlich "Zeile 3" löschen und durch "Zeile 3 neu" ersetzen, gibts nur nichtmehr, also bringt er einen Fehler.


    In diesem Fall muß man fachlich tätig werden, man muß schauen was hier geändert wurde, denn es könnte ja auch etwas anderes sein, nämlich sowas:


    Unsere neue Datei D1:

    Code
    Zeile 1
    Zeile 2
    Zeile 3 alt
    Zeile 4
    Zeile 5


    also statt "Zeile 3" der String "Zeile 3 alt" auch das findet er nicht, die Fehlermeldung ist absolut dieselbe wie oben, man muß also im Detail schauen was hier los ist. In den meisten fällen wurden nur Leerzeichen eingefügt (er würde bei " Zeile 3" auch abbrechen) oder es wurden Parameter in den Methoden geändert, oder halt sogar der komplette block neu geschrieben. Wie gesagt, pautschalisieren kann man hier nicht, da muß man genauer reinschauen was da los ist. Man kann sich da aber mit ein wenig Zeit gut einlesen, denn man weiß ja nun wo was wodurch ersetzt werden soll.


    Ich hoffe das hilft ein wenig durch das Land der Patches durchzublicken...

  • Jauuu .... danke Thorsten ...


    Ich muß mir zwar erstmal nen Tee machen um das ganze in Ruhe durchzulesen, aber vom überfliegen her ist es GENAU SO wie ich es mir als "noobfreundliche Erklärung" vorstelle ...


    Eine wirklich sehr gute Beschreibung, ich denke mal nicht das da noch Fragen offen bleiben.


    Das mit den BEispieldateien hate ich hier auch schon in einem anderen Thread gefunden (war glaube ich auch von Dir), aber ne "verständliche" Erklärung gabs da nicht zu ... von daher war der Thread nicht sehr hilfreich ...


    Ich hoffe dieser hier kommt in die FAQ ...


    So kann jeder auch mal selber eben nen diff schreiben ... ich habs wie gesagt beim noepg-patch machen müsen, weil der original nicht funktionierte ...


    BTW ...


    Zitat

    @@ -1,5 +1,5 @@


    Was bedeutet denn da dann die "1," ??
    "-" und "+" sind klar und die "5" gibt in etwas die Zeile an, nur was macht die "1," ??


    Das wäre noch so ausm stehgreif jetzt noch unklar für mich ... Ist das ne Art Nummerierung (wenn da mehrere Stellen gepatched werden), oder nur einfach die Anzahl der Zeilen die "betroffen" sind ?


    MFG und VIELEN DANK nochmals für die mehr als Ausführliche Erklärung.


    Wenn mehr Leute so Noob-freundlich schreiben würden, würden sich wohl mehr Anfänger damit beschäftigen, weil man wenisgteens versteht was man da liest und dann macht es auch Spaß mal etwas zu probieren.


    Marco

    Leider momentan kein VDR

    Einmal editiert, zuletzt von mbc ()

  • ...Hut ab!!!! und ganz tief runter zum Diener machen:hat3


    :respekt :respekt :respekt :respekt


    stimme MBC vorbehaltlos zu:


    DAS sollte archiviert werden; zum ganz leicht wiederfinden und als leuchtendes:cylon Beispiel :engel1 :applaus


    ..wer uns Rabauken derart ernst nimmt, der gehört wirklich geknuddelt:streichel


    ...Hoffe Du hast da jemanden dafür, Torsten #Hihihi:lachen1


    PS: mbc,mein Tip ist, das die erste Zahl sagt, von wo aus er los zählen soll, und die Zweite gibt den Zeilenumfang an (Zeilenumfang, oh mann :rolleyes:, aber mir fällt kein besseres Wort ein) Wenn der zu ändernde script Teil also bei Zeile 287 losgeht und der zu ändernde Teil sich in den nächsten 6 Zeilen abspieltl: -287,6 +287,6.
    Es können sich in den nächsten 6 Zeilen aber auch 14 Zeilen ändern, wenn nämlich neue dazukommen (wie meistens!!)
    ---> dann heißts: -287,6 +287,14 - so kann man sicher stellen, daß auch wirklich der richtige Sriptteil geändert wird und nicht eine Zeile die zufällig gleich anfängt, aber dann ganz anders weitergeht.

    8 Mal editiert, zuletzt von rudibert ()

  • :) So stell ich mir ein Portal vor, echt suppa.
    Hatte mich gedanklich schon von hier verabschiedet, nach dem zu jedem Problem das man als Neubi hat und sich die Augen schon mal rot gelesen hat erstmal :suche als Antwort bekommt, ignoriert wird oder ein paar dumpfbackige Antworten :gaga bekommt.
    Auch wenns mich grad nicht betrifft, der Thread ist mal wieder Gold wert (Ich lass das mit dem patchen da bei mir die Verschrottungrate dadurch sehr hoch ist) :D
    Aber nach dem Thread könnt ich mich glatt mal weider trauen....


    Gebt mir einen Patch:ghost

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!