The foswiki svn repository will become read-only on Friday 8/8. Developers should register for a http://github.com/ account for commit access to foswiki.

PatchFoswikiContrib

File patch tool for Foswiki

Usage

This extension allows you to "hotfix" urgent issues on your Foswiki system. It has been tested on Foswiki 1.1.0 and beyond. It does not work on Foswiki 1.0.

When this extension is installed, it adds some required libraries to your Foswiki system, and then in the Post-installation exit, applies any patch files found in the manifest. This extension ships with a hotfix for the following items:

Original Issue Patch File Description
Item12225 Item11267-001 Extensions released with new style Perl version strings prevents installation of any further extensions.
Item11267 Item11267-002 Extensions are re-installed because of dependency on svn Revision levels.

Patches are only applied if the target file is an exact match to the original file. There is no attempt to do "fuzzy" patching. Note however that a patch can be built to cover multiple versions of the file.

There is no "dependency" between patches. Patches are installed in order of their patch file name. In the above patch list, Item11267-001.patch makes unrelated changes to the file patched in Item11267-002.patch, but must be installed first so that the patch signatures match.

Patches will be mapped from the default Foswiki filename to the directory location used on the target system.

Before any file is patched, a backup is copied to working/configure/backup/<Itemxxxx-nnn-YYYMMDD-HHMMSS>. If archive tools are found on the system, a zip or tar archive is created of the backup.

Patch files found on this system

This report lists the patch files found in the working/configure/patch directory. The patch summary is displayed, followed by a list of each candidate patch. The Status column is set to:
  • N/A: This version of the patch does not apply to this file. The file might have been subsequently modified by another patch or by manual edit.
  • PATCHED: The patch appears to have been applied, and no other modifications have been made to the file.
  • APPLIES: The patch matches and is eligible to be applied.

ALERT! Admin access only!

Building a patch

Currently a separate version of this extension has to be built for each patch. The only patches installed are those identified in the manifest of the contrib. This extension adds some infrastructure that a future Foswiki could use to apply patches from configure.

Create a patch file

The format of the patch file is a collection of related patches, one for each version of a target file. The patch file consists of

Summary
A general description of the patch. It can be any number of lines long and will be reported in the installation log.
Patch Target ~~~PATCH fdeeb7f236608b7792ad0845bf2279f9:76e28354522a6d6cccc76c66f99d2424  lib/Foswiki/Configure/Dependency.pm (Foswiki 1.1.5)
Identifies a single version of a patch along with the md5 of the target file, the filename and a comment.
  • ~~~PATCH Identifies this as a patch
  • fdee..79f9 is the MD5 hash of the original version of the unpatched target file.
  • fdee..2424 is the MD5 hash of the patched version of the file.
  • lib/Foswiki... The target file name
  • (Comment) A comment in optional parenthesis, such as the foswiki version that shipped this file..
The patch
A patch in unified diff format =diff -Naur oldversionFile newVersionFile

To build a patch file,
  • For the "current release":
    • Calculate checksum of original released file: md5sum lib/Foswiki/Target/File.pm >> Itemxxxx-xxx.patch
    • Get a starting point from the fixing git patch: git show [hash] lib/Foswiki/Target/File.pm >> Itemxxxx-xxx.patch
    • Verify that this diff can be applied to the "released" version of the file
    • Edit the patch file buiding the ~~~PATCH record and remove the md5sum record

  • For each additional release that the patch will cover:
    • Calculate checksum of original file: md5sum lib/Foswiki/Target/File.pm >> Itemxxxx-xxx.patch
      • If this is identical to another revision, you are done, move to the next version.
    • Copy the target: cp lib/Foswiki/Target/File.pm lib/Foswiki/Target/File.pm.new
    • Manually patch the new file
    • Calculate the diff: diff -Naur lib/Foswiki/Target/File.pm lib/Foswiki/Target/File.pm.new >> Itemxxxx-xxx.patch
    • Edit the patch file to build the ~~~PATCH record and remove the md5sum record.

Here is an example patch file for the Foswiki 1.1.5 and Foswiki 1.l.4 versions of the files. (EXTENSIONS.pm was not modified between 1.1.4 and 1.1.5):
Author: GeorgeClark <GeorgeClark@0b4bb1d4-4e5a-0410-9cc4-b2b747904278>
Date:   Mon Nov 5 05:07:25 2012 +0000

    Item12225: Don't use "HEAD" to detect pseudo install.

    A real, non-pseudo-installed extension will crash configure if a
    perl version object is compared to an alpha string.

    9999.99_999 will be used to indicate a pseudo-installed release.

    git-svn-id: http://svn.foswiki.org/trunk@15909 0b4bb1d4-4e5a-0410-9cc4-b2b747904278

~~~PATCH fdeeb7f236608b7792ad0845bf2279f9  lib/Foswiki/Configure/Dependency.pm (Foswiki 1.1.5)
--- lib/Foswiki/Configure/Dependency.pm 2012-11-07 23:46:56.378148979 -0500
+++ lib/Foswiki/Configure/Dependency.pm.new     2012-11-07 23:46:14.091649218 -0500
@@ -220,7 +220,7 @@
             if ( -l "$dir/$path" ) {

                 # Assume pseudo-installed
-                $this->{installedVersion} = 'HEAD';
+                $this->{installedVersion} = '9999.99_999';
             }
             last;
         }

~~~PATCH 76e28354522a6d6cccc76c66f99d2424 lib/Foswiki/Configure/UIs/EXTENSIONS.pm (Foswiki 1.1.0-1.1.5)
--- lib/Foswiki/Configure/UIs/EXTENSIONS.pm     2012-11-07 23:45:21.269274066 -0500
+++ lib/Foswiki/Configure/UIs/EXTENSIONS.pm.new 2012-11-07 23:46:39.844344573 -0500
@@ -280,7 +280,7 @@
         if ( $ext->{installedRelease} ) {

             # The module is installed; check the version
-            if ( $ext->{installedVersion} eq 'HEAD' ) {
+            if ( $ext->{installedVersion} eq '9999.99_999' ) {

                 # pseudo-installed
                 $install = 'pseudo-installed';

~~~PATCH 4e525d29a245785ae810316835c18e62 lib/Foswiki/Configure/Dependency.pm (Foswiki-1.1.4)
--- lib/Foswiki/Configure/Dependency.pm 2011-12-20 10:33:22.000000000 -0500
+++ lib/Foswiki/Configure/Dependency.pm 2012-11-08 17:05:55.982213647 -0500
@@ -220,7 +220,7 @@
             if ( -l "$dir/$path" ) {

                 # Assume pseudo-installed
-                $this->{installedVersion} = 'HEAD';
+                $this->{installedVersion} = '9999.99_999';
             }
             last;
         }

Installation

You do not need to install anything in the browser to use this extension. The following instructions are for the administrator who installs the extension on the server.

Open configure, and open the "Extensions" section. Use "Find More Extensions" to get a list of available extensions. Select "Install".

If you have any problems, or if the extension isn't available in configure, then you can still install manually from the command-line. See http://foswiki.org/Support/ManuallyInstallingExtensions for more help.

Info

Author: GeorgeClark
Copyright ©: Foswiki Contributors
License: GPL (GNU General Public License)
Dependencies:
NameVersionDescription
Algorithm::Diff>=0May be required for lib/CPAN/lib/Text/Diff.pm
Carp>=0May be required for lib/CPAN/lib/Text/Diff.pm, lib/CPAN/lib/Text/Diff/Table.pm, lib/CPAN/lib/Text/Patch.pm
Exporter>=0May be required for lib/CPAN/lib/Text/Diff.pm, lib/CPAN/lib/Text/Patch.pm
File::Copy>=0May be required for lib/Foswiki/Configure/PatchFile.pm
File::Path>=0May be required for lib/Foswiki/Configure/PatchFile.pm
File::Spec>=0May be required for lib/Foswiki/Configure/PatchFile.pm
Foswiki::Time>=0May be required for lib/Foswiki/Configure/PatchFile.pm
Version: 1.5
Change History:  
1.5 (26 Dec 2012) Foswikitask:Item12312: Add reporting of patch status,
Foswikitask:Item12314: Add feature to reverse a patch.
Note that there are no changes to the patches shipped in this version.
1.4 (14 Dec 2012) Some perl complains about exporting of function names.
1.3 (28 Nov 2012) Rework to support multiple patch installation. Rename to PatchFoswikiContrib from PatchItem12225Contrib. Add a 2nd patch file.
1.2 (15 Nov 2012) Manifest errors. Configure was complaining about non-writable working files.
1.1 (15 Nov 2012) Don't include / when matching filenam, causes undefined variables on Windows.
1.0 (09 Nov 2012) Initial version
Home: http://foswiki.org/Extensions/PatchFoswikiContrib
Support: http://foswiki.org/Support/PatchFoswikiContrib

PackageForm edit

ExtensionClassification Admin
ExtensionType PluginPackage
Compatibility Applies to any Foswiki 1.1.x version before Foswiki 1.1.6. This should be installed prior to installing any extensions released with Foswiki 1.1.6
ImageUrl
DemoUrl http://
SupportUrl PatchFoswikiContrib
DevelopedInSVN Yes
ModificationPolicy PleaseFeelFreeToModify
Topic attachments
I Attachment Action Size Date Who Comment
PatchFoswikiContrib.md5md5 PatchFoswikiContrib.md5 manage 0.2 K 31 Jan 2013 - 15:33 GeorgeClark  
PatchFoswikiContrib.sha1sha1 PatchFoswikiContrib.sha1 manage 0.2 K 31 Jan 2013 - 15:33 GeorgeClark  
PatchFoswikiContrib.tgztgz PatchFoswikiContrib.tgz manage 27.7 K 31 Jan 2013 - 15:33 GeorgeClark  
PatchFoswikiContrib.zipzip PatchFoswikiContrib.zip manage 35.8 K 31 Jan 2013 - 15:33 GeorgeClark  
PatchFoswikiContrib_installerEXT PatchFoswikiContrib_installer manage 6.5 K 31 Jan 2013 - 15:33 GeorgeClark  
Topic revision: r5 - 31 Jan 2013, GeorgeClark
 
The copyright of the content on this website is held by the contributing authors, except where stated elsewhere. see CopyrightStatement. Creative Commons License