Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
MAKEPATCH(1)	       User Contributed Perl Documentation	    MAKEPATCH(1)

NAME
     makepatch - create script to update a source tree

SYNOPSIS
     makepatch [ options ] old-src new-src

Introduction
     Traditionally,  source trees are updated with the patch program, processing
     patch information that is generated by the diff program.  Although diff and
     patch do a very good job at patching file contents, most  versions  do  not
     handle  creating  and deleting files and directories, and adjusting of file
     modes and time stamps. Newer versions of diff and patch seem to be able  to
     create  files,  and very new versions of patch can remove files. But that's
     about it.

     Another typical problem is that patch kits are  typically	downloaded  from
     the  Internet, or transmitted via electronic mail. It is often desirable to
     verify the correctness of a patch kit before even attempting to apply it.

     The makepatch package is designed to overcome these limitations.

DESCRIPTION
     The makepatch package contains two Perl programs: makepatch and applypatch.

     makepatch will generate a patch kit from two source trees. It traverses the
     source directory and runs a diff on each pair of corresponding files, accu-
     mulating the output into a patch kit. It knows about  the	conventions  for
     patch  kits: if a file named "patchlevel.h" exists, it is handled first, so
     patch can check the version of the source tree. Also, to deal with the non-
     perfect versions of patch that are  in  use,  it  supplies  ""Index:""  and
     ""Prereq:"" lines, so patch can correctly locate the files to patch, and it
     relocates	the patch to the current directory to avoid problems with creat-
     ing new files.

     The list of files can be specified in a so called MANIFEST file, but it can
     also be generated by recursively traversing the source tree. Files  can  be
     excluded using shell style wildcards and Perl regex patterns.

     But  that	is not it! makepatch also inserts some additional information in
     the patch kit for use by the applypatch program.

     It is important to emphasize that the generated patch kit	is  still  valid
     input for patch. When used with patch, there are no verifications and prob-
     lems  may	arise  when  new  files need to be created. makepatch prepends a
     small shell script in front of the patch kit  that  creates  the  necessary
     files  and directories for the patch process. If you can not run applypatch
     for some reason, you can run the patch kit as a shell script to prepare the
     source directory for the patching process.

     The applypatch program will do the following:

     *	 It will extensively verify that the patch kit is complete and not  cor-
	 rupted during transfer.

     *	 It will apply some heuristics to verify that the directory in which the
	 patch will be applied does indeed contain the expected sources.

     *	 It creates files and directories as necessary.

     *	 It applies the patch by running the patch program.

     *	 Upon  completion, obsolete files, directories and ".orig" files are re-
	 moved, file modes of new files are  set,  and	the  timestamps  of  all
	 patched files are adjusted.

     Note that applypatch only requires the patch program. It does not rely on a
     shell  or	shell tools. This makes it possible to apply patches on non-Unix
     systems.

General usage
     Suppose you have an archive `"pkg-1.6.tar.gz"' containing the  sources  for
     package  `"pkg"'  version	1.6, and a directory tree `"pkg-1.7"' containing
     the sources for version 1.7. The following command will  generate	a  patch
     kit that updates the 1.6 sources into their 1.7 versions:

	 makepatch pkg-1.6.tar.gz pkg-1.7 > pkg-1.6-1.7.patch

     To  apply	this  script, go to the directory containing the 1.6 sources and
     feed the script to applypatch:

	 cd old/pkg-1.6
	 applypatch pkg-1.6-1.7.patch

     applypatch will verify that it is executing in the right place and make all
     necessary updates.

     By default, makepatch will provide a few lines of progress information, for
     example:

	 Extracting pkg-1.6.tar.gz to /tmp/mp21575.d/old...
	 Manifest MANIFEST for pkg-1.6 contains 1083 files.
	 Manifest MANIFEST for pkg-1.7 contains 1292 files.
	 Processing the filelists ...
	 Collecting patches ...
	   266 files need to be patched.
	   216 files and 8 directories need to be created.
	   7 files need to be removed.

     applypatch will provide no feedback information by default.

Makepatch arguments
     makepatch requires two arguments: old_src and new_src.

     old-src
	 This is the name of either a single file or a directory  that	contains
	 copies of the older version of the target files; in other words, copies
	 of the files prior to any modifications.

	 Alternatively, it may be the name of an archive that holds the files to
	 be  processed.  Allowable archive formats are gzipped tar (name ends in
	 "".tar.gz"" or "".tgz""), bzipped  tar  (name	ends  in  "".tar.bz2""),
	 plain tar (name ends in "".tar"" and zip (name ends in "".zip"").

     new-src
	 This  is  the name of either a single file or a directory that contains
	 copies of the newer version of the target files; in other words, copies
	 of the files after the modifications have been made.

	 Alternatively, it may be the name of an archive that holds the files to
	 be processed.

     The patch script generated by makepatch will  take  care  of  creating  new
     files and directories, update existing files, and remove files and directo-
     ries that are no longer present in the new-src directory.

MANIFEST files
     The purpose of a manifest file is to provide the list of files that consti-
     tute  a  package.	Manifest files are traditionally called ""MANIFEST"" and
     reside in the top level directory of the package.

     Although there is no formal standard for the contents  of	manifest  files,
     makepatch uses the following rules:

     *	 If  the  second line from the manifest file looks like a separator line
	 (e.g. it is empty, or contains only dashes), it is discarded and so  is
	 the first line.

     *	 Empty lines and lines that start with a "#" are ignored.

     *	 If there are multiple space-separated "words" on a line, the first word
	 is considered to be the filename.

   Default treatment
     By  default,  makepatch looks for files named ""MANIFEST"" in the top level
     directories of the old and the new source trees. If these files (or one  of
     them)  are  found,  they are used.  If no manifest file could be found, the
     package is assumed to consist of all files in the directory.

     The default name of the default manifest file can be modified with the com-
     mand line option ""-automanifest"", see Section "Command line options".

   Explicitly naming of manifest files
     Command line options ""-oldmanifest"" and ""-newmanifest"" can be	used  to
     explicitly  designate old and new manifest files. Option ""-manifest"" is a
     short way to set one manifest file for both the old and new source trees.

   Suppress manifest file processing
     Command line option ""-nomanifest"" can be used to  suppress  all	manifest
     file  processing.	The  package  is  assumed to consist of all files in the
     source directories.

Makepatch options
     makepatch takes several options to control its behaviour. Options are  usu-
     ally  specified  on  the  command line, but makepatch can take options from
     three sources in the following order:

     *	 Environment variable MAKEPATCHINIT.

	 When this environment variable is set its contents are considered to be
	 command line options that are processed upon startup.	All  normal  op-
	 tions	are  allowed,  plus one: -rcfile filename. Option -rcfile can be
	 used to specify an alternate option file, see below.

     *	 Options files.

	 makepatch first tries to process a file named /etc/makepatchrc.   (This
	 is a Unix-ism.)  It is okay if this file is missing.

	 Next,	makepatch  will  process a file named .makepatchrc in the user's
	 home directory, if it exists.

	 After processing  this  file,	makepatch  will  process  a  file  named
	 .makepatchrc  in  the	current  directory, if it exists. An alternative
	 name for this file can be specified with option -rcfile in  environment
	 variable  MAKEPATCHINIT. This is the only way to specify an alternative
	 options file name.

	 In all option files, empty lines and lines starting with ";" or "#" are
	 ignored. All other lines are considered to contain options  exactly  as
	 if they had been supplied on the command line.

     *	 The command line.

Command line options
     Options are matched case insensitive, and may be abbreviated to uniqueness.

     -description text
	 Provide  a  descriptive  text for this patch. Multiple -description op-
	 tions may be supplied.

	 If no description is provided, the program try to guess  one.	This  is
	 usually   possible   if   both   directories  are  simple  names,  e.g.
	 '"pkg-1.16"'. If no description can be determined, the program will ask
	 for one.

     -diff cmd
	 If specified, cmd is the command to be used to generate the differences
	 between the two versions of the files.  If not specified, this  command
	 defaults to ""diff -c"".

	 For best results, only use ""diff -c"" or ""diff -u"".  In any case, it
	 must produce either context or unified diff output.

     -patchlevel pfile
	 If  specified,  pfile indicates an alternate file that is to be used in
	 lieu of "patchlevel.h".

     -automanifest mfile
	 makepatch will automatically use manifest files of the  given	name  if
	 they appear in the directories. The default name is "MANIFEST".

     -nomanifest
	 Suppress using manifest files.

     -manifest mfile
	 If  specified, mfile indicates the name of the manifest file which con-
	 sists of a list of the files contained in both the old and the new  di-
	 rectories.

     -oldmanifest omfile
	 If specified, omfile indicates the name of the manifest file which con-
	 sists	of a list of the files contained in the old directory.	This op-
	 tion is designed to be used in conjunction with  the  -newmanifest  op-
	 tion.	Note that the old and new directories must still be indicated.

     -newmanifest nmfile
	 If specified, nmfile indicates the name of the manifest file which con-
	 sists	of a list of the files contained in the new directory.	This op-
	 tion is designed to be used in conjunction with  the  -oldmanifest  op-
	 tion.	Note that the old and new directories must still be indicated.

     -[no]recurse
	 makepatch  recurses  through  directories by default. Option -norecurse
	 prevents recursion beyond the initial directories.

     -[no]follow
	 If set, symbolic links to directories are traversed  as  if  they  were
	 real directories.

     -infocmd command
	 If  specified,  the output of running command will be added before each
	 patch chunk. command will undergo the	following  substitutions  first:
	 %oP  will be replaced by the name of the old file, %nP will be replaced
	 by the name of the new file. "%%" will be replaced  by  a  single  "%";
	 other "%" sequences may be added in future versions. When a new file is
	 being	created,  the name of the new file will be supplied for both %oP
	 and %nP.

	 Note that %oP and %nP are modeled  after  the	"%"  sequences	of  find
	 -printf.

     -exclude pattern
	 If  specified,  files	that match the shell pattern pattern will be ex-
	 cluded. Only wildcard characters "*" and  "?",  and  character  classes
	 "[...]" are handled. Multiple -exclude options may be supplied.

     -exclude-regex pattern
	 If specified, files and directories that match the Perl regular expres-
	 sion pattern pattern will be excluded.  Multiple -exclude-regex options
	 may be supplied.

     -[no]exclude-standard
	 Set  by  default. If set, a common set of files and directories are ig-
	 nored.

	 See also section "Standard Exclude Patterns".

     -[no]exclude-cvs
	 If set, files and directories that are usually part of version  control
	 system CVS are excluded.

	 Also, ".cvsignore" files are honoured just like CVS does it.

	 See also section "Standard Exclude Patterns".

     -[no]exclude-rcs
	 If  set, files and directories that are usually part of version control
	 system RCS are excluded.

	 See also section "Standard Exclude Patterns".

     -[no]exclude-sccs
	 If set, files and directories that are usually part of version  control
	 system SCCS are excluded.

	 See also section "Standard Exclude Patterns".

     -[no]exclude-vc
	 Short for (re)setting -exclude-rcs, -exclude-cvs, and -exclude-sccs.

     -[no]ignore-cvs-keywords
	 Differences  in  CVS keyword data (e.g. "Id", "Header", "Revision") are
	 ignored, provided there are no other  differences  in	the  same  hunk.
	 This  option  passes  a very hairy regex to the --ignore-matching-lines
	 option of the diff program, and hence requires GNU diff. This	restric-
	 tion may be lifted in a future version.

     -[no]ignore-rcs-keywords
	 Same as -[no]ignore-cvs-keywords.

     -extract pattern=command
	 Define  additional  extraction  rules	for archives. If the name of the
	 source or destination matches the Perl pattern, the command is executed
	 with the archive on standard input and the current directory set to the
	 location where the files must be extracted. Multiple  -extract  options
	 may be supplied. User defined rules override built-in rules.

	 Builtin rules are:

	     .+\.(tar\.gz|tgz)	  => "gzip -d | tar xpf -"
	     .+\.(tar\.bz2)	  => "bzip2 -d | tar xpf -"
	     .+\.tar		  => "tar xf -"
	     .+\.zip		  => "unzip -"

	 The  patterns are implicitly anchored to the begin and end of the file-
	 name.

     -[no]ident
	 If set, the program name and version is reported.

     -[no]verbose
	 This is set by default, making makepatch display information concerning
	 its activity to stderr.

     -[no]quiet
	 The opposite of -verbose. If set, this instructs makepatch to	suppress
	 the display of activity information.

     -[no]help
	 If  set,  this causes a short help message to be displayed, after which
	 the program immediately exits.

Standard Exclude Patterns
     The following file patterns are always excluded:

	 *~ *.a *.bak *.BAK *.elc *.exe *.gz *.ln *.o *.obj
	 *.olb *.old *.orig *.rej *.so *.Z
	 .del-* .make.state .nse_depinfo core
	 tags TAGS

     Option -exclude-sccs adds:

	 p.* s.* SCCS

     Option -exclude-rcs adds:

	 ,* *,v RCS RCSLOG

     Option -exclude-cvs adds ".cvsignore" patterns, and:

	 .#* #* _$* *$ CVS CVS.adm cvslog.*

     Please let me know if I missed some.

Environment variables
     MAKEPATCHINIT
	 When this environment variable is set its contents is considered to  be
	 command  line	options  that are processed upon startup. All normal op-
	 tions are allowed, plus one: -rcfile filename. If -rcfile is specified,
	 the file is read and all lines of it are considered to  contain  option
	 settings as described in section "Makepatch options".

     TMPDIR
	 "TMPDIR"  can	be  used to designate the area where temporary files are
	 placed. It defaults to "/usr/tmp".

     TEMP"TEMP" can be used as an alternative to "TMPDIR".

Examples
     Suppose you have a directory tree `"pkg-1.6"' containing  the  sources  for
     package  `"pkg"'  version	1.6, and a directory tree `"pkg-1.7"' containing
     the sources for version 1.7. The following command will  generate	a  patch
     kit that updates the 1.6 sources into their 1.7 versions:

	 makepatch pkg-1.6 pkg-1.7 > pkg-1.6-1.7.patch

     To  apply	this  script, go to the pkg-1.6 directory and feed the script to
     applypatch:

	 cd old/pkg-1.6
	 applypatch pkg-1.6-1.7.patch

     applypatch will verify that it is executing in the right place and make all
     necessary updates.

     This is one way to generate and use manifest files:

	 (cd pkg-1.6; find . -type f -print > OLDMANIFEST)

	 (cd pkg-1.7; find . -type f -print > NEWMANIFEST)

	 makepatch \
	   -oldmanifest pkg-1.6/OLDMANIFEST \
	   -newmanifest pkg-1.7/NEWMANIFEST \
	   pkg-1.6 pkg-1.7 > pkg-1.6-1.7.diff

Bugs and restrictions
     Much of the job of makepatch is processing file names. makepatch  has  been
     tested  extensively  on  Unix  systems, but it is not guaranteed to work on
     other systems.

     applypatch is repeatedly reported to correctly process makepatch  generated
     patch kits on modern 32-bit Windows systems as well.

     makepatch	does  not know about symbolic links.  These will be treated like
     plain files.

     Wrong results can be generated if the file lists that are used or generated
     use different path separators.

SEE ALSO
     applypatch(1), diff(1), patch(1), perl(1), rm(1).

AUTHOR AND CREDITS
     Johan Vromans (jvromans@squirrel.nl) wrote the program, with a little  help
     and  inspiration  from:  Jeffery Small, Ulrich Pfeifer, Nigel Metheringham,
     Julian Yip, Tim Bunce, Gurusamy Sarathy, Hugo van der Sanden, Rob Browning,
     Joshua Pritikin, and others.

COPYRIGHT AND DISCLAIMER
     This program is  Copyright  1992,2004,2006  by  Squirrel  Consultancy.  All
     rights reserved.

     This program is free software; you can redistribute it and/or modify it un-
     der  the terms of either: a) the GNU General Public License as published by
     the Free Software Foundation; either version 1, or  (at  your  option)  any
     later version, or b) the "Artistic License" which comes with Perl.

     This program is distributed in the hope that it will be useful, but WITHOUT
     ANY  WARRANTY; without even the implied warranty of MERCHANTABILITY or FIT-
     NESS FOR A PARTICULAR PURPOSE. See either the GNU General Public License or
     the Artistic License for more details.

perl v5.32.1			   2012-10-26			    MAKEPATCH(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=makepatch&sektion=1&manpath=FreeBSD+13.1-RELEASE+and+Ports>

home | help