Patches
(→Wie liegt ein Patch vor?) |
Mitchm (Diskussion | Beiträge) (→Liste) |
||
(98 dazwischenliegende Versionen von 39 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
==Beschreibung== | ==Beschreibung== | ||
− | Ein '''Patch''' ist eine Änderung am Original-[[Quelltext]] eines Programms. In der Patch-Datei befinden sich nur die geänderten Anweisungen und Kommentare darüber, wie diese in den Quelltext eingepflegt werden müssen. Sie bezieht sich immer auf eine bestimmte Version der Originaldatei. | + | [[Image:patches.jpg|left]] Ein '''Patch''' ist eine Änderung am Original-[[Quelltext]] eines Programms. In der Patch-Datei befinden sich nur die geänderten Anweisungen und Kommentare darüber, wie diese in den Quelltext eingepflegt werden müssen. Sie bezieht sich immer auf eine bestimmte Version der Originaldatei. |
Nach dem Einspielen eines Patches ist der Quelltext neu zu übersetzen. | Nach dem Einspielen eines Patches ist der Quelltext neu zu übersetzen. | ||
Zeile 10: | Zeile 10: | ||
==Liste== | ==Liste== | ||
{{TOC}} | {{TOC}} | ||
− | {| | + | {| width="100%" class="wikitable" |
− | |- | + | |- |
− | + | ! Patch | |
− | + | ! Beschreibung | |
+ | ! Status | ||
|-id="A" | |-id="A" | ||
− | | [[ac3overdvb-patch| | + | | [[ac3overdvb-patch|AC3 over DVB]] |
| Aktiviert den digitalen Ausgang der [[DVB-Karte]] | | Aktiviert den digitalen Ausgang der [[DVB-Karte]] | ||
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.3.18 | ||
|- | |- | ||
− | | [[ac3switch-patch| | + | | [[ac3switch-patch|AC3 Switch]] |
− | | Erlaubt das | + | | Erlaubt das An/Abschalten von [[Dolby Digital]] |
+ | |style="background-color:#F00" | Letzte Version für VDR Version 1.3.17 | ||
|- | |- | ||
− | | [[ | + | | [[Alternative_channel-patch|Alternative Channel]] |
− | | | + | | Verbesserungen für [[Mischsysteme]] mit verschiedenen Eingabequellen |
+ | |style="background-color:#0F0" | | ||
+ | |- | ||
+ | | [[Audioindexer]] | ||
+ | | Korrektur bei der Erstellung der index.vdr für Radioaufnahmen | ||
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.7.5 | ||
|-id="B" | |-id="B" | ||
| [[bigpatch-patch|Big Patch]] | | [[bigpatch-patch|Big Patch]] | ||
| Sammlung von mehreren Patches | | Sammlung von mehreren Patches | ||
− | |-id="C" | + | |style="background-color:#F00" | Abgelöst durch den [[Extensions-Patch|Extensionpatch]] |
+ | |-id="C" | ||
+ | | [[Channelbinding-patch|Channel Binding]] | ||
+ | | Erlaubt die Zuordnung von Kanälen der channels.conf zu DVB-Karten per Radio-ID | ||
+ | |style="background-color:#0F0" | | ||
+ | |- | ||
+ | | [[channelfilter-patch|Channel Filter]] | ||
+ | | Einträge in der Kanalliste filtern. | ||
+ | |style="background-color:#FF0" | Unbekannt | ||
+ | |- | ||
| [[cmdsubmenu-patch|Cmd Submenu]] | | [[cmdsubmenu-patch|Cmd Submenu]] | ||
| Untermenüs für das Befehle-Menü | | Untermenüs für das Befehle-Menü | ||
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.7.12 | ||
|- | |- | ||
| [[cutterbandwithlimit-patch|Cutter Bandwith Limit]] | | [[cutterbandwithlimit-patch|Cutter Bandwith Limit]] | ||
| Verbessert die Reaktionszeit von VDR während des Schneidens. | | Verbessert die Reaktionszeit von VDR während des Schneidens. | ||
+ | |style="background-color:#F00" | Gleiche Funktion im [[Extrecmenu-plugin]] | ||
|- | |- | ||
| [[cutterqueue-patch|Cutter Queue]] | | [[cutterqueue-patch|Cutter Queue]] | ||
| Schnitte in Warteschleife abarbeiten | | Schnitte in Warteschleife abarbeiten | ||
+ | |style="background-color:#F00" | Gleiche Funktion im [[Extrecmenu-plugin]] | ||
+ | |- | ||
+ | | [[Cuttime-patch|Cuttime]] | ||
+ | | Aufnahmezeit beim Schneiden anpassen | ||
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.7.21 | ||
|-id="D" | |-id="D" | ||
| [[disabledoubleepgentrys-patch|Disable Double Epg Entrys]] | | [[disabledoubleepgentrys-patch|Disable Double Epg Entrys]] | ||
− | | Entfernt doppelte [[EPG]]- | + | | Entfernt doppelte [[EPG]]-Einträge |
+ | |style="background-color:#FF0" | Unbekannt | ||
|- | |- | ||
| [[dvdarchive-patch|Dvd Archive]] | | [[dvdarchive-patch|Dvd Archive]] | ||
| Archiviert Aufnahmen über eindeutige Nummern | | Archiviert Aufnahmen über eindeutige Nummern | ||
+ | |style="background-color:#F00" | Gleiche Funktion im [[Extrecmenu-plugin]] | ||
|-id="E" | |-id="E" | ||
− | | [[ | + | | [[erg-patch|ERG]] |
− | | | + | | (E)lectronic (R)ecording (G)uide |
+ | |style="background-color:#FF0" | Unbekannt | ||
|- | |- | ||
− | | [[ | + | | [[Extensions-Patch|Extensions Patch]] |
− | | | + | | Sammlung von mehreren Patches |
+ | |style="background-color:#FF0" | Unbekannt | ||
+ | |-id="H" | ||
+ | | [[Freesat-patch|Freesat]] | ||
+ | | Erweitert den Programmführer um Huffman-komprimierte Zeichenketten, wie sie typischerweise im Freesat Paket auf Astra2 versendet werden. | ||
+ | |style="background-color:#0F0" | | ||
|- | |- | ||
− | | [[ | + | | [[HLCutter-patch| HardLinkCutter]] |
− | | | + | | Neues Schnittverfahren mittels HardLinks im Dateisystem |
+ | |style="background-color:#F00" | Nicht mehr anwendbar | ||
|-id="J" | |-id="J" | ||
| [[jumpplay-patch|Jump Play]] | | [[jumpplay-patch|Jump Play]] | ||
− | | Automatisches Überspringen von Aufnahmeteilen anhand von Schnittmarken | + | | Automatisches Überspringen von Aufnahmeteilen anhand von Schnittmarken bei der Wiedergabe |
+ | |style="background-color:#0F0" | | ||
|- | |- | ||
| [[jumpingseconds-patch|Jumping Seconds]] | | [[jumpingseconds-patch|Jumping Seconds]] | ||
− | | Sprungweite für schnelles Vorspulen per Farbtasten ändern | + | | Sprungweite für schnelles Vorspulen (per Farbtasten) ändern |
+ | |style="background-color:#FF0" | Unbekannt | ||
|-id="K" | |-id="K" | ||
| [[keymacrosforhiddenplugins-patch|Keymacros For Hidden Plugins]] | | [[keymacrosforhiddenplugins-patch|Keymacros For Hidden Plugins]] | ||
| Macht versteckte Hauptmenüeintrage wieder über Hotkeys verfügbar | | Macht versteckte Hauptmenüeintrage wieder über Hotkeys verfügbar | ||
+ | |style="background-color:#F00" | Problem im aktuellen VDR nicht nachvollziehbar | ||
|-id="L" | |-id="L" | ||
+ | | [[liemikuutio-patch|Liemikuutio]] | ||
+ | | Der finnische all-in-one-Patch | ||
+ | |style="background-color:#0F0" | | ||
+ | |- | ||
| [[livebuffer-patch|Livebuffer]] | | [[livebuffer-patch|Livebuffer]] | ||
| Patch mit dem ständig das aufgenommen wird, was man gerade sieht | | Patch mit dem ständig das aufgenommen wird, was man gerade sieht | ||
+ | |style="background-color:#0F0" | | ||
|- | |- | ||
| [[lnbsharing-patch|Lnb Sharing]] | | [[lnbsharing-patch|Lnb Sharing]] | ||
| Eine Satellitenleitung zwischen mehreren DVB Karten teilen | | Eine Satellitenleitung zwischen mehreren DVB Karten teilen | ||
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.7.22 | ||
|- | |- | ||
| [[localchannelprovide-patch|Local Channel Provide]] | | [[localchannelprovide-patch|Local Channel Provide]] | ||
− | | | + | | Ermöglicht Streaming-Clients mit FF-Karte den Betrieb nur mit Streaming-Server ohne lokale Tuner |
+ | |style="background-color:#F00" | Das [[Dvbsddevice-plugin]] kennt seit Version 1.7.25 den Parameter "--outputonly" | ||
|-id="M" | |-id="M" | ||
+ | | [[mainmenuhooks-patch|Main Menu Hooks]] | ||
+ | | Erlaubt es Plugins Hauptmenüeinträge des VDR zu überschreiben | ||
+ | |style="background-color:#0F0" | | ||
+ | |- | ||
| [[memorynoepgcxflags-patch|Memory No Epg Cxflags]] | | [[memorynoepgcxflags-patch|Memory No Epg Cxflags]] | ||
− | | Deaktiviert den EPG-Scan und gibt Speicher frei (nur [[ | + | | Deaktiviert den EPG-Scan und gibt Speicher frei (nur [[FF-Karten Speichererweiterung|4MB]]) |
+ | |style="background-color:#F00" | Letzte Version für VDR Version 1.3.15 | ||
|- | |- | ||
| [[menuselection-patch|Menu Selection]] | | [[menuselection-patch|Menu Selection]] | ||
− | | | + | | Ermöglicht, dass Menüeinträge >10 per Zahlentasten aufrufbar sind. |
− | |- | + | |style="background-color:#0F0" | |
− | | | + | |
− | + | ||
|- | |- | ||
| [[mini-patch|Mini]] | | [[mini-patch|Mini]] | ||
− | | | + | | Ermöglicht das Erstellen von ZapTimern |
+ | |style="background-color:#F00" | Gleiche Funktion im [[Epgsearch-plugin]] | ||
|- | |- | ||
| [[missingplugin-patch|Missing Plugin]] | | [[missingplugin-patch|Missing Plugin]] | ||
− | | Startet VDR trotz | + | | Startet VDR trotz fehlendem Plugin |
+ | |style="background-color:#FF0" | Unbekannt | ||
|-id="N" | |-id="N" | ||
| [[noepg-patch|No Epg]] | | [[noepg-patch|No Epg]] | ||
| Verwendung externer EPG-Daten für bestimmte Sender | | Verwendung externer EPG-Daten für bestimmte Sender | ||
+ | |style="background-color:#F00" | Gleiche Funktion im [[Epgsearch-plugin]] | ||
|- | |- | ||
| [[nrkbd-patch|Nrkbd]] | | [[nrkbd-patch|Nrkbd]] | ||
| Verbesserte Texteingabe | | Verbesserte Texteingabe | ||
+ | |style="background-color:#FF0" | Unbekannt | ||
|-id="O" | |-id="O" | ||
| [[onlypid-patch|Onlypid]] | | [[onlypid-patch|Onlypid]] | ||
| Option, um ausschließlich die PIDs der Sender zu aktualisieren | | Option, um ausschließlich die PIDs der Sender zu aktualisieren | ||
− | | | + | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.3.47 |
− | + | ||
− | | | + | |
|-id="R" | |-id="R" | ||
+ | | [[realdeletedlifetime-patch|Real Deleted Lifetime]] | ||
+ | | Option, um die Zeit zwischen als gelöscht markiert und gelöscht zu verkürzen | ||
+ | |style="background-color:#FF0" | Unbekannt | ||
+ | |- | ||
| [[reccount-patch|Rec Count]] | | [[reccount-patch|Rec Count]] | ||
− | | | + | | Gibt die Anzahl der im Moment laufenden Aufnahmen an ein Skript weiter. |
+ | |style="background-color:#FF0" | Unbekannt | ||
|- | |- | ||
| [[recordac3selectable-patch|Record AC3 Selectable]] | | [[recordac3selectable-patch|Record AC3 Selectable]] | ||
− | | | + | | Ermöglicht es festzulegen, ob Dolby Digital mit aufgezeichnet wird. |
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.0.0pre1, wieder entfernt seit Version 1.7.13 | ||
|- | |- | ||
| [[recordinglength-patch|Recording Length]] | | [[recordinglength-patch|Recording Length]] | ||
− | | | + | | Zeigt die Aufnahmenlänge und Anderes im Aufnahmenmenü |
+ | |style="background-color:#F00" | Gleiche Funktion im [[Extrecmenu-plugin]] | ||
|- | |- | ||
| [[renamerecordings-patch|Rename Recordings]] | | [[renamerecordings-patch|Rename Recordings]] | ||
− | | | + | | Ermöglicht das Umbenennen von Aufnahmen |
+ | |style="background-color:#F00" | Gleiche Funktion im [[Extrecmenu-plugin]] | ||
|-id="S" | |-id="S" | ||
| [[settime-patch|Settime]] | | [[settime-patch|Settime]] | ||
− | | stellt Uhrzeit anhand der EPG-Daten, ohne daß | + | | stellt Uhrzeit anhand der EPG-Daten, ohne daß VDR als root laufen muß |
− | |- | + | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version ??? |
− | | | + | |
− | + | ||
|- | |- | ||
| [[showdetails-patch|ShowDetails]] | | [[showdetails-patch|ShowDetails]] | ||
− | | | + | | fügt einen Hauptmenüeintrag hinzu, über den die EPG-Infos angezeigt werden können. |
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.5.12 (Info-Taste) | ||
+ | |- | ||
+ | | [[shutdown-rewrite-patch|Shutdown-rewrite]] | ||
+ | | Verbessertes Shutdown-Handling | ||
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.5.2 | ||
+ | |- | ||
+ | | [[showvalidinput-patch|Show Valid Input]] | ||
+ | | fügt bei Setupeingaben ein "<" vor dem Wert ein, falls ein kleinerer Wert existiert, dito für ">" | ||
+ | |style="background-color:#0F0" | | ||
|- | |- | ||
| [[showweekdays-patch|Show Weekdays]] | | [[showweekdays-patch|Show Weekdays]] | ||
− | | | + | | Zeigt den Wochentag im Timer-Menü an |
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.3.8 | ||
|- | |- | ||
| [[skipdoubleepg-patch|SkipDoubleEPG]] | | [[skipdoubleepg-patch|SkipDoubleEPG]] | ||
− | | entfernt doppelte | + | | entfernt doppelte EPG-Einträge |
+ | |style="background-color:#FF0" | Unbekannt | ||
+ | |- | ||
+ | | [[softosd-patch|SoftOSD]] | ||
+ | | Blendet das OSD der SD-Full-Featured "sanft" ein und aus | ||
+ | |style="background-color:#F00" | Nicht mehr kompatibel mit dem VDR seit Version 1.7.11 | ||
|- | |- | ||
| [[sortrec-patch|Sortrec]] | | [[sortrec-patch|Sortrec]] | ||
− | | | + | | Ermöglicht es die Aufnahmen im Aufzeichnungsmenü zu sortieren |
+ | |style="background-color:#F00" | Gleiche Funktion im [[Extrecmenu-plugin]] | ||
|- | |- | ||
| [[sourcecaps-patch|Source Caps]] | | [[sourcecaps-patch|Source Caps]] | ||
− | | | + | | Zuordnung von Karten zu empfangbaren Satellitenpositionen |
− | |- | + | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.7.13 |
− | | | + | |
− | + | ||
|- | |- | ||
| [[svdrprename-patch|Svdrp Rename]] | | [[svdrprename-patch|Svdrp Rename]] | ||
− | | Aufnahmen mittels [[ | + | | Aufnahmen mittels [[SVDRP]] umbenennen |
+ | |style="background-color:#F00" | Ähnliche Funktion im VDR seit Version 2.1.3 | ||
|- | |- | ||
| [[switchtimer-patch|Switch Timer]] | | [[switchtimer-patch|Switch Timer]] | ||
| Aktion bei Timern ''umschalten'' | | Aktion bei Timern ''umschalten'' | ||
+ | |style="background-color:#F00" | Gleiche Funktion im [[Epgsearch-plugin]] | ||
|-id="T" | |-id="T" | ||
| [[timercmds-patch|Timer Commands]] | | [[timercmds-patch|Timer Commands]] | ||
| Erweitert das Timer-Menü um Kommandos | | Erweitert das Timer-Menü um Kommandos | ||
+ | |style="background-color:#FF0" | Unbekannt | ||
|- | |- | ||
| [[timerinfo-patch|Timer Info]] | | [[timerinfo-patch|Timer Info]] | ||
− | | | + | | Zeigt an, ob der Timer noch auf die Festplatte passt |
+ | |style="background-color:#FF0" | Unbekannt | ||
|-id="U" | |-id="U" | ||
− | | [[ | + | | [[unicable-patch|Unicable]] |
− | | Erweiterte ''Internationalisierung'' | + | | Erweiterung zum Betrieb eines VDRs an einer Einkabel-Matrix nach Unicable bzw. EN59494 Standard |
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.7.22 | ||
+ | |- | ||
+ | | [[utf8-patch|UTF8]] | ||
+ | | Erweiterte ''Internationalisierung'' / Freetype fonts | ||
+ | |style="background-color:#F00" | Gleiche Funktion im VDR seit Version 1.5.3 | ||
|-id="W" | |-id="W" | ||
| [[wareagleicon-patch|War Eagle Icon]] | | [[wareagleicon-patch|War Eagle Icon]] | ||
− | | Ein paar Icons | + | | Ein paar Icons zur Verschönerung |
+ | |style="background-color:#FF0" | Unbekannt | ||
|-id="Z" | |-id="Z" | ||
| [[zap-patch|Zap]] | | [[zap-patch|Zap]] | ||
| Ausgewählte Sendungen beim Zappen überspringen | | Ausgewählte Sendungen beim Zappen überspringen | ||
+ | |style="background-color:#F00" | Gleiche Funktion im [[Block-plugin]] | ||
|} | |} | ||
Zeile 157: | Zeile 236: | ||
Was ist ein Patch? | Was ist ein Patch? | ||
Ein Patch (oder auch diff-Datei genannt) 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. | Ein Patch (oder auch diff-Datei genannt) 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 "Zeile 10 wurde gelöscht", wenn man gar nicht dazu sagt, ob in der alten oder in der neuen Datei. | + | 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 "Zeile 10 wurde gelöscht", wenn man gar nicht dazu sagt, ob in der alten oder in der neuen Datei. A propos Datei, der Patch enthält außerdem Informationen, um welche Dateien es überhaupt geht. |
=== Wie ist ein Patch aufgebaut? === | === Wie ist ein Patch aufgebaut? === | ||
− | Nehmen wir an wir haben eine fiktive Datei D1 | + | Nehmen wir an, wir haben eine fiktive Datei D1: |
− | + | ||
− | + | ||
1.Zeile 1 | 1.Zeile 1 | ||
2.Zeile 2 | 2.Zeile 2 | ||
Zeile 171: | Zeile 248: | ||
Und fiktive Datei D2: | Und fiktive Datei D2: | ||
− | |||
− | |||
1. Zeile 1 | 1. Zeile 1 | ||
2. Zeile 2 | 2. Zeile 2 | ||
Zeile 179: | Zeile 254: | ||
5. Zeile 5 | 5. Zeile 5 | ||
− | + | Dann ergäbe das eine Patchdatei mit dem Inhalt: | |
− | + | ||
− | + | ||
1. --- D1 2005-02-21 18:44:01.000000000 +0100 | 1. --- D1 2005-02-21 18:44:01.000000000 +0100 | ||
2. +++ D2 2005-02-21 18:44:40.000000000 +0100 | 2. +++ D2 2005-02-21 18:44:40.000000000 +0100 | ||
Zeile 192: | Zeile 265: | ||
9. Zeile 5 | 9. Zeile 5 | ||
− | Als erstes gibt es Informationen | + | Als erstes gibt es Informationen über die Dateien, die betroffen sind: Die Ausgangsdatei (--- Zeile) und die Zieldatei (+++ Zeile). |
− | Außerdem gibt es | + | Außerdem gibt es die Angabe "'''@@ -1,5 +1,5 @@'''". Dies heißt soviel wie: "Es folgt ein Unterschied zwischen Zeile 1 und 5, und der gehört in der Zieldatei zwischen Zeile 1 und 5." Das Patchprogramm weiß dann später, in welche Zeile es springen muss. |
− | Weiterhin gibt es nun Zeilen mit + und mit - | + | Weiterhin gibt es nun Zeilen mit "+" und mit "-". Das ist -- genau -- das, was verändert werden soll. Es wird nach einer Zeile mit dem Inhalt von "Zeile 3" gesucht und anschließend gelöscht. Danach wird eine Zeile mit dem Inhalt von "Zeile 3 neu" eingefügt. |
− | Das Patchprogramm bekommt | + | Das Patchprogramm bekommt die Informationen, wo was wodurch ersetzt werden soll. |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
=== Wie liegt ein Patch vor? === | === Wie liegt ein Patch vor? === | ||
Ein Patch kann auf mehrere Arten vorliegen. | Ein Patch kann auf mehrere Arten vorliegen. | ||
− | + | * als gepackte Datei, z.B. patch.gz, patch.diff.gz, patch.diff.bz2 | |
− | + | * als ungepackte Datei, z.B. patch.diff, patch.patch | |
− | + | * als Archiv mit mehreren gepackten Dateien, z.B. 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. | 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 | + | Bitte was? "mehrere gepackte Dateien"? Was soll das? 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 Erstellen des Patches würdet ihr irre werden und derjenige 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 | + | 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? === | === Wie spielt man einen Patch ein? === | ||
Kurz: | Kurz: | ||
− | Man übergibt ihn an das Programm | + | Man übergibt ihn an das Programm '''patch'''. |
Ausführlich: | Ausführlich: | ||
− | Das Programm | + | Das Programm '''patch''' dient zum einspielen der Patches, dazu muß man dem Programm sagen wo der Patch zu finden ist, also z.B.: |
− | + | user@pc:/tmp > patch < /irgendwo/in/dem/verzeichnisbaum/liegt/diese/datei.diff | |
schon legt er los. | 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). | 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. Würde ich mich jedoch im Verzeichnis "'''/freigabe'''" befinden, dann gäbe es einen Fehler: | Bei mir geht das, denn ich habe die Datei dort angelegt. Würde ich mich jedoch im Verzeichnis "'''/freigabe'''" befinden, dann gäbe es einen Fehler: | ||
− | + | 1. user@pc:/freigabe > patch < /tmp/patch.diff | |
− | 1. | + | |
2. can't find file to patch at input line 3 | 2. can't find file to patch at input line 3 | ||
3. Perhaps you should have used the -p or --strip option? | 3. Perhaps you should have used the -p or --strip option? | ||
Zeile 243: | Zeile 305: | ||
9. File to patch: | 9. File to patch: | ||
− | |||
Die entscheidenden Informationen stehen hier: | Die entscheidenden Informationen stehen hier: | ||
can't find file to patch at input line 3 | can't find file to patch at input line 3 | ||
Zeile 252: | Zeile 313: | ||
Die Erklärung ist auch hier sehr einfach wenn man es einmal verstanden hat :) | 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 | + | 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 analysieren. Daher versteht die Patchdatei auch Verzeichnisse, nun könnte meine Datei anfangen mit: |
#|--- tmp/D1 2005-02-21 18:44:01.000000000 +0100 | #|--- tmp/D1 2005-02-21 18:44:01.000000000 +0100 | ||
#|+++ tmp/D2 2005-02-21 18:44:40.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'''. | Er würde also die Dateien '''IMMER''' im Unterverzeichnis "'''./tmp'''" suchen, aktuell also in '''/freigabe/tmp'''. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Ich kann also: | Ich kann also: | ||
a) ein Verzeichnis tmp anlegen und die Datei reinkopieren | a) ein Verzeichnis tmp anlegen und die Datei reinkopieren | ||
− | b) dem Patcher sagen: "Hey du | + | 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. | 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. | -p1 schneidet ein Verzeichnis weg -p2 zwei Verzeichnisse etc. | ||
− | Ich kann also in '''/freigabe''' bleiben und meinen | + | Ich kann also in '''/freigabe''' bleiben und meinen Patch mit: |
patch -p1 < /tmp/patch.diff | patch -p1 < /tmp/patch.diff | ||
einspielen. | einspielen. | ||
− | Nun ein paar Worte zu den Archiven also den Patchvorkommen a) und c) von oben. | + | Nun ein paar 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" | |
− | Statt | + | |
− | + | ||
− | + | ||
also den Inhalt an patch "pipen", das ist technisch quasi dasselbe in diesem Fall. | also den Inhalt an patch "pipen", das ist technisch quasi dasselbe in diesem Fall. | ||
− | Das Programm "patch" kann nur | + | Das Programm "patch" kann nur ASCII-Dateien, also Entpackte, verstehen. Man kann nun |
− | + | * die Archive auspacken und einzeln patchen | |
− | + | * ein Programm diese Arbeit machen lassen | |
− | + | ||
− | + | ||
− | + | ||
Für die gängigen Formate wie "tgz/tar.gz" und "gz" und auch "bz2" gibt es cat-Ableger, diese heißen 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 | zcat, bzcat | ||
− | einfach das | + | einfach das Entsprechende benutzen: |
− | zcat /tmp/patch.diff.gz|patch | + | zcat /tmp/patch.diff.gz | patch |
fertig. | fertig. | ||
Zeile 304: | Zeile 345: | ||
Eigentlich "nur" 3 Dinge. | Eigentlich "nur" 3 Dinge. | ||
− | + | # Das Patch wurde angewendet | |
− | + | # Hunks | |
− | + | # Rejects | |
Passiert nix, dann ist alles ok, der Patchvorgang schaut etwa so aus: | Passiert nix, dann ist alles ok, der Patchvorgang schaut etwa so aus: | ||
− | + | user@pc:/tmp > patch < patch.diff | |
patching file D1 | patching file D1 | ||
− | + | user@pc:/tmp > | |
fertig. | fertig. | ||
Hunks sind kleine Mißstände, die Patch aber korrigieren kann, sie sehen so aus: | Hunks sind kleine Mißstände, die Patch aber korrigieren kann, sie sehen so aus: | ||
− | + | user@pc:/tmp > patch < patch.diff | |
patching file D1 | patching file D1 | ||
Hunk #1 succeeded at 2 (offset 1 line). | Hunk #1 succeeded at 2 (offset 1 line). | ||
− | + | user@pc:/tmp > | |
− | Das | + | Das bedeutet, dass er einen Hunk hatte (#Nummer zählt er hoch) und zwar mußte er eine Patchzeile um 1 Zeile verschieben. |
Was war passiert? | Was war passiert? | ||
− | Meine D1 war nicht mehr so wie oben, sondern war nun | + | Meine D1 war nicht mehr so wie oben, sondern war nun so: |
− | + | ||
− | + | ||
1. Zeile 0 | 1. Zeile 0 | ||
2. Zeile 1 | 2. Zeile 1 | ||
Zeile 336: | Zeile 375: | ||
− | 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. | + | 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 | + | 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. | Kommen wir zu den Rejects. | ||
Unsere neue Datei D1: | Unsere neue Datei D1: | ||
− | |||
− | |||
1. Zeile 1 | 1. Zeile 1 | ||
2. Zeile 2 | 2. Zeile 2 | ||
Zeile 348: | Zeile 385: | ||
4. Zeile 5 | 4. Zeile 5 | ||
− | Unsere Zeile "Zeile 3" fehlt also, genau das wo er patchen soll: | + | Unsere Zeile "Zeile 3" fehlt also, genau das, wo er patchen soll: |
das schaut so aus: | das schaut so aus: | ||
− | + | user@pc:/tmp > patch < patch.diff | |
patching file D1 | patching file D1 | ||
Hunk #1 FAILED at 1. | Hunk #1 FAILED at 1. | ||
1 out of 1 hunk FAILED -- saving rejects to file D1.rej | 1 out of 1 hunk FAILED -- saving rejects to file D1.rej | ||
− | + | Igitt. | |
Aber er sagt ja: "saving rejects to file D1.rej" | Aber er sagt ja: "saving rejects to file D1.rej" | ||
Also schauen wir da mal rein: | Also schauen wir da mal rein: | ||
− | |||
1. ************** | 1. ************** | ||
2. *** 1,5 **** | 2. *** 1,5 **** | ||
Zeile 375: | Zeile 411: | ||
13. Zeile 5 | 13. Zeile 5 | ||
− | + | Nichts Neues, er sagt nur noch einmal, was er machen sollte, nämlich "Zeile 3" löschen und durch "Zeile 3 neu" ersetzen. Die gibts nur nicht mehr, 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 | + | 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: | Unsere neue Datei D1: | ||
− | |||
− | |||
1. Zeile 1 | 1. Zeile 1 | ||
2. Zeile 2 | 2. Zeile 2 | ||
Zeile 388: | Zeile 422: | ||
5. Zeile 5 | 5. 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, pauschalisieren 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. | + | 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, pauschalisieren kann man hier nicht, da muß man dann 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. |
− | + | ===..und so macht man einen Patch:=== | |
+ | Wir gehen ins Verzeichnis temp mit den Unterverzeichnissen D1 (alte Version) und D2 (neue Version) dann<br> | ||
− | + | user@pc > diff -NaurwB D1/ D2/ > unterschied-D1-D2.diff | |
− | + | ||
− | + | * -N : fehlende Dateien als leer betrachten | |
− | + | * -a : alles Text Dateien | |
− | + | * -u : 3 Zeilen "drum herum" ausgeben | |
− | + | * -r : Unterverzeichnisse einbeziehen | |
− | + | * -w : Leerzeichen und Tabs ignorieren (ggf. weglassen) | |
− | + | * -B : Leerzeilen ignorieren | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | [[Kategorie:Patches]] | |
− | + | {{i18n|Patches}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Aktuelle Version vom 15. Juni 2015, 20:08 Uhr
Inhaltsverzeichnis |
[Bearbeiten] Beschreibung
Ein Patch ist eine Änderung am Original-Quelltext eines Programms. In der Patch-Datei befinden sich nur die geänderten Anweisungen und Kommentare darüber, wie diese in den Quelltext eingepflegt werden müssen. Sie bezieht sich immer auf eine bestimmte Version der Originaldatei.Nach dem Einspielen eines Patches ist der Quelltext neu zu übersetzen. Für VDR existieren diverse Patches z. B. um die Optik des OSD zu verbessern.
Siehe auch
[Bearbeiten] Liste
Inhaltsverzeichnis: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
Patch | Beschreibung | Status |
---|---|---|
AC3 over DVB | Aktiviert den digitalen Ausgang der DVB-Karte | Gleiche Funktion im VDR seit Version 1.3.18 |
AC3 Switch | Erlaubt das An/Abschalten von Dolby Digital | Letzte Version für VDR Version 1.3.17 |
Alternative Channel | Verbesserungen für Mischsysteme mit verschiedenen Eingabequellen | |
Audioindexer | Korrektur bei der Erstellung der index.vdr für Radioaufnahmen | Gleiche Funktion im VDR seit Version 1.7.5 |
Big Patch | Sammlung von mehreren Patches | Abgelöst durch den Extensionpatch |
Channel Binding | Erlaubt die Zuordnung von Kanälen der channels.conf zu DVB-Karten per Radio-ID | |
Channel Filter | Einträge in der Kanalliste filtern. | Unbekannt |
Cmd Submenu | Untermenüs für das Befehle-Menü | Gleiche Funktion im VDR seit Version 1.7.12 |
Cutter Bandwith Limit | Verbessert die Reaktionszeit von VDR während des Schneidens. | Gleiche Funktion im Extrecmenu-plugin |
Cutter Queue | Schnitte in Warteschleife abarbeiten | Gleiche Funktion im Extrecmenu-plugin |
Cuttime | Aufnahmezeit beim Schneiden anpassen | Gleiche Funktion im VDR seit Version 1.7.21 |
Disable Double Epg Entrys | Entfernt doppelte EPG-Einträge | Unbekannt |
Dvd Archive | Archiviert Aufnahmen über eindeutige Nummern | Gleiche Funktion im Extrecmenu-plugin |
ERG | (E)lectronic (R)ecording (G)uide | Unbekannt |
Extensions Patch | Sammlung von mehreren Patches | Unbekannt |
Freesat | Erweitert den Programmführer um Huffman-komprimierte Zeichenketten, wie sie typischerweise im Freesat Paket auf Astra2 versendet werden. | |
HardLinkCutter | Neues Schnittverfahren mittels HardLinks im Dateisystem | Nicht mehr anwendbar |
Jump Play | Automatisches Überspringen von Aufnahmeteilen anhand von Schnittmarken bei der Wiedergabe | |
Jumping Seconds | Sprungweite für schnelles Vorspulen (per Farbtasten) ändern | Unbekannt |
Keymacros For Hidden Plugins | Macht versteckte Hauptmenüeintrage wieder über Hotkeys verfügbar | Problem im aktuellen VDR nicht nachvollziehbar |
Liemikuutio | Der finnische all-in-one-Patch | |
Livebuffer | Patch mit dem ständig das aufgenommen wird, was man gerade sieht | |
Lnb Sharing | Eine Satellitenleitung zwischen mehreren DVB Karten teilen | Gleiche Funktion im VDR seit Version 1.7.22 |
Local Channel Provide | Ermöglicht Streaming-Clients mit FF-Karte den Betrieb nur mit Streaming-Server ohne lokale Tuner | Das Dvbsddevice-plugin kennt seit Version 1.7.25 den Parameter "--outputonly" |
Main Menu Hooks | Erlaubt es Plugins Hauptmenüeinträge des VDR zu überschreiben | |
Memory No Epg Cxflags | Deaktiviert den EPG-Scan und gibt Speicher frei (nur 4MB) | Letzte Version für VDR Version 1.3.15 |
Menu Selection | Ermöglicht, dass Menüeinträge >10 per Zahlentasten aufrufbar sind. | |
Mini | Ermöglicht das Erstellen von ZapTimern | Gleiche Funktion im Epgsearch-plugin |
Missing Plugin | Startet VDR trotz fehlendem Plugin | Unbekannt |
No Epg | Verwendung externer EPG-Daten für bestimmte Sender | Gleiche Funktion im Epgsearch-plugin |
Nrkbd | Verbesserte Texteingabe | Unbekannt |
Onlypid | Option, um ausschließlich die PIDs der Sender zu aktualisieren | Gleiche Funktion im VDR seit Version 1.3.47 |
Real Deleted Lifetime | Option, um die Zeit zwischen als gelöscht markiert und gelöscht zu verkürzen | Unbekannt |
Rec Count | Gibt die Anzahl der im Moment laufenden Aufnahmen an ein Skript weiter. | Unbekannt |
Record AC3 Selectable | Ermöglicht es festzulegen, ob Dolby Digital mit aufgezeichnet wird. | Gleiche Funktion im VDR seit Version 1.0.0pre1, wieder entfernt seit Version 1.7.13 |
Recording Length | Zeigt die Aufnahmenlänge und Anderes im Aufnahmenmenü | Gleiche Funktion im Extrecmenu-plugin |
Rename Recordings | Ermöglicht das Umbenennen von Aufnahmen | Gleiche Funktion im Extrecmenu-plugin |
Settime | stellt Uhrzeit anhand der EPG-Daten, ohne daß VDR als root laufen muß | Gleiche Funktion im VDR seit Version ??? |
ShowDetails | fügt einen Hauptmenüeintrag hinzu, über den die EPG-Infos angezeigt werden können. | Gleiche Funktion im VDR seit Version 1.5.12 (Info-Taste) |
Shutdown-rewrite | Verbessertes Shutdown-Handling | Gleiche Funktion im VDR seit Version 1.5.2 |
Show Valid Input | fügt bei Setupeingaben ein "<" vor dem Wert ein, falls ein kleinerer Wert existiert, dito für ">" | |
Show Weekdays | Zeigt den Wochentag im Timer-Menü an | Gleiche Funktion im VDR seit Version 1.3.8 |
SkipDoubleEPG | entfernt doppelte EPG-Einträge | Unbekannt |
SoftOSD | Blendet das OSD der SD-Full-Featured "sanft" ein und aus | Nicht mehr kompatibel mit dem VDR seit Version 1.7.11 |
Sortrec | Ermöglicht es die Aufnahmen im Aufzeichnungsmenü zu sortieren | Gleiche Funktion im Extrecmenu-plugin |
Source Caps | Zuordnung von Karten zu empfangbaren Satellitenpositionen | Gleiche Funktion im VDR seit Version 1.7.13 |
Svdrp Rename | Aufnahmen mittels SVDRP umbenennen | Ähnliche Funktion im VDR seit Version 2.1.3 |
Switch Timer | Aktion bei Timern umschalten | Gleiche Funktion im Epgsearch-plugin |
Timer Commands | Erweitert das Timer-Menü um Kommandos | Unbekannt |
Timer Info | Zeigt an, ob der Timer noch auf die Festplatte passt | Unbekannt |
Unicable | Erweiterung zum Betrieb eines VDRs an einer Einkabel-Matrix nach Unicable bzw. EN59494 Standard | Gleiche Funktion im VDR seit Version 1.7.22 |
UTF8 | Erweiterte Internationalisierung / Freetype fonts | Gleiche Funktion im VDR seit Version 1.5.3 |
War Eagle Icon | Ein paar Icons zur Verschönerung | Unbekannt |
Zap | Ausgewählte Sendungen beim Zappen überspringen | Gleiche Funktion im Block-plugin |
[Bearbeiten] Anleitung
Was ist ein Patch? Ein Patch (oder auch diff-Datei genannt) 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 "Zeile 10 wurde gelöscht", wenn man gar nicht dazu sagt, ob in der alten oder in der neuen Datei. A propos Datei, der Patch enthält außerdem Informationen, um welche Dateien es überhaupt geht.
[Bearbeiten] Wie ist ein Patch aufgebaut?
Nehmen wir an, wir haben eine fiktive Datei D1:
1.Zeile 1 2.Zeile 2 3.Zeile 3 4.Zeile 4 5.Zeile 5
Und fiktive Datei D2:
1. Zeile 1 2. Zeile 2 3. Zeile 3 neu 4. Zeile 4 5. Zeile 5
Dann ergäbe das eine Patchdatei mit dem Inhalt:
1. --- D1 2005-02-21 18:44:01.000000000 +0100 2. +++ D2 2005-02-21 18:44:40.000000000 +0100 3. @@ -1,5 +1,5 @@ 4. Zeile 1 5. Zeile 2 6.-Zeile 3 7.+Zeile 3 neu 8. Zeile 4 9. Zeile 5
Als erstes gibt es Informationen über die Dateien, die betroffen sind: Die Ausgangsdatei (--- Zeile) und die Zieldatei (+++ Zeile). Außerdem gibt es die Angabe "@@ -1,5 +1,5 @@". Dies heißt soviel wie: "Es folgt ein Unterschied zwischen Zeile 1 und 5, und der gehört in der Zieldatei zwischen Zeile 1 und 5." Das Patchprogramm weiß dann später, in welche Zeile es springen muss. Weiterhin gibt es nun Zeilen mit "+" und mit "-". Das ist -- genau -- das, was verändert werden soll. Es wird nach einer Zeile mit dem Inhalt von "Zeile 3" gesucht und anschließend gelöscht. Danach wird eine Zeile mit dem Inhalt von "Zeile 3 neu" eingefügt.
Das Patchprogramm bekommt die Informationen, wo was wodurch ersetzt werden soll.
[Bearbeiten] Wie liegt ein Patch vor?
Ein Patch kann auf mehrere Arten vorliegen.
- als gepackte Datei, z.B. patch.gz, patch.diff.gz, patch.diff.bz2
- als ungepackte Datei, z.B. patch.diff, patch.patch
- als Archiv mit mehreren gepackten Dateien, z.B. 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 soll das? 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 Erstellen des Patches würdet ihr irre werden und derjenige 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.
[Bearbeiten] 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.:
user@pc:/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. Würde ich mich jedoch im Verzeichnis "/freigabe" befinden, dann gäbe es einen Fehler:
1. user@pc:/freigabe > patch < /tmp/patch.diff 2. can't find file to patch at input line 3 3. Perhaps you should have used the -p or --strip option? 4. The text leading up to this was: 5. -------------------------- 6. |--- D1 2005-02-21 18:44:01.000000000 +0100 7. |+++ D2 2005-02-21 18:44:40.000000000 +0100 8. ------------------------- 9. File to patch:
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 analysieren. 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.
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 paar 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
- die Archive auspacken und einzeln patchen
- ein Programm diese Arbeit machen lassen
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.
[Bearbeiten] Was kann beim Patchen passieren?
Eigentlich "nur" 3 Dinge.
- Das Patch wurde angewendet
- Hunks
- Rejects
Passiert nix, dann ist alles ok, der Patchvorgang schaut etwa so aus:
user@pc:/tmp > patch < patch.diff patching file D1 user@pc:/tmp >
fertig.
Hunks sind kleine Mißstände, die Patch aber korrigieren kann, sie sehen so aus:
user@pc:/tmp > patch < patch.diff patching file D1 Hunk #1 succeeded at 2 (offset 1 line). user@pc:/tmp >
Das bedeutet, 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 nicht mehr so wie oben, sondern war nun so:
1. Zeile 0 2. Zeile 1 3. Zeile 2 4. Zeile 3 5. Zeile 4 6. 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:
1. Zeile 1 2. Zeile 2 3. Zeile 4 4. Zeile 5
Unsere Zeile "Zeile 3" fehlt also, genau das, wo er patchen soll: das schaut so aus:
user@pc:/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:
1. ************** 2. *** 1,5 **** 3. Zeile 1 4. Zeile 2 5. -Zeile 3 6. Zeile 4 7. Zeile 5 8.--- 1,5 ---- 9. Zeile 1 10. Zeile 2 11. +Zeile 3 neu 12. Zeile 4 13. Zeile 5
Nichts Neues, er sagt nur noch einmal, was er machen sollte, nämlich "Zeile 3" löschen und durch "Zeile 3 neu" ersetzen. Die gibts nur nicht mehr, 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:
1. Zeile 1 2. Zeile 2 3. Zeile 3 alt 4. Zeile 4 5. 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, pauschalisieren kann man hier nicht, da muß man dann 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.
[Bearbeiten] ..und so macht man einen Patch:
Wir gehen ins Verzeichnis temp mit den Unterverzeichnissen D1 (alte Version) und D2 (neue Version) dann
user@pc > diff -NaurwB D1/ D2/ > unterschied-D1-D2.diff
- -N : fehlende Dateien als leer betrachten
- -a : alles Text Dateien
- -u : 3 Zeilen "drum herum" ausgeben
- -r : Unterverzeichnisse einbeziehen
- -w : Leerzeichen und Tabs ignorieren (ggf. weglassen)
- -B : Leerzeilen ignorieren