--- /dev/null
+At the begining was the void. Then Andrew Morton <akpm@digeo.com> begun
+a collection of small scripts for patch management. The contributions
+came from Stephen Cameron <steve.cameron@hp.com>, Matt Reppert
+<arashi@arashi.yi.org> and Jeremy Fitzhardinge <jeremy@digeo.com>.
+
+Then, Andreas Gruenbacher <agruen@suse.de> came to cleanup, reorganize,
+document and speed up the code. He did also package it to rpm.
+
+Finally, Martin Quinson <Martin.Quinson@tuxfamily.org> did a debian
+package and came with several little patches.
+
+
+Andrew Morton <akpm@digeo.com>
+ Collection of scripts for patch management (patch-scripts).
+
+Stephen Cameron <steve.cameron@hp.com>
+ Contributed pstatus.
+
+Matt Reppert <arashi@arashi.yi.org>
+Jeremy Fitzhardinge <jeremy@digeo.com>
+ Contributions to Andrew's scripts.
+
+Andreas Gruenbacher <agruen@suse.de>
+ Clean up, reorganize, speedups, documentation.
+ Package up as RPM.
+
+Gerd Knorr <kraxel@suse.de>
+ Contributed spec2series.
+
+Martin Quinson <Martin.Quinson@tuxfamily.org>
+ Several little patches.
+ Package up for Debian.
--- /dev/null
+* Patch is less sensitive to the file names in the diff headers than
+ the scripts are. It tries both filenames specified and apparently
+ checks if the file exists. We only look at the `+++ file ...' header,
+ and ignore the other. Other than patch we cannot simply look at the
+ file system to determine which one is the imput file.
+
+* Patch destroys the backup files it generates if a file appears more
+ than once in a patch. This is the reason why we use the backup-files
+ utility instead.
+
+* quilt setup doesn't detect if the source file doesn't exist.
+
+* Blank and commented out lines in series file cause problems.
+
+* rpatch should only look at .pc/applied-patches, not at the series
+ file.
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+\f
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+PACKAGE := @PACKAGE_NAME@
+VERSION := @PACKAGE_VERSION@
+RELEASE := @PACKAGE_RELEASE@
+PACKAGE_BUGREPORT := @PACKAGE_BUGREPORT@
+
+prefix := @prefix@
+exec_prefix := @exec_prefix@
+bindir := @bindir@
+libdir := @libdir@
+datadir := @datadir@
+mandir := $(datadir)/man
+docdir := $(datadir)/doc
+localedir := $(datadir)/locale
+etcdir := $(subst /usr/etc,/etc,$(prefix)/etc)
+
+QUILT_DIR = $(datadir)/$(PACKAGE)
+SCRIPTS_DIR = $(QUILT_DIR)/scripts
+LIB_DIR = $(libdir)/$(PACKAGE)
+
+INSTALL := @INSTALL@
+PERL := @PERL@
+BASH := @BASH@
+SED := @SED@
+AWK := @AWK@
+DIFF := @DIFF@
+PATCH := @PATCH@
+MKTEMP := @MKTEMP@
+MSGFMT := @MSGFMT@
+DIFFSTAT := @DIFFSTAT@
+
+ifeq "$(MSGFMT)" ""
+MAKE_NLS := @true
+else
+MAKE_NLS := $(MAKE)
+endif
+
+CFLAGS := @CFLAGS@ -Wall
+
+ISODATE := $(shell date +%Y-%m-%d)
+
+#-----------------------------------------------------------------------
+DIRT += $(shell find -name '*~')
+DIRT += $(shell find -name '.\#*')
+
+SRC += COPYING AUTHORS TODO BUGS Makefile.in \
+ configure.ac config/install-sh \
+ quilt.spec.in \
+ bash_completion
+DIRT += quilt.spec
+
+BIN_IN := quilt guards
+BIN_SRC := $(BIN_IN:%=%.in)
+BIN := $(BIN_IN)
+SRC += $(BIN_SRC:%=bin/%)
+DIRT += $(BIN_IN:%=bin/%)
+
+QUILT_IN := add applied delete diff files import new next patches \
+ pop previous push refresh remove series setup top unapplied fork
+
+QUILT_SRC := $(QUILT_IN:%=%.in)
+QUILT := $(QUILT_IN)
+SRC += $(QUILT_SRC:%=quilt/%)
+DIRT += $(QUILT_IN:%=quilt/%)
+
+SCRIPTS_IN := apatch rpatch patchfns parse-patch spec2series
+SCRIPTS_SRC := $(SCRIPTS_IN:%=%.in)
+SCRIPTS := $(SCRIPTS_IN)
+SRC += $(SCRIPTS_SRC:%=scripts/%)
+DIRT += $(SCRIPTS_IN:%=scripts/%)
+
+LIB_SRC := backup-files.c
+LIB := backup-files
+SRC += $(LIB_SRC:%=lib/%)
+DIRT += lib/backup-files lib/backup-files.o
+
+DOC_IN := README
+DOC_SRC := $(DOC_IN:%=doc/%.in)
+DOC := $(DOC_IN)
+SRC += $(DOC_SRC) doc/docco.txt
+DIRT += $(DOC_IN:%=doc/%)
+
+MAN1 := bin/guards.1
+
+DEBIAN := changelog control copyright docs prerm rules
+
+LINGUAS := fr de
+PO := Makefile quilt.pot $(LINGUAS:%=%.po)
+SRC += $(PO:%=po/%)
+DIRT += po/*.mo
+
+
+#-----------------------------------------------------------------------
+
+all : scripts
+ $(MAKE_NLS) -C po all BUILD_ROOT=$(BUILD_ROOT)
+
+scripts : $(BIN:%=bin/%) $(QUILT:%=quilt/%) $(SCRIPTS:%=scripts/%) \
+ $(LIB:%=lib/%) $(DOC:%=doc/%) $(MAN1)
+
+dist : clean $(PACKAGE)-$(VERSION).tar.gz
+
+snapshot : $(PACKAGE)-$(ISODATE).tar.bz2
+
+rpm : $(PACKAGE)-$(VERSION).tar.gz
+ rpmbuild -tb $<
+
+doc/README : doc/README.in
+ @echo README.in -> README
+ @while read line; do \
+ case "$$line" in \
+ '@REFERENCE''@') \
+ $(MAKE) -s reference \
+ ;; \
+ *) \
+ echo $$line \
+ ;; \
+ esac ; \
+ done 2>&1 < $< > $@
+
+.PHONY :: reference
+reference : $(QUILT:%=quilt/%)
+ @for i in $+; \
+ do \
+ echo "$$i >> README" >&2; \
+ echo; \
+ (bash -c ". scripts/patchfns ; . $$i -h"); \
+ done | \
+ sed -e '/^Usage: \?/ {s/^Usage: \?// ;}' \
+ -e 's/^/ /'
+
+bin/guards.1 : bin/guards
+ mkdir -p $$(dirname $@)
+ pod2man $< > $@
+
+$(PACKAGE)-$(VERSION).tar.gz : $(SRC) configure $(PACKAGE).spec
+ rm -f $(PACKAGE)-$(VERSION) $@
+ ln -s . $(PACKAGE)-$(VERSION)
+ tar chf - $(+:%=$(PACKAGE)-$(VERSION)/%) | gzip -9 > $@
+ rm -f $(PACKAGE)-$(VERSION)
+ @echo "File $@ created."
+
+$(PACKAGE)-$(ISODATE).tar.bz2 : $(SRC) configure $(PACKAGE).spec
+ rm -f $(PACKAGE)-$(ISODATE) $@
+ ln -s . $(PACKAGE)-$(ISODATE)
+ tar chf - $(+:%=$(PACKAGE)-$(ISODATE)/%) | bzip2 -9 > $@
+ rm -f $(PACKAGE)-$(ISODATE)
+ @echo "File $@ created."
+
+configure : configure.ac
+ autoconf
+
+$(PACKAGE).spec : $(PACKAGE).spec.in Makefile \
+ scripts/parse-patch
+ @echo "Generating spec file"
+ @sed -e 's/^\(Version:[ \t]*\).*/\1$(VERSION)/' \
+ -e 's/^\(Release:[ \t]\).*/\1$(RELEASE)/' \
+ < $< > $@
+ @perl -ne ' \
+ m/^(|-+)$$/ and next; \
+ ( \
+ s/^(...) \s (...) \s (.\d) \s (\d\d:\d\d:\d\d) \s \
+ ([A-Z]+|[-+]\d{4}) \s (\d\d\d\d) \s - \s (.+) \
+ /* $$1 $$2 $$3 $$6 - $$7/x || \
+ m/^(- | )(?!\s)/ \
+ and print \
+ ) or die "Syntax error in line $$. of changelog:\n$$_\n"; \
+ ' $(PACKAGE).changes \
+ | scripts/parse-patch -u changelog $@
+
+% : %.in
+ @echo "$< -> $@"
+ @sed -e 's:@LIB''@:$(LIB_DIR):g' \
+ -e 's:@QUILT''@:$(QUILT_DIR):g' \
+ -e 's:@SCRIPTS''@:$(SCRIPTS_DIR):g' \
+ -e 's:@PERL''@:$(PERL):g' \
+ -e 's:@BASH''@:$(BASH):g' \
+ -e 's:@SED''@:$(SED):g' \
+ -e 's:@AWK''@:$(AWK):g' \
+ -e 's:@DIFF''@:$(DIFF):g' \
+ -e 's:@PATCH''@:$(PATCH):g' \
+ -e 's:@MKTEMP''@:$(MKTEMP):g' \
+ -e 's:@PACKAGE_BUGREPORT''@:$(PACKAGE_BUGREPORT):g' \
+ -e 's:@VERSION''@:$(VERSION):g' \
+ -e 's:@RELEASE''@:$(RELEASE):g' \
+ -e 's:@DIFFSTAT''@:$(DIFFSTAT):g' \
+ $< > $@
+ @chmod --reference=$< $@
+
+Makefile : Makefile.in
+ @echo "Please run ./configure by hand"
+ @false
+
+install : scripts
+ @INSTALL@ -d $(BUILD_ROOT)$(bindir)
+ @INSTALL@ -m 755 $(BIN:%=bin/%) $(BUILD_ROOT)$(bindir)/
+
+ @INSTALL@ -d $(BUILD_ROOT)$(QUILT_DIR)
+ @INSTALL@ -m 755 $(QUILT:%=quilt/%) $(BUILD_ROOT)$(QUILT_DIR)/
+
+ @INSTALL@ -d $(BUILD_ROOT)$(SCRIPTS_DIR)
+ @INSTALL@ -m 755 $(filter-out scripts/patchfns, \
+ $(SCRIPTS:%=scripts/%)) \
+ $(BUILD_ROOT)$(SCRIPTS_DIR)
+ @INSTALL@ -m 644 scripts/patchfns $(BUILD_ROOT)$(SCRIPTS_DIR)
+
+ @INSTALL@ -d $(BUILD_ROOT)$(LIB_DIR)
+ @INSTALL@ -m 755 -s $(LIB:%=lib/%) $(BUILD_ROOT)$(LIB_DIR)/
+
+ @INSTALL@ -d $(BUILD_ROOT)$(docdir)/$(PACKAGE)
+ @INSTALL@ -m 644 doc/README $(BUILD_ROOT)$(docdir)/$(PACKAGE)/
+
+ @INSTALL@ -d $(BUILD_ROOT)$(mandir)/man1
+ @INSTALL@ -m 644 $(MAN1) $(BUILD_ROOT)$(mandir)/man1/
+
+ $(MAKE_NLS) -C po install BUILD_ROOT=$(BUILD_ROOT) \
+ LINGUAS="$(LINGUAS)" localedir=$(localedir)
+
+ @INSTALL@ -d $(BUILD_ROOT)$(etcdir)
+ @INSTALL@ -d $(BUILD_ROOT)$(etcdir)/bash_completion.d
+ @INSTALL@ -m 644 bash_completion $(BUILD_ROOT)$(etcdir)/bash_completion.d/quilt
+
+clean :
+ rm -f $(DIRT)
+ rm -f po/*.mo
+
+distclean : clean
+ rm -f config.log config.status Makefile
+ rm -rf autom4te.cache/
--- /dev/null
+README.in -
--- /dev/null
+This is my current list of open issues with the patch scripts. I would
+like to do the most intrusive changes before syncing up with the
+Savannah CVS. Of course, contributions are very welcome. It wouldn't
+hurt to know if you want to work on some of the issues in advance to
+avoid duplicate work, though :)
+
+ -- Andreas Gruenbacher <agruen@suse.de>
+
+
+General:
+
+ - Test if patches/ can be moved with environment variable as
+ planned.
+
+ - Abstract backup operations to/from the .pc/ directory, so that
+ optionally something like rcs can be used instead of
+ lib/backup-files?
+
+ - Add regression test suite; the scripts were broken often enough
+ already...
+
+ - Add a ~/.quiltrc that contains default options for individual
+ commands, similar to ~/.cvsrc. Also requires some more
+ negative options so that the effects of ~/.quiltrc can be
+ reversed.
+
+ - Add something similar to cvs diff, which scans all files for
+ changes that have not been folded back into their patches,
+ similar to:
+ `for p in $(quilt series); do quilt diff -z $p; done'?
+
+ - Allow to add a directory? Then we could detect also new files
+ in the directory, without having to add them individually.
+
+ - Add option for creating hard links.
+
+ - Instead of passing around and storing in applied-patches the
+ short patch name (=patch file name with .dif .diff .patch .gz
+ .bz2 stripped), translate from short names to real file names
+ an the user interface, and work with full names internally.
+ This will simplify regexp matching in several functions.
+
+ - Support different diff/patch options for different patches.
+ (By specifying them in the series file?)
+
+Documentation:
+
+ - How to rediff with pushpatch -f / poppatch -f?
+
+ - How to import a new version of a patch?
+
+ - How to import a complete directory, before doing
+ wild changes? (This will also cause new files to end up in the
+ patch.)
+
+quilt refresh:
+
+ - Add an -m option similar to `cvs commit -m "..."' to simplify
+ keeping a change log in the patch documentation?
+
+parse-patch:
+
+ - Handle SIGINT in parse-patch -u (in the part that moves the
+ temp file to the patch)?
+
+backup-files:
+
+ - Extend so that it can also copy files instead of hard linking,
+ and when hard links are not possible. Also add option to
+ disallow hard links on the original file (for patchadd).
+
+ - SIGINT handling?
+
+quilt import:
+
+ - Add option to replace the currently applied patch with a new
+ one, by backing out the topmost patch first.
+
+ - Diff -u the documentation of the old and new file, unless one
+ of them is empty. Let the user decide whether to keep the left
+ or the right documentation, or to merge them both. (-d{ona}?)
+
+quilt add:
+
+ - Add option for creating (or rather, leaving) hard links.
+
+
+quilt setup:
+
+ - spec2series also prints -p1; omit.
+
+quilt patches:
+
+ - Add something so that it's possible to show a list of all
+ patches, with those patches marked that modify the
+ specified file.
+
+rpatch:
+
+ - If not removing the topmost patch, add checks if any files are
+ hidden by later patches. If so, refuse to remove patch! (Note
+ that poppatch takes care of that currently.)
+
+apatch:
+
+ - Allow to add a patch in the middle of the applied series, and
+ inject the patch in its proper position in applied-patches.
+ Needs to check if any of the files in the patch are touched by
+ later patches.
+
+touched_by_patch:
+
+ - Implement more of patch's filename heuristic: The following
+ file is not recognized, for example...
+
+ *** linux/drivers/parport/parport_cs.c.orig Sun Jun 23 09:20:21 2002
+ --- linux/drivers/parport/parport_cs.c Sun Jun 23 09:21:02 2002
+ ***************
+ *** 48,53 ****
+ --- 48,54 ----
+
+ #include <linux/parport.h>
+ #include <linux/parport_pc.h>
+ + #include <linux/major.h>
+
+ #include <pcmcia/version.h>
+ #include <pcmcia/cs_types.h>
+
--- /dev/null
+#-*- mode: shell-script;-*-
+
+# Programmed completion for bash to use quilt
+# Copyright 2003 Martin Quinson <martin.quinson@tuxfamily.org>
+
+# This file is part of the distribution of quilt, and is distributed under
+# the same licence than quilt itself
+
+have quilt &&
+_quilt()
+{
+ if [ "$(type -t patch_file_name)" != function ]
+ then
+ if ! [ -r /usr/share/quilt/scripts/patchfns ]
+ then
+ # Cannot read library /usr/share/quilt/scripts/patchfns
+ return 0
+ fi
+ . /usr/share/quilt/scripts/patchfns
+ fi
+
+ local i cur prev cmds patches pcount patch_nums
+
+ COMPREPLY=()
+ cur=${COMP_WORDS[COMP_CWORD]}
+ prev=${COMP_WORDS[COMP_CWORD-1]}
+
+ # commands (added to patches)
+ cmds='add applied delete diff files import new next patches pop \
+ previous push refresh remove series setup top unapplied'
+
+ patches=`cat_series`
+ pcount=`cat_series | wc -l`
+ patch_nums=`i=0; while [[ ++i -le $pcount ]] ; do echo $i; done `
+
+ if [[ $COMP_CWORD -eq 1 ]] ; then
+ # if no command were given, complete on commands
+ COMPREPLY=( $( compgen -W "$cmds -h" -- $cur ) )
+ return 0
+ else
+ # if we're completing for 'quilt -h', then just
+ # complete on any valid command
+ if [ ${COMP_WORDS[1]} == -h ] ; then
+ COMPREPLY=( $( compgen -W "$cmds" -- $cur ) )
+ return 0
+ fi
+ fi
+
+ # Complete depending on options
+ case ${COMP_WORDS[1]} in
+ add)
+ case $prev in
+ -p)
+ COMPREPLY=( $( compgen -W "$patches" -- $cur ) )
+ ;;
+ *)
+ _filedir
+ COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-p -h" -- $cur ) )
+ ;;
+ esac
+ ;;
+ applied)
+ COMPREPLY=( $( compgen -W "-n -h $patches" -- $cur ) )
+ ;;
+ delete)
+ COMPREPLY=( $( compgen -W "$patches" -- $cur ) )
+ ;;
+ diff)
+ case $prev in
+ -p)
+ COMPREPLY=( $( compgen -W "0 1" -- $cur ) )
+ ;;
+ -P|-c)
+ COMPREPLY=( $( compgen -W "$patches" -- $cur ) )
+ ;;
+ *)
+ _filedir
+ COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-p -P -c -R -z -h" -- $cur ) )
+ ;;
+ esac
+ ;;
+ files)
+ COMPREPLY=( $( compgen -W "-v $patches" -- $cur ) )
+ ;;
+ import)
+ case $prev in
+ -p)
+ COMPREPLY=( $( compgen -W "0 1 2 3 4 5 6 7 8 9 10" -- $cur ) )
+ ;;
+ -n)
+ ;;
+ *)
+ _filedir
+ COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-p -n -f -h" -- $cur ) )
+ ;;
+ esac
+ ;;
+ new)
+ ;;
+ next|previous)
+ COMPREPLY=( $( compgen -W "-n $patches" -- $cur ) )
+ ;;
+ patches)
+ _filedir
+ COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-v -n -h" -- $cur ) )
+ ;;
+ pop)
+ COMPREPLY=( $( compgen -W "-a -f -R -q -v -h $patches $patch_nums" -- $cur ) )
+ ;;
+ push)
+ COMPREPLY=( $( compgen -W "-a -f -R -q -v -h --leave-rejects --interactive $patches $patch_nums" -- $cur ) )
+ ;;
+ refresh)
+ case $prev in
+ -p)
+ COMPREPLY=( $( compgen -W "0 1" -- $cur ) )
+ ;;
+ *)
+ COMPREPLY=( $( compgen -W "-p -f -h $patches" -- $cur ) )
+ ;;
+ esac
+ ;;
+ remove)
+ case $prev in
+ -p)
+ COMPREPLY=( $( compgen -W "$patches" -- $cur ) )
+ ;;
+ *)
+ _filedir
+ COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-p -h" -- $cur ) )
+ ;;
+ esac
+ ;;
+ series)
+ COMPREPLY=( $( compgen -W "-n -v -h" -- $cur ) )
+ ;;
+ setup)
+ case $prev in
+ -d)
+ _filedir -d
+ ;;
+ *)
+ _filedir
+ COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "-d -h" -- $cur ) )
+ ;;
+ esac
+ ;;
+ top)
+ ;;
+ unapplied)
+ COMPREPLY=( $( compgen -W "-n -h $patches" -- $cur ) )
+ ;;
+ esac
+ return 0
+}
+[ "$have" ] && complete -F _quilt $filenames quilt
+
--- /dev/null
+.\" Automatically generated by Pod::Man v1.34, Pod::Parser v1.13
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. | will give a
+.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to
+.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C'
+.\" expand to `' in nroff, nothing in troff, for use with C<>.
+.tr \(*W-|\(bv\*(Tr
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. nr % 0
+. rr F
+.\}
+.\"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.hy 0
+.if n .na
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "GUARDS 1"
+.TH GUARDS 1 "2003-07-25" "perl v5.8.0" "User Contributed Perl Documentation"
+.SH "NAME"
+guards \- select from a list of files guarded by conditions
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+\&\fIguards\fR [\-\-prefix=\fIdir\fR] [\-\-path=\fIdir2:dir2:...\fR]
+ [\-\-default=\fI0\fR|\fI1\fR] [\-\-check] [\-\-config=\fIfile\fR]
+ \fIsymbol\fR ...
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+The script reads a configuration file that may contain so-called guards, file
+names, and comments, and writes those file names that satisfy all guards to
+standard output. The script takes a list of symbols as its arguments. Each line
+in the ocnfiguration file is processed separately. Lines may start with a
+number of guards. The following guards are defined:
+.Sp
+.RS 4
++\fIxxx\fR Include the file(s) on this line if the symbol \fIxxx\fR is defined.
+.Sp
+\&\-\fIxxx\fR Exclude the file(s) on this line if the symbol \fIxxx\fR is defined.
+.Sp
++!\fIxxx\fR Include the file(s) on this line if the symbol \fIxxx\fR is not defined.
+.Sp
+\&\-!\fIxxx\fR Exclude the file(s) on this line if the symbol \fIxxx\fR is not defined.
+.Sp
+\&\- Exclude this file. Used to avoid spurious \fI\-\-check\fR messages.
+.RE
+.PP
+The guards are processed left to right. The last guard that matches determines
+if the file is included. If no guard is specified, the \fI\-\-default\fR
+setting determines if the file is included.
+.PP
+If no configuration file is specified, the script reads from standard input.
+.PP
+The \fI\-\-check\fR option is used to compare the specification file against the
+file system. If files are referenced in the specification that do not exist, or
+if files are not enlisted in the specification file warnings are printed. The
+\&\fI\-\-path\fR option can be used to specify which directory or directories to scan.
+Multiple directories are eparated by a colon (\f(CW\*(C`:\*(C'\fR) character. The
+\&\fI\-\-prefix\fR option specifies the location of the files.
+.SH "AUTHOR"
+.IX Header "AUTHOR"
+Andreas Gruenbacher <agruen@suse.de> (SuSE Linux \s-1AG\s0)
--- /dev/null
+#!@PERL@ -w
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+use FileHandle;
+use Getopt::Long;
+use strict;
+
+# Prototypes
+sub files_in($$);
+sub parse($$);
+sub help();
+
+sub slashme($) {
+ my ($dir) = @_;
+ $dir =~ s#([^/])$#$&/#; # append a slash if necessary
+ if ($dir eq './') {
+ return '';
+ } else {
+ return $dir;
+ }
+}
+
+# Generate a list of files in a directory
+#
+sub files_in($$) {
+ my ($dir, $path) = @_;
+ my $dh = new FileHandle;
+ my (@files, $file);
+
+
+ opendir $dh, length("$dir$path") ? "$dir$path" : '.'
+ or die "$dir$path: $!\n";
+ while ($file = readdir($dh)) {
+ next if $file =~ /^(\.|\.\.|\.#.*|CVS)$/;
+ if (-d "$dir$path$file") {
+ @files = (@files, files_in($dir, "$path$file/"));
+ } else {
+ #print "[$path$file]\n";
+ push @files, "$path$file";
+ }
+ }
+ closedir $dh;
+ return @files;
+}
+
+# Parse a configuration file
+# Callback called with ($patch, @guards) arguments
+#
+sub parse($$) {
+ my ($fh, $callback) = @_;
+
+ my $mode = 0;
+
+ while (<$fh>) {
+ my @guards = ();
+ s/(^|\s+)#.*//;
+ foreach my $token (split) {
+ if ($token =~ /^[-+]/) {
+ if ($mode == 1) {
+ @guards = ();
+ $mode = 0;
+ }
+ push @guards, $token;
+ } else {
+ $mode = 1;
+ #print "[" . join(",", @guards) . "] $patch\n";
+ &$callback($token, @guards);
+ }
+ }
+ }
+}
+
+# Command line options
+#
+my ($dir, $config, $default, $check) = ('', '-', 1, 0);
+my @path;
+
+# Help text
+#
+sub help() {
+ print "$0 - select from a list of files guarded by conditions\n";
+ print "SYNOPSIS: $0 [--prefix=dir] [--path=dir1:dir2:...]\n" .
+ " [--default=0|1] [--check] [--config=file] symbol ...\n\n" .
+ " (Default values: --path='" . join(':', @path) . "', " .
+ "--default=$default)\n";
+ exit 0;
+}
+
+# Parse command line options
+#
+Getopt::Long::Configure ("bundling");
+eval {
+ unless (GetOptions (
+ 'd|prefix=s' => \$dir,
+ 'c|config=s' => \$config,
+ 'C|check' => \$check,
+ 'p|path=s' => \@path,
+ 'D|default=i' => \$default,
+ 'h|help' => sub { help(); exit 0; })) {
+ help();
+ exit 1;
+ }
+};
+if ($@) {
+ print "$@";
+ help();
+ exit 1;
+}
+
+@path = ('.')
+ unless (@path);
+@path = split(/:/, join(':', @path));
+
+my $fh = ($config eq '-') ? \*STDIN : new FileHandle($config)
+ or die "$config: $!\n";
+
+$dir = slashme($dir);
+
+if ($check) {
+ # Check for duplicate files, or for files that are not referenced by
+ # the specification.
+
+ my $problems = 0;
+ my @files;
+
+ foreach (@path) {
+ @files = (@files, files_in($dir, slashme($_)));
+ }
+ my %files = map { $_ => 0 } @files;
+
+ parse($fh, sub {
+ my ($patch, @guards) = @_;
+ if (exists $files{$patch}) {
+ $files{$patch}++;
+ } else {
+ print "Not found: $dir$patch\n";
+ $problems++;
+ }});
+
+ $fh->close();
+
+ my ($file, $ref);
+ while (($file, $ref) = each %files) {
+ next if $ref == 1;
+
+ print "Unused: $file\n" if $ref == 0;
+ print "Multiple uses: $file\n" if $ref > 1;
+ $problems++;
+ }
+ exit $problems ? 1 : 0;
+
+} else {
+ # Generate a list of patches to apply.
+
+ my %symbols = map { $_ => 1 } @ARGV;
+
+ parse($fh, sub {
+ my ($patch, @guards) = @_;
+
+ my $selected;
+ if (@guards) {
+ # If the first guard is -xxx, the patch is included by default;
+ # if it is -xxx, the patch is excluded by default.
+ $selected = ($guards[0] =~ /^-/);
+
+ foreach (@guards) {
+ /^([-+])(!?)(.*)?/
+ or die "Bad guard '$_'\n";
+
+ # Check if the guard matches
+ if (($2 eq '!' && !exists $symbols{$3}) ||
+ ($2 eq '' && ( $3 eq '' || exists $symbols{$3}))) {
+ # Include or exclude
+ $selected = ($1 eq '+');
+ }
+ }
+ } else {
+ # If there are no guards, use the specified default result.
+ $selected = $default;
+ }
+
+ print "$dir$patch\n"
+ if $selected;
+ });
+
+ $fh->close();
+
+ exit 0;
+}
+
+__END__
+
+=head1 NAME
+
+guards - select from a list of files guarded by conditions
+
+=head1 SYNOPSIS
+
+F<guards> [--prefix=F<dir>] [--path=F<dir2:dir2:...>]
+ [--default=I<0>|I<1>] [--check] [--config=F<file>]
+ I<symbol> ...
+
+=head1 DESCRIPTION
+
+The script reads a configuration file that may contain so-called guards, file
+names, and comments, and writes those file names that satisfy all guards to
+standard output. The script takes a list of symbols as its arguments. Each line
+in the ocnfiguration file is processed separately. Lines may start with a
+number of guards. The following guards are defined:
+
+=over
+
++I<xxx> Include the file(s) on this line if the symbol I<xxx> is defined.
+
+-I<xxx> Exclude the file(s) on this line if the symbol I<xxx> is defined.
+
++!I<xxx> Include the file(s) on this line if the symbol I<xxx> is not defined.
+
+-!I<xxx> Exclude the file(s) on this line if the symbol I<xxx> is not defined.
+
+- Exclude this file. Used to avoid spurious I<--check> messages.
+
+=back
+
+The guards are processed left to right. The last guard that matches determines
+if the file is included. If no guard is specified, the I<--default>
+setting determines if the file is included.
+
+If no configuration file is specified, the script reads from standard input.
+
+The I<--check> option is used to compare the specification file against the
+file system. If files are referenced in the specification that do not exist, or
+if files are not enlisted in the specification file warnings are printed. The
+I<--path> option can be used to specify which directory or directories to scan.
+Multiple directories are eparated by a colon (C<:>) character. The
+I<--prefix> option specifies the location of the files.
+
+=head1 AUTHOR
+
+Andreas Gruenbacher <agruen@suse.de> (SuSE Linux AG)
+
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+export TEXTDOMAIN=quilt
+
+usage()
+{
+
+ echo $"Usage: quilt command [-h] ..."
+ #echo $"Commands are:" $(
+ # local command
+ # for command in @QUILT@/*
+ # do
+ # if [ -f "$command" -a -x "$command" ]
+ # then
+ # echo "${command#@QUILT@/}"
+ # fi
+ # done \
+ # | sort
+ #)
+ echo $"Commands are:"
+ quilt_commands \
+ | sort \
+ | column | column -t \
+ | sed -e 's/^/\t/'
+ exit 1
+}
+
+quilt_commands()
+{
+ local command
+ for command in @QUILT@/*
+ do
+ if [ -f "$command" -a -x "$command" ]
+ then
+ echo ${command##@QUILT@/}
+ fi
+ done
+}
+
+for arg in "$@"
+do
+ case $arg in
+ [^-]*)
+ if [ -z "$command" ]
+ then
+ command="$arg"
+ else
+ args[${#args[@]}]="$arg"
+ fi ;;
+ *)
+ args[${#args[@]}]="$arg" ;;
+ esac
+done
+
+if ! [ -f "@QUILT@/$command" -a -x "@QUILT@/$command" ]
+then
+ if [ -n "$command" ]
+ then
+ for arg in $(quilt_commands)
+ do
+ case "$arg" in
+ $command*)
+ commands[${#commands[@]}]="$arg"
+ ;;
+ esac
+ done
+ fi
+
+ if [ ${#commands[@]} -eq 0 ]
+ then
+ usage
+ elif [ ${#commands[@]} -eq 1 ]
+ then
+ command="${commands[0]}"
+ unset commands
+ else
+ echo "$command :" "${commands[@]}" >&2
+ exit 1
+ fi
+fi
+
+set -- "${args[@]}"
+unset arg args
+
+#. @QUILT@/$command
+bash -c ". @QUILT@/$command" "quilt ${command##*/}" "$@"
--- /dev/null
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd=$cpprog
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "$0: no input file specified" >&2
+ exit 1
+else
+ :
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d "$dst" ]; then
+ instcmd=:
+ chmodcmd=""
+ else
+ instcmd=$mkdirprog
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f "$src" ] || [ -d "$src" ]
+ then
+ :
+ else
+ echo "$0: $src does not exist" >&2
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "$0: no destination specified" >&2
+ exit 1
+ else
+ :
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d "$dst" ]
+ then
+ dst=$dst/`basename "$src"`
+ else
+ :
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+ '
+IFS="${IFS-$defaultIFS}"
+
+oIFS=$IFS
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS=$oIFS
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp=$pathcomp$1
+ shift
+
+ if [ ! -d "$pathcomp" ] ;
+ then
+ $mkdirprog "$pathcomp"
+ else
+ :
+ fi
+
+ pathcomp=$pathcomp/
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd "$dst" &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename "$dst"`
+ else
+ dstfile=`basename "$dst" $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename "$dst"`
+ else
+ :
+ fi
+
+# Make a couple of temp file names in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+ rmtmp=$dstdir/#rm.$$#
+
+# Trap to clean up temp files at exit.
+
+ trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
+ trap '(exit $?); exit' 1 2 13 15
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd "$src" "$dsttmp" &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
+
+# Now remove or move aside any old file at destination location. We try this
+# two ways since rm can't unlink itself on some systems and the destination
+# file might be busy for other reasons. In this case, the final cleanup
+# might fail but the new file should still install successfully.
+
+{
+ if [ -f "$dstdir/$dstfile" ]
+ then
+ $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
+ $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
+ {
+ echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
+ (exit 1); exit
+ }
+ else
+ :
+ fi
+} &&
+
+# Now rename the file to the real destination.
+
+ $doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
+
+fi &&
+
+# The final little trick to "correctly" pass the exit status to the exit trap.
+
+{
+ (exit 0); exit
+}
--- /dev/null
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT([quilt],[0.24],[quilt-dev@nongnu.org])
+AC_CONFIG_AUX_DIR(config)
+AC_PREREQ(2.53)
+AC_REVISION ($Revision: 1.1.2.1 $)
+
+PACKAGE_RELEASE=1
+AC_SUBST(PACKAGE_RELEASE)
+
+dnl Setup for backup-files compilation
+AC_HEADER_STDC
+AC_CHECK_FUNCS([mkdir])
+AC_CHECK_FUNCS([rmdir])
+AC_CHECK_FUNCS([strchr])
+AC_CHECK_FUNCS([strerror])
+AC_CHECK_FUNCS([strrchr])
+AC_C_CONST
+AC_FUNC_STAT
+
+AC_PROG_INSTALL
+
+AC_SYS_INTERPRETER
+if test "$interpval" != yes ; then
+ AC_MSG_WARN([no
+
+bash/perl scripts may not be invoked correctly due to problems with your
+systems implementation of #! being either broken or non-existant.
+])
+fi
+
+dnl Check for Bourne-Again Shell
+AC_ARG_WITH(bash, AC_HELP_STRING(
+ [--with-bash], [name of the bash executable to use]),
+ [
+ BASH="$withval"
+ AC_SUBST(BASH)
+ AC_MSG_NOTICE([Using bash executable $BASH])
+ ],[
+ AC_PATH_PROG(BASH, bash)
+ ])
+if test -z "$BASH" ; then
+ AC_MSG_ERROR([Please specify the location of bash with the option '--with-bash'])
+fi
+
+# It would be nice not to have to use backticks, but too many retarded sh
+# implementations still don't support $( )
+# BEWARE: There is a distinct possibility that we are currently running under
+# bash in this configure script (/bin/sh being a symlink to /bin/bash). Even
+# though the result /could/ be available to us directly as $BASH_VERSION we
+# don't want to use, or trust it, incase the user is specifying a different
+# bash executable.
+if `$BASH -c '[[ "$BASH_VERSION" \< "2.04" ]]'` ; then
+ AC_MSG_ERROR([
+$PACKAGE_NAME requires at least version 2.04 of bash, you can download a current
+version of bash from ftp.gnu.org
+])
+fi
+
+dnl Check for Perl
+AC_ARG_WITH(perl, AC_HELP_STRING(
+ [--with-perl], [name of the Perl executable to use]),
+ [
+ PERL="$withval"
+ AC_SUBST(PERL)
+ AC_MSG_NOTICE([Using Perl executable $PERL])
+ ],[
+ AC_PATH_PROGS(PERL, [perl perl5])
+ ])
+if test -z "$PERL" ; then
+ AC_MSG_ERROR([Please specify the location of Perl with the option '--with-perl'])
+fi
+
+dnl Check for sed
+AC_ARG_WITH(sed, AC_HELP_STRING(
+ [--with-sed], [name of the sed executable to use]),
+ [
+ SED="$withval"
+ AC_SUBST(SED)
+ AC_MSG_NOTICE([Using sed executable $SED])
+ ],[
+ SED="sed"
+ AC_SUBST(SED)
+ ])
+
+dnl Check for awk
+AC_ARG_WITH(awk, AC_HELP_STRING(
+ [--with-awk], [name of the awk executable to use]),
+ [
+ AWK="$withval"
+ AC_SUBST(AWK)
+ AC_MSG_NOTICE([Using awk executable $AWK])
+ ],[
+ AC_PATH_PROGS(AWK, [gawk awk])
+ ])
+
+dnl Test for awk features that may be mising?
+
+if test -z "$PERL" ; then
+ AC_MSG_ERROR([Please specify the location of Perl with the option '--with-perl'])
+fi
+
+dnl Checks for mktemp (for creating temporary files and directories)
+AC_ARG_WITH(mktemp, AC_HELP_STRING(
+ [--with-mktemp], [name of the mktemp executable to use (or 'none'
+ to use a quilt internal mechanism)]),
+ [
+ MKTEMP="$withval"
+ AC_SUBST(MKTEMP)
+ AC_MSG_NOTICE([Using mktemp executable $MKTEMP])
+ ],[
+ AC_PATH_PROG(MKTEMP, mktemp)
+ ])
+if test -z "$MKTEMP" -o "$MKTEMP" = "none" ; then
+ MKTEMP=internal_mktemp
+else
+ AC_MSG_CHECKING(whether $MKTEMP -d works)
+ if tempdir=`$MKTEMP -d /tmp/$PACKAGE_NAME.XXXXXX 2>/dev/null` && \
+ rmdir "$tempdir" ; then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR([
+'$MKTEMP -d' does not create temporary directories.
+If you don't have a version of mktemp that can create directories, you
+can specify '--with-mktemp=none' and $PACKAGE_NAME will use its own
+internal tempfile generation mechanism.
+])
+ fi
+fi
+
+dnl Check for diff
+AC_ARG_WITH(diff, AC_HELP_STRING(
+ [--with-diff], [name of the diff executable to use]),
+ [
+ DIFF="$withval"
+ AC_SUBST(DIFF)
+ AC_MSG_NOTICE([Using diff executable $DIFF])
+ ],[
+ AC_PATH_PROG(DIFF, diff)
+ ])
+if test -z "$DIFF"; then
+ AC_MSG_ERROR([Please specify the location of diff with the option '--with-diff'])
+fi
+
+dnl Check for patch
+AC_ARG_WITH(patch, AC_HELP_STRING(
+ [--with-patch], [name of the patch executable to use]),
+ [
+ PATCH="$withval"
+ AC_SUBST(PATCH)
+ AC_MSG_NOTICE([Using patch executable $PATCH])
+ ],[
+ AC_PATH_PROG(PATCH, patch)
+ ])
+if test -z "$PATCH"; then
+ AC_MSG_ERROR([Please specify the location of patch with the option '--with-patch'])
+fi
+
+# Sun's patch is a mess, issue a warning. But we are going to continue with
+# the build because you might just be lucky.
+AC_MSG_CHECKING([whether $PATCH will work])
+if $PATCH -v 2>&1 | grep -q "Sun" >/dev/null 2>&1; then
+ AC_MSG_RESULT(no)
+ AC_MSG_WARN([
+Sorry, you have a Sun version of patch which is notoriously buggy. $PACKAGE_NAME
+may function correctly, or minor errors may occur due to Sun's patch tool.
+Please consider upgrading to GNU patch, if you already have GNU patch then you
+can supply its path with the '--with-patch=' option.
+])
+elif $PATCH --version 2>&1 | grep -q "patch 2.0" >/dev/null 2>&1; then
+ AC_MSG_RESULT(no)
+ AC_MSG_WARN([
+Sorry, the version of patch you are using can cause severe problems when a patch
+creates a directory. $PACKAGE_NAME may well function correctly with this version
+of patch or small problems could creep in.
+Please consider upgrading your patch to a more recent version, if you already
+have a more recent version of patch then you can supply its path with the
+'--with-patch=' option.
+])
+else
+ AC_MSG_RESULT(yes)
+fi
+
+dnl Check for diffstat
+AC_ARG_WITH(diffstat, AC_HELP_STRING(
+ [--with-diffstat], [name of the diffstat executable to use]),
+ [
+ DIFFSTAT="$withval"
+ AC_SUBST(DIFFSTAT)
+ AC_MSG_NOTICE([Using diffstat executable $DIFFSTAT])
+ ],[
+ AC_PATH_PROG(DIFFSTAT, diffstat)
+ ])
+if test -z "$DIFFSTAT"; then
+ AC_MSG_WARN([
+diffstat does not appear to be in your path, this is not a fatal error however
+$PACKAGE_NAME has increased functionality if diffstat exists. If you have diffstat
+you can specify the location the option '--with-diffstat'.
+])
+fi
+
+dnl Check for NLS
+AC_ARG_ENABLE(nls, AC_HELP_STRING(
+ [--enable-nls], [include natural language support]))
+if test "$enableval" != "no"; then
+ AC_PATH_PROG(MSGFMT, msgfmt)
+fi
+if test "$enableval" = "yes" -a -z "$MSGFMT" ; then
+ AC_MSG_ERROR([
+You do not appear to have msgfmt, which is part of the GNU Gettext package. It
+is a required package as you chose the '--enable-nls' option to configure.
+You can download GNU Gettext from ftp.gnu.org
+])
+fi
+if test -z "$MSGFMT" ; then
+ AC_MSG_NOTICE([Building without natural language support])
+fi
+
+AC_CONFIG_FILES(Makefile)
+AC_OUTPUT
+
+dnl Print results
+AC_MSG_RESULT([])
+AC_MSG_RESULT([$PACKAGE_NAME version $PACKAGE_VERSION configured.])
+AC_MSG_RESULT([])
+AC_MSG_RESULT([Using '$prefix' for installation prefix.])
+
+# we don't need to see this just for the backup-files command
+# but we may as well spec it for the future
+#AC_MSG_RESULT([Using '$CC' for C compiler.])
+#AC_MSG_RESULT([Building with '$CFLAGS' for C compiler flags.])
+#AC_MSG_RESULT([Building with '$LIBS' for linker flags.])
+
+AC_MSG_RESULT([])
+AC_MSG_RESULT([Report bugs to $PACKAGE_BUGREPORT])
--- /dev/null
+The scripts in this package simplify working with a series of patches.
+The usual tasks like applying, refreshing and reversing are supported.
+
+docco.txt contains Adrew Morton's description of his suite of patch
+scripts. These scripts are based on Andrew's scripts, but include many
+changes. Please keep this in mind when reading Andrew's documentation.
+
+
+Concepts
+========
+
+(Please see docco.txt.)
+
+The scripts maintain a stack of patches, on top of which additional
+patches can be applied, and from with patches can be removed. The list of
+patches is kept in a file (searched for in this order in
+.pc/series, series, patches/series).
+
+The scripts keep meta information in the .pc/ directory. The .pc/
+directory contains:
+
+ .pc/applied-patches
+ The list of currently applied patches.
+
+ .pc/patch/.pc (for each applied patch)
+ A list of files modified by the patch.
+
+ .pc/patch/ (for each applied patch)
+ Copies of the files that the patch modifies,
+ before modifying. The original versions of
+ the files are needed for refreshing patches,
+ and for ensuring that removing a patch does
+ recreate the original file contents.
+
+
+Operation
+=========
+
+Patches to be applied must be listed in the series file.
+
+Patches are applied with pushpatch, and are removed with poppatch.
+
+Refpatch refreshes a patch.
+
+New patches can be added at the current position in the patch sequence
+with newpatch.
+
+Additional files to be modified can be added to a patch with patchadd.
+
+
+Installation
+============
+
+To start using the scripts the working directory must contain:
+
+ patches/
+ Patches to work with.
+
+ series (or patches/series)
+ List of patches in order of applying.
+
+The scripts will create the .pc/ directory that contains the meta
+information needed for managing the patches automatically.
+
+
+Series file
+===========
+
+The patches that are relevant for a project must be listed in the file
+series, which is searched for in .pc/, ./ and patches/ in this order.
+The patches will be applied in the order given. The series file has
+the following format:
+
+ # Comment
+ subdir/patch-file-name.patch [-pN]
+
+The location of patches is specified relative to the patches/ directory.
+Optionally a strip level (-p0, -p1, etc.) can be specified. When
+refreshing a patch, only levels 0 and 1 are supported.
+
+
+Command reference
+=================
+@REFERENCE@
+
+guards [--prefix=dir] [--path=dir1:dir2:...] [--default=0|1]
+ [--check] [--config=file] symbol ...
+
+ Convert a series file with conditional statements into a series
+ file as expected; see the guards(1) manual page.
+
+
+Helper files/scripts
+====================
+
+patchfns
+ A collection of functions.
+
+apatch
+ Add a patch. Used by pushpatch.
+
+rpatch
+ Remove a patch. Used by poppatch.
+
+parse-patch {-s|-u} section file [< replacement]
+ Select a %section from a patch (-s) or replace a
+ %section with the text from standard input (-u).
+
+touched-by-patch filename
+ Print a list of files modified by a patch file.
+
+backup-files
+ A simple utility that creates / restores / removes
+ backup files; this works around a patch bug (see BUGS).
+
--- /dev/null
+Patch management scripts
+Andrew Morton <akpm@digeo.com>
+18 October 2002
+
+This is a description of a bunch of shell scripts which I use for
+managing kernel patches. They are quite powerful. They can be used on
+projects other than the linux kernel. They are easy to use, and fast.
+
+You end up doing a ton of recompiling with these scripts, because
+you're pushing and popping all the time. ccache takes away the pain of
+all that. http://ccache.samba.org/ - be sure to put the cache
+directory on the same fs as where you're working so that ccache can use
+hardlinks.
+
+The key philosophical concept is that your primary output is patches.
+Not ".c" files, not ".h" files. But patches. So patches are the
+first-class object here.
+
+Installation
+============
+
+You place all the scripts somewhere in your path, or in
+/usr/lib/patch-scripts.
+
+Terminology
+===========
+
+The patch scripts require three special directories called "pc",
+"patches" and "txt".
+
+If the environment variable PATCHSCRIPTS is set, it is taken to to be
+the directory in which those three directories reside. Typically, it
+would be a relative pathname. So
+
+ setenv PATCHSCRIPTS ./i-put-them-here
+
+would tell the patch scripts to look in ./i-put-them-here/pc, etc.
+
+If PATCHSCRIPTS is not set, and the directory ./patch-scripts is
+present then the patch scripts will us ./patch-scripts/pc/,
+./patch-scripts/patches/ and ./patch-scripts/txt/.
+
+Otherwise, the patch scripts use ./pc, ./patches and ./txt.
+
+In this document, the symbol $P is used to describe the directory which
+holds the pc/, patches/ and txt/ directories, as determined by the
+above search.
+
+It is expected that $P will always expand to a relative path.
+
+Concepts
+========
+
+All work occurs with a single directory tree. All commands are invoked
+within the root of that tree. The scripts manage a "stack" of patches.
+
+Each patch is a changeset against the base tree plus the preceding patches.
+
+All patches are listed, in order, in the file ./series. You manage the
+series file. Lines in the series file which start with `#' are ignored.
+
+Any currently-applied patches are described in the file
+./applied-patches. The patch scripts manage this file.
+
+Each patch affects a number of files in the tree. These files are
+listed in a "patch control" file. These .pc files live in the
+directory $P/pc/
+
+Patches are placed in the directory $P/patches/
+
+Documentation for the patches is placed in $P/txt/
+
+So for a particular patch "my-first-patch" the following will exist:
+
+- An entry "my-first-patch.patch" in ./series
+
+- An entry "my-first-patch" in ./applied-patches (if it's currently applied)
+
+- A file $P/pc/my-first-patch.pc which contains the names of the
+ files which my-first-patch modifies, adds or removes
+
+- A file $P/txt/my-first-patch.txt which contains the patch's
+ changelog.
+
+- A file $P/patches/my-first-patch.patch, which is the output of the
+ patch scripts.
+
+Operation
+=========
+
+When a patch "my-patch" is applied with apatch, or with pushpatch
+(which calls apatch), all the affected files (from $P/pc/my-patch.pc)
+are copied to files with ~my-patch appended. So if $P/pc/my-patch.pc
+contained
+
+ kernel/sched.c
+ fs/inode.c
+
+then apatch will copy those files into kernel/sched.c~my-patch and
+fs/inode.c~my-patch. It will then apply the patch to kernel/sched.c
+and fs/inode.c
+
+When a diff is regenerated by refpatch (which calls mpatch), the diff
+is made between kernel/sched.c and kernel/sched.c~my-patch. How do the
+scripts know to use "~my-patch"? Because my-patch is the current
+topmost patch. It's the last line in ./applied-patches.
+
+In this way, the whole thing is stackable. If you have four patches
+applied, say "patch-1", "patch-2", "patch-3" and "patch-4", and if
+patch-2 and patch-4 both touch kernel/sched.c then you will have:
+
+ kernel/sched.c~patch-2 Original copy, before patch-2
+ kernel/sched.c~patch-4 Copy before patch-4. Contains changes
+ from patch-2
+ kernel/sched.c Current working copy. Contains changes
+ from patch-4.
+
+This means that your diff headers contain "~patch-name" in them, which
+is convenient documentation.
+
+Walkthrough
+===========
+
+Let's start.
+
+Go into /usr/src/linux (or wherever)
+
+ mkdir pc patches txt
+
+Now let's generate a patch
+
+ fpatch my-patch kernel/sched.c
+
+OK, we've copied kernel/sched.c to kernel/sched.c~my-patch. We've
+appended "my-patch" to ./applied-patches and we've put "kernel/sched.c"
+into the patch control file, pc/my-patch.pc.
+
+ Now edit kernel/sched.c a bit.
+
+Now we're ready to document the patch
+
+ Now write txt/my-patch.txt
+
+Now generate the patch
+
+ refpatch
+
+This will generate patches/my-patch.patch. Take a look.
+
+Now remove the patch
+
+ poppatch
+
+applied-patches is now empty, and the patch is removed.
+
+Now let's add a file to my-patch and then generate my-second-patch:
+
+ Add "my-patch.patch" to ./series (no blank lines in that file please)
+
+ pushpatch
+
+OK, the patch is applied again. Let's add another file
+
+ fpatch kernel/printk.c
+
+Note that here we gave fpatch a single argument. So rather than
+opening a new patch, it adds kernel/printk.c to the existing topmost
+patch. That's my-patch.
+
+ Edit kernel/printk.c
+
+Refresh my-patch (you end up running refpatch a lot)
+
+ refpatch
+
+Now start a second patch:
+
+ fpatch my-second-patch kernel/sched.c
+
+Now take a look at applied-patches. Also do an `ls kernel/sched*'.
+
+ Edit kernel/sched.c, to make some changes for my-second-patch
+
+Generate my-second-patch:
+
+ refpatch
+
+Take a look in patches/my-second-patch.patch
+
+Don't forget to add "my-second-patch.patch" to the series file.
+
+And remove both patches:
+
+ poppatch
+ poppatch
+
+
+That's pretty much it, really.
+
+
+Command reference
+=================
+
+Generally, where any of these commands take a "patch-name", that can be
+of the form txt/patch-name.txt, patch-name.pc, just patch-name or
+whatever. The scripts will strip off a leading "txt/", "patches/" or
+"pc/" and any trailing extension. This is so you can do
+
+ apatch patches/a<tab>
+
+to conveniently use shell tabbing to select patch names.
+
+
+
+added-by-patch
+
+ Some internal thing.
+
+apatch [-f] patch-name
+
+ This is the low-level function which adds patches. It does the
+ copying into ~-files and updates the applied-patches file. It
+ applies the actual patch.
+
+ apatch will do a patch --dry-run first and will refuse to apply the
+ patch if the dryrun fails.
+
+ So when you are getting rejects you do this:
+
+ pushpatch # This fails, due to rejects. Drat.
+ apatch -f patch-name # Force the patch
+ (or) pushpatch -f # Force the patch
+
+ OK, you've now applied patch-name, but you have rejects. Go fix
+ those up and do
+
+ refpatch
+
+ And you're ready to move on.
+
+combine-series output-file
+
+ It incrementally combinediffs all the patches in series to make a
+ complete patch for the series. Requires combinediff frmo patchutils.
+
+ See http://cyberelk.net/tim/patchutils/ (Don't download the
+ "experimental" patchutils - it seems to only have half of the
+ commands in it. Go for "stable")
+
+cvs-take-patch
+
+ I forget.
+
+export_patch
+
+ export the patches listed in ./series to a set of files which
+ are named in such a way that the sort order is the same as the
+ order of the series file.
+
+ Usage: export_patch directory [prefix]
+
+ Example:
+
+ Suppose ./series contains
+
+ mango.patch
+ orange.patch
+ banana.patch
+ apple.patch
+ pear.patch
+
+ export_patch ../mypatches fruit
+
+ The patches would be copied to
+
+ ../mypatches/p00001_fruit_mango.patch
+ ../mypatches/p00002_fruit_orange.patch
+ ../mypatches/p00003_fruit_banana.patch
+ ../mypatches/p00003_fruit_banana.patch
+ ../mypatches/p00003_fruit_banana.patch
+
+ Named in this way, someone may easily apply them:
+
+ cat mypatches/p*fruit* | patch -p1
+
+ If prefix is omitted, the patchnames will be transformed
+ such that "original.patch" becomes "pXXXXX_original.patch".
+
+fpatch [patch-name] foo.c
+
+ If patch-name is given, fpatch will start a new patch which
+ modifies (or adds, or removes) the single file foo.c. It updates
+ ./applied-patches and creates pc/patch-name.pc. fpatch will copy
+ foo.c to foo.c~patch-name in preparation for edits of foo.c.
+
+ If patch-name is not given then fpatch will add foo.c to the
+ current topmost patch. It will add "foo.c" to $P/pc/$(toppatch).pc.
+ It will copy foo.c to foo.c~$(toppatch).
+
+import_patch
+
+ Imports a set of patch files, creating $P/pc, $P/txt, $P/patches and
+ ./series as necessary. It also creates $P/txt/*.txt by stripping
+ off the top of the patches (and removes any diffstat output it finds,
+ so that it can eat refpatch output and export_patch output.) The
+ imported patch names are appended to the series file.
+
+ In creating the $P/txt/*.txt files, mail headers are stripped with
+ formail, preserving the "From:" and "Subject:" lines. "DESC" and
+ "EDESC" markers are added if they are not already present, using the
+ "From:" and "Subject:" lines for the DESC portion, if they are present.
+ (See "patchdesc" command, below, for more on these markers.)
+
+ Also, it can rename the patch file as it is imported by stripping out
+ a pattern. This is useful if, as often is the case, you have patch
+ sets with filenames designed to help sort the patches into the correct
+ order, such as "p001_xxx_funky_stuff.patch" you can have it automatically
+ renamed to funky_stuff.patch on import, and let the series file manage
+ the ordering.
+
+ Import_patch will uncompress patches (*.Z, *.bz2, *.gz) as necessary.
+
+ Usage:
+
+ import_patch [-p pattern] patchfile ...
+
+ Example:
+
+ % ls ../fruit/p*patch
+ ../fruit/p00001_northern_apple.patch
+ ../fruit/p00001_tropical_mango.patch
+ ../fruit/p00002_northern_pear.patch
+ ../fruit/p00002_tropical_orange.patch
+ ../fruit/p00003_tropical_banana.patch
+ % import_patch -p 'p[0-9]*_tropical_' ../fruit/p*tropical*
+ Recreated pc/mango.pc
+ Recreated pc/orange.pc
+ Recreated pc/banana.pc
+ % import_patch -p 'p[0-9]*_northern_' ../fruit/p*northern*
+ Recreated pc/apple.pc
+ Recreated pc/pear.pc
+
+ Then you can "pushpatch; refpatch" 5 times.
+
+inpatch
+
+ List the names of ths files which are affected by the current
+ topmost patch.
+
+ This is basically
+
+ cat pc/$(toppatch).pc
+
+join-patch patchname
+
+ "joins" the named patch to the current topmost patch.
+
+ Use this when you want to merge two patches into one. All the
+ files which `patchname' affects are added to pc/$(toppatch).pc (if
+ they are not already there) and patch `patchname' is applied. The
+ top patch remains unchanged. You'll need to run refpatch afterwards.
+
+mpatch
+
+ A low-level thing to generate patches
+
+new-kernel
+
+ Some thing I use for importing a new kernel from kernel.org
+
+p0-2-p1
+
+ Internal thing to convert patch -p0 form into patch -p1
+
+patchdesc
+
+ Generates a single-line description of a patch.
+
+ The txt/my-patch.txt files have the following format:
+
+ <start of file>
+ DESC
+ some short description
+ EDESC
+
+ The long description
+ <end of file>
+
+ I use
+
+ patchdesc $(cat series)
+
+ to generate short-form summaries of the patch series.
+
+patchfns
+
+ Internal utilities
+
+pcpatch
+
+ Standalone tool to generate a .pc file from a patch.
+
+ Say someone sends you "his-patch.diff". What you do is:
+
+ cp ~/his-patch.diff patches/his-patch.patch
+ pcpatch his-patch
+
+ This generates $P/pc/his-patch.pc and you're all set. Add
+ "his-patch.patch" to ./series in the right place and start pushing.
+
+p_diff
+
+ I forget
+
+poppatch
+
+ Remove one or more patches from the current stack. This command
+ does *not* use the series file. It works purely against
+ applied-patches.
+
+ Usage:
+
+ poppatch
+ Remove the topmost patch
+ poppatch 10
+ Remove ten patches
+ poppatch some-patch-name[.patch]
+ Remove patches until "some-patch-name" is top patch
+
+pstatus
+
+ Shows status of patches
+
+ Usage:
+ pstatus [patchfile ...]
+
+ One line per patch is output showing:
+ 1: Patch number in the series file
+ 2: Whether the patch is currently applied
+ 3: Name of patch
+ 4: Status of the patch (needs pcpatch, changelog, refpatch)
+
+ If no patchfiles are specified, $P/patches/*.patch
+ are assumed.
+
+ Caveats:
+ A patch set which contains separate patches to add a file
+ and modify that same file may give spurious "Needs refpatch"
+ status for the patch which adds the file or the topmost patch.
+
+ptkdiff
+
+ Two modes:
+
+ ptkdiff -
+
+ Run tkdiff against all the file affected
+ by $(toppatch). The diff is only for the changes made
+ by the top patch! ie: it's between "filename" and
+ "filename~toppatch-name".
+
+ ptkdiff filename
+
+ Just run tkdiff against that file,
+ showing the changes which are due to toppatch.
+
+pushpatch [-f]
+
+ Apply the next patch, from the series file.
+
+ This consults ./applied-patches to find out the top patch, then
+ consults ./series to find the next patch. And pushes it.
+
+ pushpatch
+
+ Apply the next patch
+
+ pushpatch 10
+
+ Apply the next ten patches
+
+ pushpatch some-patch-name
+
+ Keep pushing patches until "some-patch-name" is toppatch
+
+ pushpatch -f
+
+ Push the next patch, ignoring rejects.
+
+refpatch
+
+ regnerates the topmost patch. Reads all the affected files
+ from pc/$(toppatch).pc and diffs them against their tilde-files.
+
+ Also pastes into the patch your patch documentation and
+ generates a diffstat summary.
+
+removed-by-patch
+
+ Some thing.
+
+rename-patch
+
+ CVS rename for patches.
+
+rolled-up-patch
+
+ Bit of a hack. Is designed to generate a rolled-up diff of all
+ currently-applied patches. But it requires a ../linux-2.x.y tree to
+ diff against. Needs to be redone.
+
+rpatch
+
+ Internal command
+
+split-patch
+
+ Some thing someone write to split patches up. I don't use it.
+
+tag-series
+
+ Assuming you keep pc/*, patches/* and txt/* under CVS revision
+ control, tag-series allows you to tag a patchset's individual
+ components. I use
+
+ tag-series s2_5_44-mm3 pc/2.5.44-mm3-series
+
+ which will attach the cvs tag "s2_5_44-mm3" to every .pc, .patch
+ and .txt file which is mentioned in the series file
+ "pc/2.5.44-mm3-series".
+
+ It will also tag pc/2.5.44-mm3-series, which is a bit redundant
+ given that I use a different series file for each patchset release..
+
+
+toppatch
+
+ Print the name of the topmost patch. From ./applied-patches
+
+touched-by-patch patch-filename
+
+ List the names of files which are affected by a diff.
+
+unitdiff.py
+
+ Rasmus Andersen's script to convert a diff into minimum-context
+ form. This form has a better chance of applying if you're getting
+ nasty rejects. But patch can and will make mistakes when fed
+ small-context input.
+
+
+Work Practices
+==============
+
+I keep the kernel tree, the $P/pc/, $P/patches/ and $P/txt/ contents under
+CVS control. This is important...
+
+I have several "series" files. I keep these in $P/pc/foo-series and use
+
+ ln -s pc/foo-series series
+
+when I'm working on foo.
+
+If someone sends me a patch I'll do:
+
+ cp ~/whatever patches/his-patch.patch
+ pcpatch his-patch
+ apatch his-patch
+
+ If apatch fails then run `apatch -f his-patch' and fix the rejects.
+
+ refpatch
+
+ to clean up any fuzz.
+
+ poppatch
+ cvs add pc/his-patch.pc patches/his-patch.patch
+ cvs commit pc patches
+
+ Now edit ./series and place "his-patch.patch" in the appropriate place.
+
+
+If you're working on a particular patch (say, "dud-patch") and you
+balls something up, just run:
+
+ refpatch # Generate the crap patch
+ poppatch # Remove it all
+ rm patches/dud-patch.patch
+ cvs up patches/dud-patch.patch
+
+and all is well.
+
+
+Getting updates from Linus
+==========================
+
+What I do is to grab the latest -bk diff from
+http://www.kernel.org/pub/linux/kernel/people/dwmw2/bk-2.5/
+and do:
+
+ gzip -d < cs<tab> > patches/linus.patch
+ pcpatch linus
+ apatch linus | grep diff
+
+ Now fix up all the files which got deleted,
+ because there's something wrong with bitkeeper diffs:
+
+ cvs up -ko <missing files from the above diff>
+
+ apatch linus
+ $EDITOR linus/linus.txt
+
+ Add the changeset number to txt/linus.txt
+
+ refpatch
+ poppatch
+
+ Now add "linus.patch" as the first entry in your ./series file and
+ start pushing your other patches on top of that.
+
+BUGS
+====
+
+Tons and tons. The scripts are fragile, the error handling is ungraceful and
+if you do something silly you can end up in a pickle.
+
+Generally the scripts are very careful to not wreck your files or your
+patches. But they can get the ./applied-patches and ~-files into an
+awkward state.
+
+Usually you can sort it out by copying the ~-files back onto the originals
+and removing the last line from ./applied-patches. Or do a "refpatch ;
+poppatch ; rm patches/troublesome-patch.patch ; cvs up patches".
+
+If it's really bad, just blow away the entire tree and do a new CVS checkout.
+
+
+Working on non-kernel projects
+==============================
+
+Well it's the same thing. Say you've downloaded a copy of util-linux
+and you want to make a change:
+
+ cd /usr/src
+ tar xvfz ~/util-linux.tar.gz
+ cd util-linux
+ mkdir pc patches txt
+ fpatch my-patch sys-utils/rdev.c
+ fpatch sys-utils/ipcs.8
+ <edit, edit>
+ refpatch
+ <ship patches/my-patch.patch>
+
+How to balls things up
+======================
+
+Well here's one way. Suppose you have 20 patches applied, and three of
+them (say, "p1", "p6" and "p11") all modify "foo.c".
+
+Now you go and change foo.c.
+
+Well, to which patch does that change belong? You need to decide.
+Let's say you decide "p6".
+
+If you run `refpatch' when "p11" is toppatch then you lose. The diff
+went into p11.
+
+What you can do is:
+
+1:
+ poppatch p6
+ <edit>
+ refpatch
+ pushpatch p11
+ <test>
+
+ (See why ccache is looking good?)
+
+or
+
+2:
+ <edit>
+ <test>
+ poppatch p6 <hope like hell that the other patches remove cleanly>
+ refpatch
+
+
+Another good way of ballsing up is to cheat. Say "oh I just want to make
+this one-line change". And "oh, and this one".
+
+Now you're getting in a mess. It's much, much better to just use the system:
+
+ fpatch junk file1
+ fpatch file2
+ <edit>
+ <play>
+ refpatch
+ poppatch
+ rm pc/junk.pc patches/junk.patch
+
+Merging with -mm kernels
+========================
+
+Haven't tried this, but it should work:
+
+- Grab all the patches from broken-out/, place them in your $P/patches/
+
+- Copy my series file into ./series (or $P/pc/akpm-series and symlink it)
+
+- pushpatch 99
+
+And you're off and running. The nice thing about this is that you can
+send me incremental diffs to diffs which I already have.
+
+Or whatever. I'm fairly handy with diffs nowadays. Rejects are
+expected. I just prefer to have "one concept per diff".
+
--- /dev/null
+/*
+ File: backup-files.c
+
+ Copyright (C) 2003 Andreas Gruenbacher <agruen@suse.de>
+ SuSE Labs, SuSE Linux AG
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+/*
+ * Create backup files of a list of files similar to GNU patch. A path
+ * name prefix and suffix for the backup file can be specified with the
+ * -B and -Z options.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+
+const char *progname;
+
+enum { what_backup, what_restore, what_remove };
+
+const char *opt_prefix="", *opt_suffix="", *opt_file=NULL;
+int opt_silent=0, opt_what=what_backup;
+
+#define LINE_LENGTH 1024
+
+
+void
+usage(void)
+{
+ printf("Usage: %s [-B prefix] [-z suffix] [-f {filelist|-}] [-s] [-r|-x] filename ...\n"
+ "\n"
+ "\tCreate hard linked backup copies of a list of files\n"
+ "\tread from standard input.\n"
+ "\n"
+ "\t-r\tRestore the backup\n"
+ "\t-x\tRemove backup files and empty parent directories\n"
+ "\t-B\tPath name prefix for backup files\n"
+ "\t-z\tPath name suffix for backup files\n"
+ "\t-s\tSilent operation; only print error messages\n\n",
+ progname);
+}
+
+void
+create_parents(char *filename)
+{
+ struct stat st;
+ char *f = strchr(filename, '/');
+
+ if (f == NULL)
+ return;
+ *f = '\0';
+ if (stat(f, &st) != 0) {
+ while (f != NULL) {
+ *f = '\0';
+ mkdir(filename, 0777);
+ *f = '/';
+ f = strchr(f+1, '/');
+ }
+ } else {
+ *f = '/';
+ }
+}
+
+void
+remove_parents(char *filename)
+{
+ char *f, *g = NULL;
+
+ f = strrchr(filename, '/');
+ while ((f = strrchr(filename, '/')) != NULL) {
+ if (g != NULL)
+ *g = '/';
+ g = f;
+ *f= '\0';
+
+ rmdir(filename);
+ }
+ if (g != NULL)
+ *g = '/';
+}
+
+static int
+link_or_copy(const char *from, const char *to)
+{
+ char buffer[4096];
+ int from_fd, to_fd, error = 1;
+ size_t len;
+
+ if (link(from, to) == 0)
+ return 0;
+ if (errno != EXDEV && errno != EPERM && errno != EMLINK) {
+ fprintf(stderr, "Could not link file `%s' to `%s': %s\n",
+ from, to, strerror(errno));
+ return 1;
+ }
+
+ if ((from_fd = open(from, O_RDONLY)) == -1) {
+ perror(from);
+ return 1;
+ }
+ if ((to_fd = open(to, O_WRONLY|O_TRUNC))) {
+ perror(to);
+ close(from_fd);
+ return 1;
+ }
+ while ((len = read(from_fd, buffer, sizeof(buffer))) > 0) {
+ if ((write(to_fd, buffer, len)) == -1) {
+ perror(to);
+ unlink(to);
+ goto out;
+ }
+ }
+ if (len != 0) {
+ perror(from);
+ unlink(to);
+ goto out;
+ }
+
+ error = 0;
+out:
+ close(from_fd);
+ close(to_fd);
+
+ return error;
+}
+
+int
+process_file(char *file)
+{
+ char backup[LINE_LENGTH];
+
+ if (strlen(opt_prefix) + strlen(file) +
+ strlen(opt_suffix) >= sizeof(backup)) {
+ perror("Line buffer too small\n");
+ return 1;
+ }
+
+ snprintf(backup, sizeof(backup), "%s%s%s",
+ opt_prefix, file, opt_suffix);
+
+ if (opt_what == what_backup) {
+ struct stat st;
+ int new_file = (stat(file, &st) == -1 && errno == ENOENT);
+
+ unlink(backup);
+ create_parents(backup);
+ if (new_file) {
+ int fd;
+
+ if (!opt_silent)
+ printf("New file %s\n", file);
+ if ((fd = creat(backup, 0666)) == -1) {
+ perror(backup);
+ return 1;
+ }
+ close(fd);
+ } else {
+ if (!opt_silent)
+ printf("Copying %s\n", file);
+ if (link_or_copy(file, backup) != 0)
+ return 1;
+ }
+ return 0;
+ } else if (opt_what == what_restore) {
+ struct stat st;
+
+ create_parents(file);
+ if (stat(backup, &st) != 0) {
+ perror(backup);
+ return 1;
+ }
+ if (st.st_size == 0) {
+ if (unlink(file) == 0 || errno == ENOENT) {
+ if (!opt_silent)
+ printf("Removing %s\n", file);
+ unlink(backup);
+ remove_parents(backup);
+ } else {
+ perror(file);
+ return 1;
+ }
+ } else {
+ if (!opt_silent)
+ printf("Restoring %s\n", file);
+ unlink(file);
+ if (link(backup, file) == -1) {
+ if (link_or_copy(backup, file) != 0)
+ return 1;
+ unlink(backup);
+ remove_parents(backup);
+ }
+ }
+ return 0;
+ } else if (opt_what == what_remove) {
+ unlink(backup);
+ remove_parents(backup);
+ return 0;
+ } else
+ return 1;
+}
+
+int
+main(int argc, char *argv[])
+{
+ int opt, status=0;
+
+ progname = argv[0];
+
+ while ((opt = getopt(argc, argv, "rxB:z:f:sh")) != -1) {
+ switch(opt) {
+ case 'r':
+ opt_what = what_restore;
+ break;
+
+ case 'x':
+ opt_what = what_remove;
+ break;
+
+ case 'B':
+ opt_prefix = optarg;
+ break;
+
+ case 'f':
+ opt_file = optarg;
+ break;
+
+ case 'z':
+ opt_suffix = optarg;
+ break;
+
+ case 's':
+ opt_silent = 1;
+ break;
+
+ case 'h':
+ default:
+ usage();
+ return 0;
+ }
+ }
+
+ if ((*opt_prefix == '\0' && *opt_suffix == '\0') ||
+ (opt_file == NULL && optind == argc)) {
+ usage();
+ return 1;
+ }
+
+ if (opt_file != NULL) {
+ FILE *file;
+ char line[LINE_LENGTH];
+
+ if (!strcmp(opt_file, "-")) {
+ file = stdin;
+ } else {
+ if ((file = fopen(opt_file, "r")) == NULL) {
+ perror(opt_file);
+ return 1;
+ }
+ }
+
+ while (fgets(line, sizeof(line), file)) {
+ char *l = strchr(line, '\0');
+
+ if (l > line && *(l-1) == '\n')
+ *(l-1) = '\0';
+ if (*line == '\0')
+ continue;
+
+ if ((status = process_file(line)) != 0)
+ return status;
+ }
+
+ if (file != stdin) {
+ fclose(file);
+ }
+ }
+ for (; optind < argc; optind++) {
+ if ((status = process_file(argv[optind])) != 0)
+ return status;
+ }
+
+ return status;
+}
--- /dev/null
+QUILT_IN := add applied delete diff files import new next patches \
+ pop previous push refresh remove series setup top unapplied
+SCRIPTS_IN := apatch rpatch patchfns spec2series patchfns
+# scripts/parse-patch is perl based
+
+# LINGUAS = ...
+# localedir = ...
+
+all: $(LINGUAS:%=%.mo)
+
+%.mo : %.po
+ msgfmt --statistics -o $@ $<
+
+%.po : quilt.pot
+ msgmerge -o $@ $@ $^
+
+quilt.pot: $(QUILT_IN:%=../quilt/%.in) $(SCRIPTS_IN:%=../scripts/%.in) ../bin/quilt.in
+ rm -f quilt.pot; touch quilt.pot
+ for file in $+ ; do \
+ bash --dump-po-strings $$file \
+ |msguniq \
+ |msgcat --force-po -F - quilt.pot -o quilt.pot; \
+ done
+
+clean:
+ rm -f *.mo *~
+
+install: all
+ for lang in $(LINGUAS) ; do \
+ install -d $(BUILD_ROOT)$(localedir)/$$lang/LC_MESSAGES ; \
+ install -m 644 $$lang.mo \
+ $(BUILD_ROOT)$(localedir)/$$lang/LC_MESSAGES/quilt.mo ; \
+ done
+
+.PHONY: install clean all
--- /dev/null
+# German quilt translation
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Andreas Gruenbacher <agruen@suse.de>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: quilt 0.21\n"
+"PO-Revision-Date: 2003-02-15 22:15 +0100\n"
+"Last-Translator: Andreas Gruenbacher <agruen@suse.de>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../bin/quilt.in:14
+msgid "Usage: quilt command [-h] ..."
+msgstr "Verwendung: quilt befehl [-h] ..."
+
+#: ../bin/quilt.in:26
+msgid "Commands are:"
+msgstr "Folgende Befehle gibt es:"
+
+#: ../quilt/add.in:22
+msgid "Usage: quilt add [-p patch] {file} ..."
+msgstr "Verwendung: quilt add [-p patch] {datei} ..."
+
+#: ../quilt/add.in:25
+msgid ""
+"\n"
+"\n"
+"Add one or more files to the topmost or named patch. Files must be\n"
+"added to the patch before being modified. Files that are modified by\n"
+"patches on top of the specified patch cannot be added.\n"
+"\n"
+"-p patch\n"
+"\tPatch to add files to."
+msgstr ""
+"\n"
+"\n"
+"Fügt eine oder mehrere Dateien zum obersten oder angegebenen Patch\n"
+"hinzu. Dateien müssen einem Patch hinzugefügt werden, bevor sie\n"
+"verändert werden. Dateien können einem Patch nur hinzugefügt werden,\n"
+"solange sie von keinem Patch höher auf dem Stapel verändert werden.\n"
+"\n"
+"-p patch\n"
+"\tDer Patch, zu dem die Dateien hinzugefügt werden sollen."
+
+#: ../quilt/add.in:75 ../quilt/delete.in:69 ../quilt/files.in:74
+#: ../quilt/push.in:184 ../quilt/remove.in:75
+msgid "No patch applied"
+msgstr "Kein Patch angewandt"
+
+#: ../quilt/add.in:80 ../quilt/applied.in:70 ../quilt/refresh.in:113
+#: ../quilt/remove.in:80
+msgid "Patch $patch is not applied"
+msgstr "Patch $patch ist nicht angewandt"
+
+#: ../quilt/add.in:89
+msgid "File $file is already in patch $patch"
+msgstr "Datei $file ist bereits in Patch $patch enthalten"
+
+#: ../quilt/add.in:96 ../quilt/remove.in:97
+msgid "File $file modified by patch $next_patch"
+msgstr "Datei $file wird von Patch $next_patch verändert"
+
+#: ../quilt/add.in:104
+msgid "Failed to back up file $file"
+msgstr "Konnte Datei $file nicht sichern"
+
+#: ../quilt/add.in:124
+msgid "File $file added to patch $patch"
+msgstr "Datei $file zu Patch $patch hinzugefügt"
+
+#: ../quilt/applied.in:22
+#, fuzzy
+msgid "Usage: quilt applied [-n] [patch]"
+msgstr "Verwendung: quilt applied [patch]"
+
+#: ../quilt/applied.in:25
+#, fuzzy
+msgid ""
+"\n"
+"\n"
+"Print a list of applied patches.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Gibt den Namen des Patches vor dem obersten oder angegebenen\n"
+"Patch in der series-Datei aus.\n"
+"\n"
+"-n\tPatch-Dateinamen statt Patch-Namen ausgeben.\n"
+"\n"
+
+#: ../quilt/delete.in:22
+msgid "Usage: quilt delete [patch]"
+msgstr "Verwendung: quilt delete [patch]"
+
+#: ../quilt/delete.in:25
+msgid ""
+"\n"
+"\n"
+"Remove the specified or topmost patch from the series file. If the\n"
+"patch is applied, quilt will attempt to remove it first. (Only the\n"
+"topmost patch can be removed right now.)"
+msgstr ""
+"\n"
+"\n"
+"Löscht den obersten oder angegebenen Patch aus der series-Datei. Falls\n"
+"dieser Patch angewandt ist, entfernt quilt ihn zuerst. (Momentan kann \n"
+"nur der oberste Patch entfernt werden.)"
+
+#: ../quilt/delete.in:75
+msgid "Patch $patch does not exist"
+msgstr "Patch $patch existiert nicht"
+
+#: ../quilt/delete.in:84
+msgid "Patch $patch is currently applied"
+msgstr "Patch $patch ist momentan angewandt"
+
+#: ../quilt/delete.in:90
+msgid "Failed to remove patch $patch"
+msgstr "Konnte Patch $patch nicht entfernen"
+
+#: ../quilt/diff.in:27
+msgid "Usage: quilt diff [-p n] [-c patch|-z] [-R] [-P patch] [file ...]"
+msgstr ""
+"Verwendung: quilt diff [-p n] [-c patch|-z] [-R] [-P patch] [datei ...]"
+
+#: ../quilt/diff.in:31
+#, fuzzy
+msgid ""
+"\n"
+"\n"
+"Produces a diff of the specified file(s) in the topmost or specified\n"
+"patch. If no files are specified, all files that are modified are\n"
+"included.\n"
+"\n"
+"-p n\tCreate a -p n style patch (-p0 or -p1 are supported).\n"
+"\n"
+"-P patch\n"
+"\tCreate a diff for the specified patch. (Defaults to the topmost\n"
+"\tpatch.)\n"
+"\n"
+"-c patch\n"
+"\tCreate a combined diff for all patches between this patch and\n"
+"\tthe patch specified with -P. A patch name of \\\"-\\\" is equivalent\n"
+"\tto specifying the first applied patch.\n"
+"\n"
+"-R\tCreate a reverse diff.\n"
+"\n"
+"-z\tWrite to standard output the changes that have been made\n"
+"\trelative to the topmost or specified patch.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Erzeugt ein Diff der angegebenen Dateien im obersten oder angegebenen\n"
+"Patch. Wenn keine Dateien angegeben sind, werden alle im Patch\n"
+"enthaltenen Dateien einbezogen.\n"
+"\n"
+"-p n\tErzeugt einen -p n Patch (n=0 oder n=1 wird unterstützt).\n"
+"\n"
+"-P patch\n"
+"\tErzeuge ein Diff für den angegebenen Patch. (Wenn nicht angegeben,\n"
+"\toberster Patch.)\n"
+"\n"
+"-c patch\n"
+"\tErzeuge ein kombiniertes Diff für alle Patches zwischen diesem und\n"
+"\tdem mit -P angegebenen Patch.\n"
+"\n"
+"-R\tErzeuge ein umgekehrtes Diff.\n"
+"\n"
+"-z\tÄnderungen relativ zum angewandten Patch ausgeben.\n"
+"\n"
+
+#: ../quilt/diff.in:132
+msgid "Options \\`-c patch' and \\`-z' cannot be combined."
+msgstr "Die Optionen \\`-c patch' and \\`-z' können nicht kombiniert werden."
+
+#: ../quilt/diff.in:141 ../quilt/refresh.in:106
+msgid "No patch seem to be applied"
+msgstr "Es ist kein Patch angewandt"
+
+#: ../quilt/diff.in:148
+msgid "Patch $last_patch is not applied"
+msgstr "Patch $last_patch ist nicht angewandt"
+
+#: ../quilt/diff.in:158
+msgid ""
+"Cannot diff patches with -p$opt_strip_level, please specify -p0 or -p1 "
+"instead"
+msgstr ""
+"Kann kein Diff mit -p$opt_strip_level erzeugen, bitte -p0 oder -p1 verwenden."
+
+#: ../quilt/diff.in:166
+msgid "refresh_patches_per_file failed."
+msgstr "Fehler in refresh_patches_per_file."
+
+#: ../quilt/diff.in:179
+msgid "Patch $opt_combine not applied before $last_patch."
+msgstr "Patch $opt_combine ist nicht vor Patch $last_patch angewandt."
+
+#: ../quilt/diff.in:213
+msgid "File $file is not being modified."
+msgstr "Datei $file wird nicht verändert."
+
+#: ../quilt/diff.in:230
+msgid "Cannot change into .pc/$last_patch"
+msgstr "Kann nicht in Verzeichnis .pc/$last_patch wechseln."
+
+#: ../quilt/diff.in:235
+msgid "Failed to copy files to temporary directory"
+msgstr "Konnte Dateien nicht in ein temporäres Verzeichnis kopieren"
+
+#: ../quilt/diff.in:240
+msgid "Cannot change to temporary directory"
+msgstr "Kann nicht in temporäres Verzeichnis wechseln"
+
+#: ../quilt/diff.in:257
+msgid "Failed to patch temporary files"
+msgstr "Konnte temporäre Dateien nicht patchen"
+
+#: ../quilt/diff.in:264
+msgid "Cannot change to source directory"
+msgstr "Kann nicht in Quellverzeichnis wechseln"
+
+#: ../quilt/diff.in:293 ../quilt/refresh.in:144
+msgid "Diff failed, aborting."
+msgstr "Diff fehlgeschlagen, Abbruch."
+
+#: ../quilt/diff.in:300
+msgid "More recent patches modify files in $last_patch."
+msgstr "Später angewandte Patches verändern Dateien von $last_patch."
+
+#: ../quilt/files.in:22
+msgid "Usage: quilt files [-v] [patch]"
+msgstr "Verwendung: quilt files [-v] [patch]"
+
+#: ../quilt/files.in:25
+msgid ""
+"\n"
+"\n"
+"Print the list of files that the topmost or specified patch changes.\n"
+"\n"
+"-v\tVerbose, more user friendly output.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Gibt eine Liste der Dateien aus, die der oberste oder angegebene Patch\n"
+"beinhaltet.\n"
+"\n"
+"-v\tAusführlichere, benutzerfreundliche Ausgabe.\n"
+"\n"
+
+#: ../quilt/files.in:83
+msgid "Patch is not applied (no verbose output)"
+msgstr "Patch ist nicht angewandt (keine ausführliche Ausgabe)"
+
+#: ../quilt/files.in:86
+msgid "Patch is not applied"
+msgstr "Patch ist nicht angewandt"
+
+#: ../quilt/import.in:22
+msgid "Usage: quilt import [-f] [-p num] [-n patch] [patchfile]"
+msgstr "Verwendung: quilt import [-f] [-p num] [-n patch] [patchdatei]"
+
+#: ../quilt/import.in:25
+msgid ""
+"\n"
+"\n"
+"Import an external patch. If a patch file name is specified, the patch\n"
+"will be stored in this relative path in the patches/ directory. Else,\n"
+"if an input file name is given this name is used as the patch name.\n"
+"\n"
+"-p num\n"
+"\tNumber of directory levels to strip when aplying (default=1)\n"
+"\n"
+"-n patch\n"
+"\tFile name relative to patches/ to use.\n"
+"\n"
+"-f\tOverwite/update existing patches.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Importiert einen Patch aus einer Datei. Ist ein Patch-Dateiname\n"
+"angegeben, so wird er Patch in diesem Pfad relativ zum\n"
+"patches/-Verzeichnis abgelegt. Sonst wird (wenn angegeben) der\n"
+"Patch-Dateiname verwendet.\n"
+"\n"
+"-p num\n"
+"\tAnzahl der Verzeichnisebenen, die beim Anwenden des Patches entfernt\n"
+"\twerden (Standardwert=1)\n"
+"\n"
+"-n patch\n"
+"\tPatch-Dateiname relativ zum patches/-Verzeichnis.\n"
+"\n"
+"-f\tBestehende Patches überschreiben/aktualisieren.\n"
+"\n"
+
+#: ../quilt/import.in:97
+msgid "Please use -n to specify a patch file name."
+msgstr "Bitte -n verwenden, um einen Patch-Namen anzugeben."
+
+#: ../quilt/import.in:105
+msgid "Patch file name \\\"$patch_file\\\" contains whitespace."
+msgstr "Patch-Dateiname \\\"$patch_file\\\" enthält Leerstellen."
+
+#: ../quilt/import.in:111
+msgid "Patch $patch is applied."
+msgstr "Patch $patch ist angewandt."
+
+#: ../quilt/import.in:120
+msgid "Cannot read from standard input."
+msgstr "Kann nicht von der Standardeingabe lesen."
+
+#: ../quilt/import.in:129 ../quilt/import.in:138
+msgid "Cannot decompress file $input_file"
+msgstr "Kann Datei $input_file nicht dekomprimieren"
+
+#: ../quilt/import.in:146
+msgid "Cannot read from file $input_file"
+msgstr "Kann nicht von Datei $input_file lesen"
+
+#: ../quilt/import.in:155
+msgid "Patch $patch exists. Replace with -f."
+msgstr "Patch $patch existiert bereits. Ersetzen mit -f."
+
+#: ../quilt/import.in:162
+msgid "Updating %patch section of patch $patch"
+msgstr "Aktualisiere %patch-Abschnitt von Patch $patch"
+
+#: ../quilt/import.in:165
+msgid "Failed to update %patch section of patch $patch"
+msgstr "Konnte %patch-Abschnitt in Patch $patch nicht aktualisieren"
+
+#: ../quilt/import.in:169
+msgid "Replacing patch $patch with new version"
+msgstr "Ersetze Patch $patch durch neuere Version"
+
+#: ../quilt/import.in:172
+msgid "Failed to replace patch $patch"
+msgstr "Konnte Patch $patch nicht ersetzen"
+
+#: ../quilt/import.in:177
+msgid "Importing patch $patch (stored as $patch_file)"
+msgstr "Importiere Patch $patch (abgelegt als $patch_file)"
+
+#: ../quilt/import.in:184
+msgid "Failed to import patch $patch"
+msgstr "Konnte Patch $patch nicht importieren"
+
+#: ../quilt/import.in:194
+msgid "Failed to insert $patch in file series."
+msgstr "Konnte Patch $patch nicht in die series-Datei einfügen."
+
+#: ../quilt/new.in:22
+msgid "Usage: quilt new {patchname}"
+msgstr "Verwendung: new {patchname}"
+
+#: ../quilt/new.in:25
+msgid ""
+"\n"
+"\n"
+"Create a new patch with the specified file name, and insert it after the\n"
+"topmost patch in the patch series file.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Erzeugr einen neuen Patch mit dem angegebenen Dateinamen, und fügt\n"
+"ihn nach dem obersten Patch in die series-Datei ein.\n"
+"\n"
+
+#: ../quilt/new.in:67
+msgid "Patch $patch exists already"
+msgstr "Patch $patch existiert bereits"
+
+#: ../quilt/new.in:77
+msgid "Failed to create patch $patch"
+msgstr "Konnte Patch $patch nicht erzeugen"
+
+#: ../quilt/new.in:80
+msgid "Patch $patch is now on top"
+msgstr "Der oberste Patch ist jetzt $patch"
+
+#: ../quilt/next.in:22
+msgid "Usage: quilt next [patch]"
+msgstr "Verwendung: quilt next [patch]"
+
+#: ../quilt/next.in:25
+msgid ""
+"\n"
+"\n"
+"Print the name of the next patch after the specified or topmost patch in\n"
+"the series file.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Gibt den Namen des nächsten Patches nach dem obersten oder angegebenen\n"
+"Patch in der series-Datei aus.\n"
+"\n"
+"-n\tPatch-Dateinamen statt Patch-Namen ausgeben.\n"
+"\n"
+
+#: ../quilt/patches.in:22
+msgid "Usage: quilt patches {file}"
+msgstr "Verwendung: quilt patches {file}"
+
+#: ../quilt/patches.in:25
+msgid ""
+"\n"
+"\n"
+"Print the list of patches that modify the specified file.\n"
+"\n"
+"-n\tPrint the patch file names instead of the patch names.\n"
+"\n"
+"-v\tVerbose, more user friendly output.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Gibt die Liste der Patches aus, die die angegebene Datei verändern.\n"
+"\n"
+"-n\tPatch-Dateinamen statt Patch-Namen ausgeben.\n"
+"\n"
+"-v\tAusführlichere, benutzerfreundliche Ausgabe.\n"
+"\n"
+
+#: ../quilt/pop.in:22
+msgid "Usage: quilt pop [-afRqv] [num|patch]"
+msgstr "Verwendung: quilt pop [-afRqv] [num|patch]"
+
+#: ../quilt/pop.in:25
+msgid ""
+"\n"
+"\n"
+"Remove patch(es) from the current stack. A number of patches to remove,\n"
+"or a patch name can be specified. If a patch name is given, remove all\n"
+"patches applied on top of the named patch. If neither a number nor a\n"
+"patch name is specified, remove the next patch from the series file.\n"
+"\n"
+"-a\tRemove all applied patches.\n"
+"\n"
+"-f\tForce remove. The state before the patch(es) were applied will\n"
+"\tbe restored from backup files.\n"
+"\n"
+"-R\tRemove the patch with \\`patch -R' and check if the patch reverts\n"
+"\tall changes properly.\n"
+"\n"
+"-q\tQuiet operation.\n"
+"\n"
+"-v\tVerbose operation.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Entfernt Patches vom Stapel. Es kann eine Anzahl von Patches, die\n"
+"entfernt werden soll, oder der Name eines Patches angegeben werden.\n"
+"Wenn ein Name angegeben wird, werden alle Patches über dem angegebenen\n"
+"Patch entfernt. Wenn weder ein Patchname noch eine Nummer angegeben\n"
+"wird, wird der oberste Patch entfernt.\n"
+"\n"
+"-a\tAlle angewandten Patches entfernen.\n"
+"\n"
+"-f\tErzwungenes Entfernen. Der Zustand vor dem Anwenden das Patches wird\n"
+"\tüber die Sicherungsdateien wiederhergestellt.\n"
+"\n"
+"-R\tEntfernen über \\`patch -R'. Überprüft auch, ob der\n"
+"\tAusgangszustand vor dem Anwenden des Patches wieder erreicht wird.\n"
+"\n"
+"-q\tWenige Meldungen ausgeben.\n"
+"\n"
+"-v\tViele Meldungen ausgeben.\n"
+"\n"
+
+#: ../quilt/pop.in:146
+msgid "Patch $stop_at_patch is not applied."
+msgstr "Patch $stop_at_patch ist nicht angewandt."
+
+#: ../quilt/pop.in:156
+msgid "No patch removed"
+msgstr "Kein Patch entfernt"
+
+#: ../quilt/pop.in:170 ../quilt/push.in:201
+msgid "Interrupted by user"
+msgstr "Unterbrechung durch Benutzer"
+
+#: ../quilt/pop.in:179 ../quilt/push.in:210
+msgid "No patches applied"
+msgstr "Keine Patches angewandt"
+
+#: ../quilt/pop.in:181 ../quilt/push.in:212
+msgid "Now at patch $patch"
+msgstr "Jetzt in Patch $patch"
+
+#: ../quilt/previous.in:22
+#, fuzzy
+msgid "Usage: quilt previous [-n] [patch]"
+msgstr "Verwendung: quilt previous [patch]"
+
+#: ../quilt/previous.in:25
+msgid ""
+"\n"
+"\n"
+"Print the name of the previous patch before the specified or topmost\n"
+"patch in the series file.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Gibt den Namen des Patches vor dem obersten oder angegebenen\n"
+"Patch in der series-Datei aus.\n"
+"\n"
+"-n\tPatch-Dateinamen statt Patch-Namen ausgeben.\n"
+"\n"
+
+#: ../quilt/push.in:21
+msgid "Usage: quilt push [-afqv] [--leave-rejects] [num|patch]"
+msgstr "Verwendung: quilt push [-afqv] [--leave-rejects] [num|patch]"
+
+#: ../quilt/push.in:24
+#, fuzzy
+msgid ""
+"\n"
+"\n"
+"Apply patch(es) from the series file. A number of patches to apply, or\n"
+"a patch name can be specified. If a patch name is given, apply all\n"
+"patches up to and including the named patch. If neither a number nor a\n"
+"patch name is specified, apply the next patch from the series file.\n"
+"\n"
+"-a\tApply all patches in the series file.\n"
+"\n"
+"-f\tForce apply, even if the patch has rejects.\n"
+"\n"
+"-q\tQuiet operation.\n"
+"\n"
+"-v\tVerbose operation.\n"
+"\n"
+"--leave-rejects\n"
+"\tLeave around the reject files patch produced, even if the patch\n"
+"\tis not actually applied.\n"
+"\n"
+"--interactive\n"
+"\tAllow the patch utility to ask how to deal with conflicts. If\n"
+"\tthis option is not given, the option -f will be passed to the \n"
+"\tpatch program.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Patches in der series-Datei anwenden. Es kann eine Anzahl von Patches,\n"
+"die angewandt werden soll, oder der Name eines Patches angegeben werden.\n"
+"Wenn ein Name angegeben wird, werden alle Patches bis einschließlich zum\n"
+"angegebenen Patch angewandt. Wenn weder ein Patchname noch eine Nummer\n"
+"angegeben wird, wird der nächste Patch angewandt.\n"
+"\n"
+"-a\tAlle folgenden Patches anwenden.\n"
+"\n"
+"-f\tAnwenden erzwingen, solbst wenn dabei Fehler (Rejects) auftreten.\n"
+"\n"
+"-q\tWenige Meldungen ausgeben.\n"
+"\n"
+"-v\tViele Meldungen ausgeben.\n"
+"\n"
+"--leave-rejects\n"
+"\tReject-Dateien (von \\`patch') bestehen lassen, selbst wenn ein Patch\n"
+"\tnicht sauber angewandt werden kann.\n"
+"\t\n"
+
+#: ../quilt/push.in:86
+msgid "Patch $stop_at_patch not found in file series"
+msgstr "Patch $stop_at_patch in series-Datei nicht gefunden"
+
+#: ../quilt/push.in:162
+msgid "Patch $stop_at_patch is already applied."
+msgstr "Patch $stop_at_patch ist bereits angewandt."
+
+#: ../quilt/push.in:186
+msgid "File series fully applied, ends at patch $top"
+msgstr "series-Datei vollständig angewandt, endet in Patch $top"
+
+#: ../quilt/refresh.in:27
+msgid "Usage: quilt refresh [-p n] [-f] [patch]"
+msgstr "Verwendung: quilt refresh [-p n] [-f] [patch]"
+
+#: ../quilt/refresh.in:31
+msgid ""
+"\n"
+"\n"
+"Refreshes the specified patch, or the topmost patch by default.\n"
+"Documentation that comes before the actual patch in the patch file is\n"
+"retained.\n"
+"\n"
+"It is possible to refresh patches that are not on top. If any patches\n"
+"on top of the patch to refresh modify the same files, the script aborts\n"
+"by default. Patches can still be refreshed with -f. In that case this\n"
+"script will print a warning for each shadowed file, changes by more\n"
+"recent patches will be ignored, and only changes in files that have not\n"
+"been modified by any more recent patches will end up in the specified\n"
+"patch.\n"
+"\n"
+"-p n\tCreate a -p n style patch (-p0 or -p1 supported).\n"
+"\t\n"
+"-f\tForce refresh, even if more recent patches modify\n"
+"\tsome of the same files.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Frischt den obersten oder angegebenen Patch auf. Dokumentation in der\n"
+"Patch-Datei, die vor dem eigentlichen Patch steht, bleibt dabei\n"
+"erhalten.\n"
+"\n"
+"Es können beliebige angewandte Patches aufgefrischt werden. Wenn\n"
+"Patches, die nach dem angegebenen Patch angewandt sind, dieselben\n"
+"Dateien verändern, die auch dieser Patch verändert, bricht dieses Script\n"
+"normalerweise ab. Mit der Option -f kann das Auffrischen trotzdem\n"
+"erzwungen werden. Dann wird für jede Datei, die später noch verändert\n"
+"wurde, eine Warnung ausgegeben, und nur Änderungen in Dateien, die\n"
+"danach nicht von anderen Patches weiter verändert werden, werden beim\n"
+"Auffrischen berücksichtigt.\n"
+"\n"
+"-p n\tErzeugt einen -p n Patch (n=0 oder n=1 werden unterstützt).\n"
+"\t\n"
+"-f\tAuffrischen erzwingen, selbst wenn Patches über dem angegebenen Patch\n"
+"\teinige der selben Dateien verändern.\n"
+"\n"
+
+#: ../quilt/refresh.in:123
+msgid ""
+"Cannot refresh patches with -p$opt_strip_level, please specify -p0 or -p1 "
+"instead"
+msgstr ""
+"Kann Patches mit Level -p$opt_strip_level nicht auffrischen, bitte -p0 oder -"
+"p1 angeben"
+
+#: ../quilt/refresh.in:150
+msgid "More recent patches modify files in $patch. Enforce refresh with -f."
+msgstr ""
+"Später angewandte Patches verändern Dateien von $patch. Auffrischen mit -f "
+"erzwingen."
+
+#: ../quilt/refresh.in:157
+msgid "Nothing in patch $patch"
+msgstr "Patch $patch is leer"
+
+#: ../quilt/refresh.in:197
+msgid "Refreshed patch $patch"
+msgstr "Patch $patch aufgefrischt."
+
+#: ../quilt/remove.in:22
+msgid "Usage: quilt remove [-p patch] {file} ..."
+msgstr "Verwendung: quilt remove [-p patch] {datei} ..."
+
+#: ../quilt/remove.in:25
+msgid ""
+"\n"
+"\n"
+"Remove one or more files from the topmost or named patch. Files that\n"
+"are modified by patches on top of the specified patch cannot be removed.\n"
+"\n"
+"-p patch\n"
+"\tPatch to remove files from.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Entfernt Dateien aus dem obersten oder angegebenen Patch. Dateien, die\n"
+"durch Patches über dem angegebenen Patch verändert werden, können nicht\n"
+"entfernt werden.\n"
+"\n"
+"-p patch\n"
+"\tPatch, aus dem Dateien entfernt werden sollen.\n"
+"\n"
+
+#: ../quilt/remove.in:89
+msgid "File $file is not in patch $patch"
+msgstr "Datei $file ist nicht in Patch $patch enthalten."
+
+#: ../quilt/remove.in:105
+msgid "Failed to remove file $file from patch $patch"
+msgstr "Konnte Datei $file nicht aus Patch $patch entfernen."
+
+#: ../quilt/remove.in:116
+msgid "File $file removed from patch $patch"
+msgstr "Datei $file aus Patch $patch entfernt."
+
+#: ../quilt/series.in:22
+msgid "Usage: quilt series [-v]"
+msgstr "Verwendung: quilt series [-v]"
+
+#: ../quilt/series.in:25
+msgid ""
+"\n"
+"\n"
+"Print the names of all patches in the series file.\n"
+"\n"
+"-n\tPrint patch file names instead patch names.\n"
+"\n"
+"-v\tVerbose, more user friendly output.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Gibt die Namen aller Dateien in der series-Datei aus.\n"
+"\n"
+"-n\tPatch-Dateinamen statt Patch-Namen ausgeben.\n"
+"\n"
+"-v\tAusführlichere, benutzerfreundliche Ausgabe.\n"
+"\n"
+
+#: ../quilt/setup.in:22
+msgid "Usage: quilt setup [-d sourcedir] {seriesfile|specfile}"
+msgstr "Verwendung: quilt setup [-d quellvz.] {seriesdatei|specdatei}"
+
+#: ../quilt/setup.in:25
+msgid ""
+"\n"
+"\n"
+"Initializes a source tree from a patch series file. The patch series\n"
+"file must contain the name of the relevant tar archive, in addition to\n"
+"the list of patches.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Baut einen Quellen-Baum aus einer series-Datei auf. Die series-Datei\n"
+"muß neben der Liste der Patches auch den Namen der entsprechenden\n"
+"Tar-Datei enthalten.\n"
+"\n"
+
+#: ../quilt/setup.in:100
+msgid "Series file $series_file not found"
+msgstr "Seriendatei $series_file nicht gefunden"
+
+#: ../quilt/setup.in:118
+#, fuzzy
+msgid "create link patch $packagedir/patches to $source"
+msgstr "Kopiere Patch $source/$arg"
+
+#: ../quilt/setup.in:121
+#, fuzzy
+msgid "creat link of $series_file"
+msgstr "Kopiere Seriendatei"
+
+#: ../quilt/setup.in:131
+msgid "Directory $packagedir set up."
+msgstr "Verzeichnis $packagedir aufgebaut."
+
+#: ../quilt/top.in:22
+msgid "Usage: quilt top"
+msgstr "Verwendung: quilt top"
+
+#: ../quilt/top.in:25
+msgid ""
+"\n"
+"\n"
+"Print the name of the topmost patch on the current stack of applied\n"
+"patches.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Gibt den Namen des obersten Patches auf dem Stapel aus.\n"
+
+#: ../quilt/unapplied.in:22
+msgid "Usage: quilt unapplied [patch]"
+msgstr "Verwendung: quilt unapplied [patch]"
+
+#: ../quilt/unapplied.in:25
+msgid ""
+"\n"
+"\n"
+"Print a list of patches that are not applied, or all patches that follow\n"
+"the specified patch in the series file.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Gint eine Liste der Patches aus, die momentan nicht angewandt sind, bzw.\n"
+"eine Liste der Patches, die dem angegebenen Patch folgen.\n"
+"\n"
+"-n\tPatch-Dateinamen statt Patch-Namen ausgeben.\n"
+"\n"
+
+#: ../scripts/apatch.in:22
+msgid "Usage: $0 [-fqv] patchname"
+msgstr "Verwendung: $0 [-fqv] patchname"
+
+#: ../scripts/apatch.in:40
+msgid "Interrupted by user; patch $patch was not applied."
+msgstr "Unterbrechung durch Benutzer; Patch $patch wurde nicht angewandt."
+
+#: ../scripts/apatch.in:51 ../scripts/rpatch.in:113
+msgid "Patch file $patch_file appears to be empty"
+msgstr "Patch-Datei $patch_file scheint leer zu sein"
+
+#: ../scripts/apatch.in:80
+msgid "refresh_file_list failed"
+msgstr "Fehler in refresh_file_list"
+
+#: ../scripts/apatch.in:84
+msgid "Applying $patch"
+msgstr "Anwenden von $patch"
+
+#: ../scripts/apatch.in:87
+msgid "Patch $patch appears to be empty, applied"
+msgstr "Patch $patch scheint leer zu sein, angewandt"
+
+#: ../scripts/apatch.in:95
+msgid "Recreated file list for $patch"
+msgstr "Dateiliste für $patch aktualisiert"
+
+#: ../scripts/apatch.in:126
+msgid "Applied $patch (forced; needs refresh)"
+msgstr "Patch $patch angewandt (erzwungen, muß aufgefrischt werden (Refresh))"
+
+#: ../scripts/apatch.in:130
+msgid "Patch $patch does not apply (enforce with -f)"
+msgstr "Patch $patch läßt sich nicht anwenden (erzwingen mit -f)"
+
+#: ../scripts/apatch.in:186 ../scripts/rpatch.in:245
+msgid "The topmost patch $top needs to be refreshed first."
+msgstr "Der oberste Patch $top muss zuerst aufgefrischt werden (Refresh)."
+
+#: ../scripts/rpatch.in:22
+msgid "Usage: $0 [-fRq] patchname"
+msgstr "Verwendung: $0 [-fRq] patchname"
+
+#: ../scripts/rpatch.in:44
+msgid "Patch does not remove changes:"
+msgstr "Patch entfernt folgende Änderungen nicht:"
+
+#: ../scripts/rpatch.in:102
+msgid "Interrupted by user; patch $patch was not removed."
+msgstr "Unterbrechung durch Benutzer; Patch $patch wurde nicht entfernt."
+
+#: ../scripts/rpatch.in:146
+msgid "Patch $patch appears to be empty, removed"
+msgstr "Patch $patch scheint leer zu sein, entfernt"
+
+#: ../scripts/rpatch.in:151
+msgid "Removing $patch"
+msgstr "Entferne $patch"
+
+#: ../scripts/rpatch.in:172
+msgid "Failed to create temporary files"
+msgstr "Konnte temporäres Verzeichnis nicht erstellen"
+
+#: ../scripts/rpatch.in:193
+msgid "Patch $patch does not remove (enforce with -f)"
+msgstr "Patch $patch kann nicht entfernt werden (erzwingen mit -f)"
+
+#: ../scripts/spec2series.in:100 ../scripts/spec2series.in:192
+msgid " done"
+msgstr " fertig"
+
+#~ msgid "Reading sources from $arg"
+#~ msgstr "Quellen werden von $arg gelesen"
+
+#~ msgid "Unpacking archive $source/$arg"
+#~ msgstr "Entpacke Archiv source/$arg"
+
+#~ msgid "Directory $packagedir exists already."
+#~ msgstr "Verzeichnis $packagedir existiert bereits."
+
+#~ msgid "File $packagedir exists."
+#~ msgstr "Datei $packagedir existiert."
+
+#, fuzzy
+#~ msgid "create link patch $source"
+#~ msgstr "Kopiere Patch $source/$arg"
+
+#, fuzzy
+#~ msgid "creat link of series file"
+#~ msgstr "Kopiere Seriendatei"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "Print a list of applied patches, or all patches up to and including the\n"
+#~ "specified patch in the file series.\n"
+#~ "\n"
+#~ "-n\tPrint patch file names instead of patch names."
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Gibt eine Liste der angewandten Patches aus, oder eine Liste aller "
+#~ "Patches\n"
+#~ "vom Anfang der Serie bis zum angegebenen Patch.\n"
+#~ "\n"
+#~ "-n\tPatch-Dateinamen statt Patch-Namen ausgeben."
--- /dev/null
+# quilt french translation
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# Martin Quinson <Martin.Quinson@tuxfamily.org>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: quilt 0.22\n"
+"PO-Revision-Date: 2003-06-25 15:40+0200\n"
+"Last-Translator: Martin Quinson <Martin.Quinson@tuxfamily.org>\n"
+"Language-Team: French <traduc@traduc.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../bin/quilt.in:14
+msgid "Usage: quilt command [-h] ..."
+msgstr "Usage : quilt commande [-h] ..."
+
+#: ../bin/quilt.in:26
+msgid "Commands are:"
+msgstr "Les commandes sont :"
+
+#: ../quilt/add.in:22
+msgid "Usage: quilt add [-p patch] {file} ..."
+msgstr "Usage : quilt add [-p patch] {fichier} ..."
+
+#: ../quilt/add.in:25
+msgid ""
+"\n"
+"\n"
+"Add one or more files to the topmost or named patch. Files must be\n"
+"added to the patch before being modified. Files that are modified by\n"
+"patches on top of the specified patch cannot be added.\n"
+"\n"
+"-p patch\n"
+"\tPatch to add files to."
+msgstr ""
+"\n"
+"\n"
+"Ajoute un ou plusieurs fichiers au patch indiqué ou à celui au sommet.\n"
+"Les fichiers doivent être ajoutés au patch avant toute modification.\n"
+"Les fichiers modifiés par d'autres patches plus haut dans la pile ne\n"
+"peuvent pas être ajoutés.\n"
+"\n"
+"-p patch\n"
+"\tPatch auquel les fichiers doivent être ajoutés."
+
+#: ../quilt/add.in:75 ../quilt/delete.in:69 ../quilt/files.in:74
+#: ../quilt/push.in:184 ../quilt/remove.in:75
+msgid "No patch applied"
+msgstr "Aucun patch n'est appliqué"
+
+#: ../quilt/add.in:80 ../quilt/applied.in:70 ../quilt/refresh.in:113
+#: ../quilt/remove.in:80
+msgid "Patch $patch is not applied"
+msgstr "Le patch $patch n'est pas appliqué"
+
+#: ../quilt/add.in:89
+msgid "File $file is already in patch $patch"
+msgstr "Le fichier $file est déjà dans le patch $patch"
+
+#: ../quilt/add.in:96 ../quilt/remove.in:97
+msgid "File $file modified by patch $next_patch"
+msgstr "Le fichier $file est modifié par le patch $next_patch"
+
+#: ../quilt/add.in:104
+msgid "Failed to back up file $file"
+msgstr "Impossible de faire une copie de sécurité de $file"
+
+#: ../quilt/add.in:124
+msgid "File $file added to patch $patch"
+msgstr "Le fichier $file a été ajouté au patch $patch"
+
+#: ../quilt/applied.in:22
+#, fuzzy
+msgid "Usage: quilt applied [-n] [patch]"
+msgstr "Usage : quilt applied [patch]"
+
+#: ../quilt/applied.in:25
+#, fuzzy
+msgid ""
+"\n"
+"\n"
+"Print a list of applied patches.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Affiche le nom du patch avant celui spécifié (ou après celui au sommet)\n"
+"dans le fichier de série.\n"
+"\n"
+"-n\tAffiche le nom de fichier au lieu du nom de patch.\n"
+"\n"
+
+#: ../quilt/delete.in:22
+msgid "Usage: quilt delete [patch]"
+msgstr "Usage : quilt delete [patch]"
+
+#: ../quilt/delete.in:25
+msgid ""
+"\n"
+"\n"
+"Remove the specified or topmost patch from the series file. If the\n"
+"patch is applied, quilt will attempt to remove it first. (Only the\n"
+"topmost patch can be removed right now.)"
+msgstr ""
+"\n"
+"\n"
+"Efface le patch spécifié (ou celui au sommet de la pile) de la série \n"
+"actuelle. Si le patch est appliqué, quilt tentera de le retirer avant.\n"
+"(Seul le patch au sommet peut être retiré pour l'instant)."
+
+#: ../quilt/delete.in:75
+msgid "Patch $patch does not exist"
+msgstr "Le patch $patch n'existe pas"
+
+#: ../quilt/delete.in:84
+msgid "Patch $patch is currently applied"
+msgstr "Le patch $patch est appliqué"
+
+#: ../quilt/delete.in:90
+msgid "Failed to remove patch $patch"
+msgstr "Impossible de retirer le patch $patch"
+
+#: ../quilt/diff.in:27
+msgid "Usage: quilt diff [-p n] [-c patch|-z] [-R] [-P patch] [file ...]"
+msgstr "Usage : quilt diff [-p n] [-c patch|-z] [-R] [-P patch] [fichier ...]"
+
+#: ../quilt/diff.in:31
+#, fuzzy
+msgid ""
+"\n"
+"\n"
+"Produces a diff of the specified file(s) in the topmost or specified\n"
+"patch. If no files are specified, all files that are modified are\n"
+"included.\n"
+"\n"
+"-p n\tCreate a -p n style patch (-p0 or -p1 are supported).\n"
+"\n"
+"-P patch\n"
+"\tCreate a diff for the specified patch. (Defaults to the topmost\n"
+"\tpatch.)\n"
+"\n"
+"-c patch\n"
+"\tCreate a combined diff for all patches between this patch and\n"
+"\tthe patch specified with -P. A patch name of \\\"-\\\" is equivalent\n"
+"\tto specifying the first applied patch.\n"
+"\n"
+"-R\tCreate a reverse diff.\n"
+"\n"
+"-z\tWrite to standard output the changes that have been made\n"
+"\trelative to the topmost or specified patch.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Produit un diff du ou des fichiers spécifiés par le patch spécifié (ou à \n"
+"défaut, par le patch au sommet). Si aucun fichier n'est indiqué, tous les\n"
+"fichiers modifiés par ce patch sont inclus.\n"
+"\n"
+"-p n\tCrée un patch au style -p n (-p0 et -p1 sont possibles).\n"
+"\n"
+"-P patch\n"
+"\tCrée un diff pour ce patch (par défaut, le patch au sommet)\n"
+"\n"
+"-c patch\n"
+"\tCrée un diff combiné pour tous les patches se trouvant entre\n"
+"\tce patch et celui indiqué avec l'option -P.\n"
+"\n"
+"-R\tCrée un patch inversé.\n"
+"\n"
+"-z\tÉcrit sur la sortie standard les changements fait par rapport\n"
+"\tau patch spécifié.\n"
+"\n"
+
+#: ../quilt/diff.in:132
+msgid "Options \\`-c patch' and \\`-z' cannot be combined."
+msgstr "Les options \\`-c patch' et \\`-z' ne peuvent pas être combinées."
+
+#: ../quilt/diff.in:141 ../quilt/refresh.in:106
+msgid "No patch seem to be applied"
+msgstr "Aucun patch ne semble appliqué"
+
+#: ../quilt/diff.in:148
+msgid "Patch $last_patch is not applied"
+msgstr "Le patch $last_patch ne semble pas appliqué"
+
+#: ../quilt/diff.in:158
+msgid ""
+"Cannot diff patches with -p$opt_strip_level, please specify -p0 or -p1 "
+"instead"
+msgstr ""
+"Impossible de créer des patches avec -p$opt_strip_level. Veuillez spécifier -"
+"p0 ou -p1 Ã la place"
+
+#: ../quilt/diff.in:166
+msgid "refresh_patches_per_file failed."
+msgstr "refresh_patches_per_file a échoué."
+
+#: ../quilt/diff.in:179
+msgid "Patch $opt_combine not applied before $last_patch."
+msgstr "Le patch $opt_combine n'est pas appliqué avant $last_patch."
+
+#: ../quilt/diff.in:213
+msgid "File $file is not being modified."
+msgstr "Le fichier $file n'est pas modifié."
+
+#: ../quilt/diff.in:230
+msgid "Cannot change into .pc/$last_patch"
+msgstr "Impossible d'entrer dans .pc/$last_patch"
+
+#: ../quilt/diff.in:235
+msgid "Failed to copy files to temporary directory"
+msgstr "Impossible de copier les fichiers dans le répertoire temporaire"
+
+#: ../quilt/diff.in:240
+msgid "Cannot change to temporary directory"
+msgstr "Impossible d'entrer dans le répertoire temporaire"
+
+#: ../quilt/diff.in:257
+msgid "Failed to patch temporary files"
+msgstr "Impossible de patcher les fichiers temporaires"
+
+#: ../quilt/diff.in:264
+msgid "Cannot change to source directory"
+msgstr "Impossible d'entrer dans le répertoire source"
+
+#: ../quilt/diff.in:293 ../quilt/refresh.in:144
+msgid "Diff failed, aborting."
+msgstr "Le diff a échoué. Abandon."
+
+#: ../quilt/diff.in:300
+msgid "More recent patches modify files in $last_patch."
+msgstr "Un patch plus recent modifie des fichiers communs à $last_patch."
+
+#: ../quilt/files.in:22
+msgid "Usage: quilt files [-v] [patch]"
+msgstr "Usage : quilt files [-v] [patch]"
+
+#: ../quilt/files.in:25
+msgid ""
+"\n"
+"\n"
+"Print the list of files that the topmost or specified patch changes.\n"
+"\n"
+"-v\tVerbose, more user friendly output.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Affiche la liste des fichiers modifiés par le patch spécifié (ou celui \n"
+"au sommet).\n"
+"\n"
+"-v\tAffichage verbeux, plus simple à lire.\n"
+"\n"
+
+#: ../quilt/files.in:83
+msgid "Patch is not applied (no verbose output)"
+msgstr "Le patch n'est pas appliqué (affichage non verbeux)"
+
+#: ../quilt/files.in:86
+msgid "Patch is not applied"
+msgstr "Le patch n'est pas appliqué"
+
+#: ../quilt/import.in:22
+msgid "Usage: quilt import [-f] [-p num] [-n patch] [patchfile]"
+msgstr "Usage : quilt import [-f] [-p num] [-n patch] [fichier_de_patch]"
+
+#: ../quilt/import.in:25
+msgid ""
+"\n"
+"\n"
+"Import an external patch. If a patch file name is specified, the patch\n"
+"will be stored in this relative path in the patches/ directory. Else,\n"
+"if an input file name is given this name is used as the patch name.\n"
+"\n"
+"-p num\n"
+"\tNumber of directory levels to strip when aplying (default=1)\n"
+"\n"
+"-n patch\n"
+"\tFile name relative to patches/ to use.\n"
+"\n"
+"-f\tOverwite/update existing patches.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Importe un patch externe. Si le nom de fichier spécifié est un chemin, il\n"
+"est relatif au répertoire patches/. Si aucun nom de fichier n'est donné, le\n"
+"patch sera stocké dans un fichier du même nom que le fichier d'entrée.\n"
+"\n"
+"-p num\n"
+"\tNombre de niveaux de répertoires à retirer lors de l'application du \n"
+"\tpatch (1 par défaut).\n"
+"\n"
+"-n patch\n"
+"\tNom de fichier (relatif à patches/) à utiliser.\n"
+"\n"
+"-f\tÉcrase/met à jour les patchs existants.\n"
+"\n"
+
+#: ../quilt/import.in:97
+msgid "Please use -n to specify a patch file name."
+msgstr "Veuillez utiliser -n pour spécifier un nom de fichier de patch."
+
+#: ../quilt/import.in:105
+msgid "Patch file name \\\"$patch_file\\\" contains whitespace."
+msgstr "Le nom de fichier de patch \"$patch_file\" contient des espaces."
+
+#: ../quilt/import.in:111
+msgid "Patch $patch is applied."
+msgstr "Le patch $patch est appliqué."
+
+#: ../quilt/import.in:120
+msgid "Cannot read from standard input."
+msgstr "Impossible de lire depuis l'entrée standard."
+
+#: ../quilt/import.in:129 ../quilt/import.in:138
+msgid "Cannot decompress file $input_file"
+msgstr "Impossible de décompresser le fichier $input_file"
+
+#: ../quilt/import.in:146
+msgid "Cannot read from file $input_file"
+msgstr "Impossible de lire depuis le fichier $input_file"
+
+#: ../quilt/import.in:155
+msgid "Patch $patch exists. Replace with -f."
+msgstr "Le patch $patch existe. Utilisez -f pour le remplacer."
+
+#: ../quilt/import.in:162
+msgid "Updating %patch section of patch $patch"
+msgstr "Mise à jour de la section %patch dans $patch"
+
+#: ../quilt/import.in:165
+msgid "Failed to update %patch section of patch $patch"
+msgstr "Impossible de mettre à jour la section %patch du patch $patch"
+
+#: ../quilt/import.in:169
+msgid "Replacing patch $patch with new version"
+msgstr "Remplacement du patch $patch avec la nouvelle version"
+
+#: ../quilt/import.in:172
+msgid "Failed to replace patch $patch"
+msgstr "Impossible de remplacer le patch $patch"
+
+#: ../quilt/import.in:177
+msgid "Importing patch $patch (stored as $patch_file)"
+msgstr "Import du patch $patch (enregistré dans $patch_file)"
+
+#: ../quilt/import.in:184
+msgid "Failed to import patch $patch"
+msgstr "Impossible d'importer le patch $patch"
+
+#: ../quilt/import.in:194
+msgid "Failed to insert $patch in file series."
+msgstr "Impossible d'inserer $patch dans le fichier de série."
+
+#: ../quilt/new.in:22
+msgid "Usage: quilt new {patchname}"
+msgstr "Usage : quilt new {nom_de_patch}"
+
+#: ../quilt/new.in:25
+msgid ""
+"\n"
+"\n"
+"Create a new patch with the specified file name, and insert it after the\n"
+"topmost patch in the patch series file.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Crée un nouveau patch au nom spécifié, et l'insere après le patch\n"
+"au sommet dans le fichier de série.\n"
+"\n"
+
+#: ../quilt/new.in:67
+msgid "Patch $patch exists already"
+msgstr "Le patch $patch existe déjà "
+
+#: ../quilt/new.in:77
+msgid "Failed to create patch $patch"
+msgstr "Impossible de crée le patch $patch"
+
+#: ../quilt/new.in:80
+msgid "Patch $patch is now on top"
+msgstr "Le patch $patch est maintenant au sommet"
+
+#: ../quilt/next.in:22
+msgid "Usage: quilt next [patch]"
+msgstr "Usage : quilt next [patch]"
+
+#: ../quilt/next.in:25
+msgid ""
+"\n"
+"\n"
+"Print the name of the next patch after the specified or topmost patch in\n"
+"the series file.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Affiche le nom du patch après celui spécifié (ou après celui au sommet)\n"
+"dans le fichier de série.\n"
+"\n"
+"-n\tAffiche le nom de fichier au lieu du nom de patch.\n"
+"\n"
+
+#: ../quilt/patches.in:22
+msgid "Usage: quilt patches {file}"
+msgstr "Usage : quilt patches {fichier}"
+
+#: ../quilt/patches.in:25
+msgid ""
+"\n"
+"\n"
+"Print the list of patches that modify the specified file.\n"
+"\n"
+"-n\tPrint the patch file names instead of the patch names.\n"
+"\n"
+"-v\tVerbose, more user friendly output.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Affiche la liste des patches modifiant le fichier spécifié.\n"
+"\n"
+"-n\tAffiche les noms de fichier au lieu des noms de patch.\n"
+"\n"
+"-v\tAffichage verbeux, plus simple à lire.\n"
+"\n"
+
+#: ../quilt/pop.in:22
+msgid "Usage: quilt pop [-afRqv] [num|patch]"
+msgstr "Usage : quilt pop [-afRqv] [num|patch]"
+
+#: ../quilt/pop.in:25
+msgid ""
+"\n"
+"\n"
+"Remove patch(es) from the current stack. A number of patches to remove,\n"
+"or a patch name can be specified. If a patch name is given, remove all\n"
+"patches applied on top of the named patch. If neither a number nor a\n"
+"patch name is specified, remove the next patch from the series file.\n"
+"\n"
+"-a\tRemove all applied patches.\n"
+"\n"
+"-f\tForce remove. The state before the patch(es) were applied will\n"
+"\tbe restored from backup files.\n"
+"\n"
+"-R\tRemove the patch with \\`patch -R' and check if the patch reverts\n"
+"\tall changes properly.\n"
+"\n"
+"-q\tQuiet operation.\n"
+"\n"
+"-v\tVerbose operation.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Retire un ou plusieurs patches de la pile. Il est possible de donner en\n"
+"argument un nombre de patch à retirer ou un nom de patch. Dans ce dernier\n"
+"cas, tous les patches placés au dessus du patch à retirer seront retirés\n"
+"eux aussi. Si aucun argument n'est spécifié, le patch au sommet est retiré.\n"
+"\n"
+"-a\tRetire tous les patches de la série.\n"
+"\n"
+"-f\tForce l'action. L'état des patches avant qu'ils ne soient retirés \n"
+"\tsera restoré depuis les fichiers de sauvegarde.\n"
+"\n"
+"-R\tRetire le patche avec \\`patch -R' et vérifie que cela retire \n"
+"\tproprement tous les changements.\n"
+"\n"
+"-q\tOpère silencieusement.\n"
+"\n"
+"-v\tOpère verbeusement.\n"
+"\n"
+
+#: ../quilt/pop.in:146
+msgid "Patch $stop_at_patch is not applied."
+msgstr "Le patch $stop_at_patch n'est pas appliqué."
+
+#: ../quilt/pop.in:156
+msgid "No patch removed"
+msgstr "Aucun patch retiré"
+
+#: ../quilt/pop.in:170 ../quilt/push.in:201
+msgid "Interrupted by user"
+msgstr "Interrompu par l'utilisateur"
+
+#: ../quilt/pop.in:179 ../quilt/push.in:210
+msgid "No patches applied"
+msgstr "Aucun patch n'est appliqué"
+
+#: ../quilt/pop.in:181 ../quilt/push.in:212
+msgid "Now at patch $patch"
+msgstr "Le patch $patch est maintenant au sommet"
+
+#: ../quilt/previous.in:22
+#, fuzzy
+msgid "Usage: quilt previous [-n] [patch]"
+msgstr "Usage : quilt previous [patch]"
+
+#: ../quilt/previous.in:25
+msgid ""
+"\n"
+"\n"
+"Print the name of the previous patch before the specified or topmost\n"
+"patch in the series file.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Affiche le nom du patch avant celui spécifié (ou après celui au sommet)\n"
+"dans le fichier de série.\n"
+"\n"
+"-n\tAffiche le nom de fichier au lieu du nom de patch.\n"
+"\n"
+
+#: ../quilt/push.in:21
+msgid "Usage: quilt push [-afqv] [--leave-rejects] [num|patch]"
+msgstr "Usage: quilt push [-afqv] [--leave-rejects] [num|patch]"
+
+#: ../quilt/push.in:24
+msgid ""
+"\n"
+"\n"
+"Apply patch(es) from the series file. A number of patches to apply, or\n"
+"a patch name can be specified. If a patch name is given, apply all\n"
+"patches up to and including the named patch. If neither a number nor a\n"
+"patch name is specified, apply the next patch from the series file.\n"
+"\n"
+"-a\tApply all patches in the series file.\n"
+"\n"
+"-f\tForce apply, even if the patch has rejects.\n"
+"\n"
+"-q\tQuiet operation.\n"
+"\n"
+"-v\tVerbose operation.\n"
+"\n"
+"--leave-rejects\n"
+"\tLeave around the reject files patch produced, even if the patch\n"
+"\tis not actually applied.\n"
+"\n"
+"--interactive\n"
+"\tAllow the patch utility to ask how to deal with conflicts. If\n"
+"\tthis option is not given, the option -f will be passed to the \n"
+"\tpatch program.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Applique un ou plusieurs patches de la série. Il est possible de donner en\n"
+"argument un nombre de patch à appliquer ou un nom de patch. Dans ce dernier\n"
+"cas, tous les patches placés au dessous du patch à retirer seront appliqués\n"
+"eux aussi. Si aucun argument n'est spécifié, le prochain patch est\n"
+"appliqué.\n"
+"\n"
+"-a\tApplique tous les patches de la série.\n"
+"\n"
+"-f\tForce l'application, même si cela doit produire des rejets.\n"
+"\n"
+"-q\tOpère silencieusement.\n"
+"\n"
+"-v\tOpère verbeusement.\n"
+"\n"
+"--leave-rejects\n"
+"\tLaisse les fichiers de rejets produits, même si l'application du\n"
+"\tpatch a échoué et qu'il n'est finalement pas appliqué.\n"
+"\n"
+"--interactive\n"
+"\tLaisse l'utilitaire patch demander comment résoudre les conflits.\n"
+"\tSi cette option n'est pas donnée, l'option -f sera passée au \n"
+"\tprogramme patch.\n"
+
+#: ../quilt/push.in:86
+msgid "Patch $stop_at_patch not found in file series"
+msgstr "Le patch $stop_at_patch est introuvable dans le fichier de série"
+
+#: ../quilt/push.in:162
+msgid "Patch $stop_at_patch is already applied."
+msgstr "Le patch $stop_at_patch est déjà appliqué."
+
+#: ../quilt/push.in:186
+msgid "File series fully applied, ends at patch $top"
+msgstr "La série est complètement appliquée. Le dernier patch est $top."
+
+#: ../quilt/refresh.in:27
+msgid "Usage: quilt refresh [-p n] [-f] [patch]"
+msgstr "Usage : quilt refresh [-p n] [-f] [patch]"
+
+#: ../quilt/refresh.in:31
+msgid ""
+"\n"
+"\n"
+"Refreshes the specified patch, or the topmost patch by default.\n"
+"Documentation that comes before the actual patch in the patch file is\n"
+"retained.\n"
+"\n"
+"It is possible to refresh patches that are not on top. If any patches\n"
+"on top of the patch to refresh modify the same files, the script aborts\n"
+"by default. Patches can still be refreshed with -f. In that case this\n"
+"script will print a warning for each shadowed file, changes by more\n"
+"recent patches will be ignored, and only changes in files that have not\n"
+"been modified by any more recent patches will end up in the specified\n"
+"patch.\n"
+"\n"
+"-p n\tCreate a -p n style patch (-p0 or -p1 supported).\n"
+"\t\n"
+"-f\tForce refresh, even if more recent patches modify\n"
+"\tsome of the same files.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Rafraîchit un patch appliqué. Si aucun patch n'est spécifié, il s'agit de\n"
+"celui au sommet. La documentation au début du patch est conservée.\n"
+"\n"
+"Il est possible de rafraîchir un patch ne se trouvant pas au sommet. Dans\n"
+"ce cas et si un autre patch placé plus haut modifie les mêmes fichiers, ce\n"
+"script affiche ces patches conflictuels, ainsi que le nom du fichier sur\n"
+"lequel porte le conflit. \n"
+"\n"
+"Même en cas de conflit, il est possible de rafraîchir le patch en utilisant\n"
+"l'option -f. Le script affichera alors un message d'avertissement pour\n"
+"chaque fichier masqué de la sorte, et ignorera tout changement à ces\n"
+"fichiers.\n"
+"\n"
+"-p n\tCrée un patch du style -p n (-p0 ou -p1)\n"
+"\n"
+"-f\tForce le rafraîchissement, même si des patches plus haut changent \n"
+"\tles mêmes fichiers.\n"
+
+#: ../quilt/refresh.in:123
+msgid ""
+"Cannot refresh patches with -p$opt_strip_level, please specify -p0 or -p1 "
+"instead"
+msgstr ""
+"Impossible de rafraîchir des patchs avec -p$opt_strip_level. Veuillez\n"
+"spécifier -p0 ou -p1 à la place."
+
+#: ../quilt/refresh.in:150
+msgid "More recent patches modify files in $patch. Enforce refresh with -f."
+msgstr ""
+"Des fichiers plus récents modifient les mêmes fichiers que $patch.\n"
+"Forcez le rafraîchissement avec -f."
+
+#: ../quilt/refresh.in:157
+msgid "Nothing in patch $patch"
+msgstr "Le patch $patch ne contient rien"
+
+#: ../quilt/refresh.in:197
+msgid "Refreshed patch $patch"
+msgstr "Le patch $patch a été rafraichi."
+
+#: ../quilt/remove.in:22
+msgid "Usage: quilt remove [-p patch] {file} ..."
+msgstr "Usage : quilt remove [-p patch] {fichier} ..."
+
+#: ../quilt/remove.in:25
+msgid ""
+"\n"
+"\n"
+"Remove one or more files from the topmost or named patch. Files that\n"
+"are modified by patches on top of the specified patch cannot be removed.\n"
+"\n"
+"-p patch\n"
+"\tPatch to remove files from.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Retire un ou plusieurs fichiers du patch au sommet ou du patch spécifié.\n"
+"Des fichiers modifiés par des patches plus haut dans la série ne peuvent\n"
+"pas être retirés. \n"
+"\n"
+"-p patch\n"
+"\tPatch duquel les fichiers doivent être retirés.\n"
+"\n"
+
+#: ../quilt/remove.in:89
+msgid "File $file is not in patch $patch"
+msgstr "Le fichier $file n'est pas dans le patch $patch."
+
+#: ../quilt/remove.in:105
+msgid "Failed to remove file $file from patch $patch"
+msgstr "Impossible d'enlever le fichier $file du patch $patch."
+
+#: ../quilt/remove.in:116
+msgid "File $file removed from patch $patch"
+msgstr "Le fichier $file a été enlevé du patch $patch."
+
+#: ../quilt/series.in:22
+msgid "Usage: quilt series [-v]"
+msgstr "Usage : quilt series [-v]"
+
+#: ../quilt/series.in:25
+msgid ""
+"\n"
+"\n"
+"Print the names of all patches in the series file.\n"
+"\n"
+"-n\tPrint patch file names instead patch names.\n"
+"\n"
+"-v\tVerbose, more user friendly output.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Affiche le nom de tous les patches de la série.\n"
+"\n"
+"-n\tAffiche les noms de fichier au lieu des noms de patch.\n"
+"\n"
+"-v\tAffichage verbeux, plus simple à lire.\n"
+"\n"
+
+#: ../quilt/setup.in:22
+msgid "Usage: quilt setup [-d sourcedir] {seriesfile|specfile}"
+msgstr ""
+"Usage : quilt setup [-d répertoire_source] {fichier_séries|fichier_spec}"
+
+#: ../quilt/setup.in:25
+msgid ""
+"\n"
+"\n"
+"Initializes a source tree from a patch series file. The patch series\n"
+"file must contain the name of the relevant tar archive, in addition to\n"
+"the list of patches.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Initialise une arborescence source depuis un fichier de série. Ce fichier "
+"doit contenir le nom de l'archive tar à utiliser, ainsi que la liste des "
+"patches.\n"
+"\n"
+
+#: ../quilt/setup.in:100
+msgid "Series file $series_file not found"
+msgstr "Fichier de série $series_file introuvable"
+
+#: ../quilt/setup.in:118
+#, fuzzy
+msgid "create link patch $packagedir/patches to $source"
+msgstr "Copie du patch $source/$arg"
+
+#: ../quilt/setup.in:121
+#, fuzzy
+msgid "creat link of $series_file"
+msgstr "Copie du fichier de série"
+
+#: ../quilt/setup.in:131
+msgid "Directory $packagedir set up."
+msgstr "Le répertoire $packagedir est configuré."
+
+#: ../quilt/top.in:22
+msgid "Usage: quilt top"
+msgstr "Usage : quilt top"
+
+#: ../quilt/top.in:25
+msgid ""
+"\n"
+"\n"
+"Print the name of the topmost patch on the current stack of applied\n"
+"patches.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Affiche le nom du patch au sommet de la pile des patches actuellement\n"
+"appliqués.\n"
+"\n"
+
+#: ../quilt/unapplied.in:22
+msgid "Usage: quilt unapplied [patch]"
+msgstr "Usage : quilt unapplied [patch]"
+
+#: ../quilt/unapplied.in:25
+msgid ""
+"\n"
+"\n"
+"Print a list of patches that are not applied, or all patches that follow\n"
+"the specified patch in the series file.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"Affiche la liste de tous les patches non appliqués, ou de tous les patches\n"
+"suivant celui indiqué en paramètre.\n"
+"\n"
+"-n\tAffiche les noms de fichier au lieu des noms de patch.\n"
+"\n"
+
+#: ../scripts/apatch.in:22
+msgid "Usage: $0 [-fqv] patchname"
+msgstr "Usage : $0 [-fqv] patchname"
+
+#: ../scripts/apatch.in:40
+msgid "Interrupted by user; patch $patch was not applied."
+msgstr "Interrompu par l'utilisateur ; le patch $patch n'a pas été appliqué."
+
+#: ../scripts/apatch.in:51 ../scripts/rpatch.in:113
+msgid "Patch file $patch_file appears to be empty"
+msgstr "Le fichier de patch $patch_file semble vide"
+
+#: ../scripts/apatch.in:80
+msgid "refresh_file_list failed"
+msgstr "refresh_file_list a échoué."
+
+#: ../scripts/apatch.in:84
+msgid "Applying $patch"
+msgstr "Application de $patch"
+
+#: ../scripts/apatch.in:87
+msgid "Patch $patch appears to be empty, applied"
+msgstr "Le patch $patch semble vide. Il a été appliqué."
+
+#: ../scripts/apatch.in:95
+msgid "Recreated file list for $patch"
+msgstr "La liste des fichiers pour $patch a été recrée."
+
+#: ../scripts/apatch.in:126
+msgid "Applied $patch (forced; needs refresh)"
+msgstr "$patch a été appliqué (forcé ; vous devriez le rafraîchir)"
+
+#: ../scripts/apatch.in:130
+msgid "Patch $patch does not apply (enforce with -f)"
+msgstr ""
+"Le patch $patch ne s'applique pas proprement (forcez l'application avec -f)"
+
+#: ../scripts/apatch.in:186 ../scripts/rpatch.in:245
+msgid "The topmost patch $top needs to be refreshed first."
+msgstr "Le patch au sommet $top doit être rafraichi au préalable."
+
+#: ../scripts/rpatch.in:22
+msgid "Usage: $0 [-fRq] patchname"
+msgstr "Usage: $0 [-fRq] nom_de_patch"
+
+#: ../scripts/rpatch.in:44
+msgid "Patch does not remove changes:"
+msgstr "Le patch d'enlève pas les changements :"
+
+#: ../scripts/rpatch.in:102
+msgid "Interrupted by user; patch $patch was not removed."
+msgstr "Interrompu par l'utilisateur ; le patch $patch n'a pas été retiré;"
+
+#: ../scripts/rpatch.in:146
+msgid "Patch $patch appears to be empty, removed"
+msgstr "Le patch $patch semble vide. Il a été retiré."
+
+#: ../scripts/rpatch.in:151
+msgid "Removing $patch"
+msgstr "Retrait de $patch"
+
+#: ../scripts/rpatch.in:172
+msgid "Failed to create temporary files"
+msgstr "Impossible de créer les fichiers temporaires"
+
+#: ../scripts/rpatch.in:193
+msgid "Patch $patch does not remove (enforce with -f)"
+msgstr "Le patch $patch ne se retire pas proprement (forcez avec -f)"
+
+#: ../scripts/spec2series.in:100 ../scripts/spec2series.in:192
+msgid " done"
+msgstr " fini"
+
+#~ msgid "Reading sources from $arg"
+#~ msgstr "Lecture des sources depuis $arg"
+
+#~ msgid "Unpacking archive $source/$arg"
+#~ msgstr "Désarchivage depuis $source/$arg"
+
+#~ msgid "Directory $packagedir exists already."
+#~ msgstr "Le répertoire $packagedir existe déjà ."
+
+#~ msgid "File $packagedir exists."
+#~ msgstr "Le fichier $packagedir existe."
+
+#, fuzzy
+#~ msgid "create link patch $source"
+#~ msgstr "Copie du patch $source/$arg"
+
+#, fuzzy
+#~ msgid "creat link of series file"
+#~ msgstr "Copie du fichier de série"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "Print a list of applied patches, or all patches up to and including the\n"
+#~ "specified patch in the file series.\n"
+#~ "\n"
+#~ "-n\tPrint patch file names instead of patch names."
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Affiche la liste des patches appliqués, ou la liste de tous les patches\n"
+#~ "jusqu'à celui passé en paramètre (inclus).\n"
+#~ "\n"
+#~ "-n\tAffiche les noms des fichiers de patch au lieu des noms de patch."
--- /dev/null
+#: ../bin/quilt.in:14
+msgid "Usage: quilt command [-h] ..."
+msgstr ""
+
+#: ../bin/quilt.in:26
+msgid "Commands are:"
+msgstr ""
+
+#: ../quilt/add.in:22
+msgid "Usage: quilt add [-p patch] {file} ..."
+msgstr ""
+
+#: ../quilt/add.in:25
+msgid ""
+"\n"
+"\n"
+"Add one or more files to the topmost or named patch. Files must be\n"
+"added to the patch before being modified. Files that are modified by\n"
+"patches on top of the specified patch cannot be added.\n"
+"\n"
+"-p patch\n"
+"\tPatch to add files to."
+msgstr ""
+
+#: ../quilt/add.in:75 ../quilt/delete.in:69 ../quilt/files.in:74
+#: ../quilt/push.in:184 ../quilt/remove.in:75
+msgid "No patch applied"
+msgstr ""
+
+#: ../quilt/add.in:80 ../quilt/applied.in:70 ../quilt/refresh.in:113
+#: ../quilt/remove.in:80
+msgid "Patch $patch is not applied"
+msgstr ""
+
+#: ../quilt/add.in:89
+msgid "File $file is already in patch $patch"
+msgstr ""
+
+#: ../quilt/add.in:96 ../quilt/remove.in:97
+msgid "File $file modified by patch $next_patch"
+msgstr ""
+
+#: ../quilt/add.in:104
+msgid "Failed to back up file $file"
+msgstr ""
+
+#: ../quilt/add.in:124
+msgid "File $file added to patch $patch"
+msgstr ""
+
+#: ../quilt/applied.in:22
+msgid "Usage: quilt applied [-n] [patch]"
+msgstr ""
+
+#: ../quilt/applied.in:25
+msgid ""
+"\n"
+"\n"
+"Print a list of applied patches.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/delete.in:22
+msgid "Usage: quilt delete [patch]"
+msgstr ""
+
+#: ../quilt/delete.in:25
+msgid ""
+"\n"
+"\n"
+"Remove the specified or topmost patch from the series file. If the\n"
+"patch is applied, quilt will attempt to remove it first. (Only the\n"
+"topmost patch can be removed right now.)"
+msgstr ""
+
+#: ../quilt/delete.in:75
+msgid "Patch $patch does not exist"
+msgstr ""
+
+#: ../quilt/delete.in:84
+msgid "Patch $patch is currently applied"
+msgstr ""
+
+#: ../quilt/delete.in:90
+msgid "Failed to remove patch $patch"
+msgstr ""
+
+#: ../quilt/diff.in:27
+msgid "Usage: quilt diff [-p n] [-c patch|-z] [-R] [-P patch] [file ...]"
+msgstr ""
+
+#: ../quilt/diff.in:31
+msgid ""
+"\n"
+"\n"
+"Produces a diff of the specified file(s) in the topmost or specified\n"
+"patch. If no files are specified, all files that are modified are\n"
+"included.\n"
+"\n"
+"-p n\tCreate a -p n style patch (-p0 or -p1 are supported).\n"
+"\n"
+"-P patch\n"
+"\tCreate a diff for the specified patch. (Defaults to the topmost\n"
+"\tpatch.)\n"
+"\n"
+"-c patch\n"
+"\tCreate a combined diff for all patches between this patch and\n"
+"\tthe patch specified with -P. A patch name of \\\"-\\\" is equivalent\n"
+"\tto specifying the first applied patch.\n"
+"\n"
+"-R\tCreate a reverse diff.\n"
+"\n"
+"-z\tWrite to standard output the changes that have been made\n"
+"\trelative to the topmost or specified patch.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/diff.in:132
+msgid "Options \\`-c patch' and \\`-z' cannot be combined."
+msgstr ""
+
+#: ../quilt/diff.in:141 ../quilt/refresh.in:106
+msgid "No patch seem to be applied"
+msgstr ""
+
+#: ../quilt/diff.in:148
+msgid "Patch $last_patch is not applied"
+msgstr ""
+
+#: ../quilt/diff.in:158
+msgid ""
+"Cannot diff patches with -p$opt_strip_level, please specify -p0 or -p1 "
+"instead"
+msgstr ""
+
+#: ../quilt/diff.in:166
+msgid "refresh_patches_per_file failed."
+msgstr ""
+
+#: ../quilt/diff.in:179
+msgid "Patch $opt_combine not applied before $last_patch."
+msgstr ""
+
+#: ../quilt/diff.in:213
+msgid "File $file is not being modified."
+msgstr ""
+
+#: ../quilt/diff.in:230
+msgid "Cannot change into .pc/$last_patch"
+msgstr ""
+
+#: ../quilt/diff.in:235
+msgid "Failed to copy files to temporary directory"
+msgstr ""
+
+#: ../quilt/diff.in:240
+msgid "Cannot change to temporary directory"
+msgstr ""
+
+#: ../quilt/diff.in:257
+msgid "Failed to patch temporary files"
+msgstr ""
+
+#: ../quilt/diff.in:264
+msgid "Cannot change to source directory"
+msgstr ""
+
+#: ../quilt/diff.in:293 ../quilt/refresh.in:144
+msgid "Diff failed, aborting."
+msgstr ""
+
+#: ../quilt/diff.in:300
+msgid "More recent patches modify files in $last_patch."
+msgstr ""
+
+#: ../quilt/files.in:22
+msgid "Usage: quilt files [-v] [patch]"
+msgstr ""
+
+#: ../quilt/files.in:25
+msgid ""
+"\n"
+"\n"
+"Print the list of files that the topmost or specified patch changes.\n"
+"\n"
+"-v\tVerbose, more user friendly output.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/files.in:83
+msgid "Patch is not applied (no verbose output)"
+msgstr ""
+
+#: ../quilt/files.in:86
+msgid "Patch is not applied"
+msgstr ""
+
+#: ../quilt/import.in:22
+msgid "Usage: quilt import [-f] [-p num] [-n patch] [patchfile]"
+msgstr ""
+
+#: ../quilt/import.in:25
+msgid ""
+"\n"
+"\n"
+"Import an external patch. If a patch file name is specified, the patch\n"
+"will be stored in this relative path in the patches/ directory. Else,\n"
+"if an input file name is given this name is used as the patch name.\n"
+"\n"
+"-p num\n"
+"\tNumber of directory levels to strip when aplying (default=1)\n"
+"\n"
+"-n patch\n"
+"\tFile name relative to patches/ to use.\n"
+"\n"
+"-f\tOverwite/update existing patches.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/import.in:97
+msgid "Please use -n to specify a patch file name."
+msgstr ""
+
+#: ../quilt/import.in:105
+msgid "Patch file name \\\"$patch_file\\\" contains whitespace."
+msgstr ""
+
+#: ../quilt/import.in:111
+msgid "Patch $patch is applied."
+msgstr ""
+
+#: ../quilt/import.in:120
+msgid "Cannot read from standard input."
+msgstr ""
+
+#: ../quilt/import.in:129 ../quilt/import.in:138
+msgid "Cannot decompress file $input_file"
+msgstr ""
+
+#: ../quilt/import.in:146
+msgid "Cannot read from file $input_file"
+msgstr ""
+
+#: ../quilt/import.in:155
+msgid "Patch $patch exists. Replace with -f."
+msgstr ""
+
+#: ../quilt/import.in:162
+msgid "Updating %patch section of patch $patch"
+msgstr ""
+
+#: ../quilt/import.in:165
+msgid "Failed to update %patch section of patch $patch"
+msgstr ""
+
+#: ../quilt/import.in:169
+msgid "Replacing patch $patch with new version"
+msgstr ""
+
+#: ../quilt/import.in:172
+msgid "Failed to replace patch $patch"
+msgstr ""
+
+#: ../quilt/import.in:177
+msgid "Importing patch $patch (stored as $patch_file)"
+msgstr ""
+
+#: ../quilt/import.in:184
+msgid "Failed to import patch $patch"
+msgstr ""
+
+#: ../quilt/import.in:194
+msgid "Failed to insert $patch in file series."
+msgstr ""
+
+#: ../quilt/new.in:22
+msgid "Usage: quilt new {patchname}"
+msgstr ""
+
+#: ../quilt/new.in:25
+msgid ""
+"\n"
+"\n"
+"Create a new patch with the specified file name, and insert it after the\n"
+"topmost patch in the patch series file.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/new.in:67
+msgid "Patch $patch exists already"
+msgstr ""
+
+#: ../quilt/new.in:77
+msgid "Failed to create patch $patch"
+msgstr ""
+
+#: ../quilt/new.in:80
+msgid "Patch $patch is now on top"
+msgstr ""
+
+#: ../quilt/next.in:22
+msgid "Usage: quilt next [patch]"
+msgstr ""
+
+#: ../quilt/next.in:25
+msgid ""
+"\n"
+"\n"
+"Print the name of the next patch after the specified or topmost patch in\n"
+"the series file.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/patches.in:22
+msgid "Usage: quilt patches {file}"
+msgstr ""
+
+#: ../quilt/patches.in:25
+msgid ""
+"\n"
+"\n"
+"Print the list of patches that modify the specified file.\n"
+"\n"
+"-n\tPrint the patch file names instead of the patch names.\n"
+"\n"
+"-v\tVerbose, more user friendly output.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/pop.in:22
+msgid "Usage: quilt pop [-afRqv] [num|patch]"
+msgstr ""
+
+#: ../quilt/pop.in:25
+msgid ""
+"\n"
+"\n"
+"Remove patch(es) from the current stack. A number of patches to remove,\n"
+"or a patch name can be specified. If a patch name is given, remove all\n"
+"patches applied on top of the named patch. If neither a number nor a\n"
+"patch name is specified, remove the next patch from the series file.\n"
+"\n"
+"-a\tRemove all applied patches.\n"
+"\n"
+"-f\tForce remove. The state before the patch(es) were applied will\n"
+"\tbe restored from backup files.\n"
+"\n"
+"-R\tRemove the patch with \\`patch -R' and check if the patch reverts\n"
+"\tall changes properly.\n"
+"\n"
+"-q\tQuiet operation.\n"
+"\n"
+"-v\tVerbose operation.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/pop.in:146
+msgid "Patch $stop_at_patch is not applied."
+msgstr ""
+
+#: ../quilt/pop.in:156
+msgid "No patch removed"
+msgstr ""
+
+#: ../quilt/pop.in:170 ../quilt/push.in:201
+msgid "Interrupted by user"
+msgstr ""
+
+#: ../quilt/pop.in:179 ../quilt/push.in:210
+msgid "No patches applied"
+msgstr ""
+
+#: ../quilt/pop.in:181 ../quilt/push.in:212
+msgid "Now at patch $patch"
+msgstr ""
+
+#: ../quilt/previous.in:22
+msgid "Usage: quilt previous [-n] [patch]"
+msgstr ""
+
+#: ../quilt/previous.in:25
+msgid ""
+"\n"
+"\n"
+"Print the name of the previous patch before the specified or topmost\n"
+"patch in the series file.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/push.in:21
+msgid "Usage: quilt push [-afqv] [--leave-rejects] [num|patch]"
+msgstr ""
+
+#: ../quilt/push.in:24
+msgid ""
+"\n"
+"\n"
+"Apply patch(es) from the series file. A number of patches to apply, or\n"
+"a patch name can be specified. If a patch name is given, apply all\n"
+"patches up to and including the named patch. If neither a number nor a\n"
+"patch name is specified, apply the next patch from the series file.\n"
+"\n"
+"-a\tApply all patches in the series file.\n"
+"\n"
+"-f\tForce apply, even if the patch has rejects.\n"
+"\n"
+"-q\tQuiet operation.\n"
+"\n"
+"-v\tVerbose operation.\n"
+"\n"
+"--leave-rejects\n"
+"\tLeave around the reject files patch produced, even if the patch\n"
+"\tis not actually applied.\n"
+"\n"
+"--interactive\n"
+"\tAllow the patch utility to ask how to deal with conflicts. If\n"
+"\tthis option is not given, the option -f will be passed to the \n"
+"\tpatch program.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/push.in:86
+msgid "Patch $stop_at_patch not found in file series"
+msgstr ""
+
+#: ../quilt/push.in:162
+msgid "Patch $stop_at_patch is already applied."
+msgstr ""
+
+#: ../quilt/push.in:186
+msgid "File series fully applied, ends at patch $top"
+msgstr ""
+
+#: ../quilt/refresh.in:27
+msgid "Usage: quilt refresh [-p n] [-f] [patch]"
+msgstr ""
+
+#: ../quilt/refresh.in:31
+msgid ""
+"\n"
+"\n"
+"Refreshes the specified patch, or the topmost patch by default.\n"
+"Documentation that comes before the actual patch in the patch file is\n"
+"retained.\n"
+"\n"
+"It is possible to refresh patches that are not on top. If any patches\n"
+"on top of the patch to refresh modify the same files, the script aborts\n"
+"by default. Patches can still be refreshed with -f. In that case this\n"
+"script will print a warning for each shadowed file, changes by more\n"
+"recent patches will be ignored, and only changes in files that have not\n"
+"been modified by any more recent patches will end up in the specified\n"
+"patch.\n"
+"\n"
+"-p n\tCreate a -p n style patch (-p0 or -p1 supported).\n"
+"\t\n"
+"-f\tForce refresh, even if more recent patches modify\n"
+"\tsome of the same files.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/refresh.in:123
+msgid ""
+"Cannot refresh patches with -p$opt_strip_level, please specify -p0 or -p1 "
+"instead"
+msgstr ""
+
+#: ../quilt/refresh.in:150
+msgid "More recent patches modify files in $patch. Enforce refresh with -f."
+msgstr ""
+
+#: ../quilt/refresh.in:157
+msgid "Nothing in patch $patch"
+msgstr ""
+
+#: ../quilt/refresh.in:197
+msgid "Refreshed patch $patch"
+msgstr ""
+
+#: ../quilt/remove.in:22
+msgid "Usage: quilt remove [-p patch] {file} ..."
+msgstr ""
+
+#: ../quilt/remove.in:25
+msgid ""
+"\n"
+"\n"
+"Remove one or more files from the topmost or named patch. Files that\n"
+"are modified by patches on top of the specified patch cannot be removed.\n"
+"\n"
+"-p patch\n"
+"\tPatch to remove files from.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/remove.in:89
+msgid "File $file is not in patch $patch"
+msgstr ""
+
+#: ../quilt/remove.in:105
+msgid "Failed to remove file $file from patch $patch"
+msgstr ""
+
+#: ../quilt/remove.in:116
+msgid "File $file removed from patch $patch"
+msgstr ""
+
+#: ../quilt/series.in:22
+msgid "Usage: quilt series [-v]"
+msgstr ""
+
+#: ../quilt/series.in:25
+msgid ""
+"\n"
+"\n"
+"Print the names of all patches in the series file.\n"
+"\n"
+"-n\tPrint patch file names instead patch names.\n"
+"\n"
+"-v\tVerbose, more user friendly output.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/setup.in:22
+msgid "Usage: quilt setup [-d sourcedir] {seriesfile|specfile}"
+msgstr ""
+
+#: ../quilt/setup.in:25
+msgid ""
+"\n"
+"\n"
+"Initializes a source tree from a patch series file. The patch series\n"
+"file must contain the name of the relevant tar archive, in addition to\n"
+"the list of patches.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/setup.in:100
+msgid "Series file $series_file not found"
+msgstr ""
+
+#: ../quilt/setup.in:118
+msgid "create link patch $packagedir/patches to $source"
+msgstr ""
+
+#: ../quilt/setup.in:121
+msgid "creat link of $series_file"
+msgstr ""
+
+#: ../quilt/setup.in:131
+msgid "Directory $packagedir set up."
+msgstr ""
+
+#: ../quilt/top.in:22
+msgid "Usage: quilt top"
+msgstr ""
+
+#: ../quilt/top.in:25
+msgid ""
+"\n"
+"\n"
+"Print the name of the topmost patch on the current stack of applied\n"
+"patches.\n"
+"\n"
+msgstr ""
+
+#: ../quilt/unapplied.in:22
+msgid "Usage: quilt unapplied [patch]"
+msgstr ""
+
+#: ../quilt/unapplied.in:25
+msgid ""
+"\n"
+"\n"
+"Print a list of patches that are not applied, or all patches that follow\n"
+"the specified patch in the series file.\n"
+"\n"
+"-n\tPrint patch file names instead of patch names.\n"
+"\n"
+msgstr ""
+
+#: ../scripts/apatch.in:22
+msgid "Usage: $0 [-fqv] patchname"
+msgstr ""
+
+#: ../scripts/apatch.in:40
+msgid "Interrupted by user; patch $patch was not applied."
+msgstr ""
+
+#: ../scripts/apatch.in:51 ../scripts/rpatch.in:113
+msgid "Patch file $patch_file appears to be empty"
+msgstr ""
+
+#: ../scripts/apatch.in:80
+msgid "refresh_file_list failed"
+msgstr ""
+
+#: ../scripts/apatch.in:84
+msgid "Applying $patch"
+msgstr ""
+
+#: ../scripts/apatch.in:87
+msgid "Patch $patch appears to be empty, applied"
+msgstr ""
+
+#: ../scripts/apatch.in:95
+msgid "Recreated file list for $patch"
+msgstr ""
+
+#: ../scripts/apatch.in:126
+msgid "Applied $patch (forced; needs refresh)"
+msgstr ""
+
+#: ../scripts/apatch.in:130
+msgid "Patch $patch does not apply (enforce with -f)"
+msgstr ""
+
+#: ../scripts/apatch.in:186 ../scripts/rpatch.in:245
+msgid "The topmost patch $top needs to be refreshed first."
+msgstr ""
+
+#: ../scripts/rpatch.in:22
+msgid "Usage: $0 [-fRq] patchname"
+msgstr ""
+
+#: ../scripts/rpatch.in:44
+msgid "Patch does not remove changes:"
+msgstr ""
+
+#: ../scripts/rpatch.in:102
+msgid "Interrupted by user; patch $patch was not removed."
+msgstr ""
+
+#: ../scripts/rpatch.in:146
+msgid "Patch $patch appears to be empty, removed"
+msgstr ""
+
+#: ../scripts/rpatch.in:151
+msgid "Removing $patch"
+msgstr ""
+
+#: ../scripts/rpatch.in:172
+msgid "Failed to create temporary files"
+msgstr ""
+
+#: ../scripts/rpatch.in:193
+msgid "Patch $patch does not remove (enforce with -f)"
+msgstr ""
+
+#: ../scripts/spec2series.in:100 ../scripts/spec2series.in:192
+msgid " done"
+msgstr ""
--- /dev/null
+-------------------------------------------------------------------
+Sun Jul 20 00:31:53 CEST 2003 - agruen@suse.de
+
+- lib/backup-files.c: Copy files if hard linking is not possible,
+ e.g., because the backups go to a ram disc, etc.
+
+-------------------------------------------------------------------
+Wed 26 Jun 15:35:55 CEST 2003 - martin.quinson@tuxfamily.org
+
+- Add what needed to have inteligent bash completion when using quilt
+- Bump version to 0.24
+
+-------------------------------------------------------------------
+Wed 25 Jun 15:35:55 CEST 2003 - martin.quinson@tuxfamily.org
+
+- Make clean before dist to avoid to put cruft in tarballs
+- remove po/*mo on make clean
+- update fr.po
+- Fix a typo in push.in help message about --interactive
+
+-------------------------------------------------------------------
+Tue May 20 13:22:18 CEST 2003 - agruen@suse.de
+
+- Preserve permissions of files added with `quilt add'.
+
+-------------------------------------------------------------------
+Sun May 18 15:23:03 CEST 2003 - agruen@suse.de
+
+- Do not add the whole /usr/share/locale directory to the RPM
+ file list, but only the quilt message catalogs: Otherwise RPM
+ complains when uninstalling.
+
+-------------------------------------------------------------------
+Fri May 16 20:44:50 CEST 2003 - agruen@suse.de
+
+- Rename DIFF_OPTS environment variable to QUILT_DIFF_OPTS
+- Add ~/.quiltrc resource file (this file is sourced from
+ the patchfsn file, which is used by all commands).
+
+-------------------------------------------------------------------
+Fri Apr 11 17:17:35 CEST 2003 - agruen@suse.de
+
+- Apply patches with `patch -f' by default. Add --interactive
+ option top `quilt push' to allow applying patches without
+ `patch -f'.
+
+-------------------------------------------------------------------
+Wed Apr 9 12:08:47 CEST 2003 - agruen@suse.de
+
+- Remove awk hacks in Makefile.in with shell loop and sed hack:
+ The awk hack(s) didn't work for Martin Quinson.
+
+-------------------------------------------------------------------
+Wed Apr 9 04:00:52 CEST 2003 - agruen@suse.de
+
+- Never reorder files in patches. (Previously the file list
+ was run through (sort | uniq) to remove duplicate entries.)
+- Update test script to new format, and add regression test
+ cases.
+
+-------------------------------------------------------------------
+Wed Apr 9 02:38:30 CEST 2003 - agruen@suse.de
+
+- The change from Mar 24 caused empty lines to be removed in
+ patch descriptions.
+
+-------------------------------------------------------------------
+Mon Apr 7 16:03:55 CEST 2003 - agruen@suse.de
+
+- `head -1' and `tail -1' is non-standard and deprecated, and
+ does not work with coreutils-5.0 any longer.
+
+-------------------------------------------------------------------
+Sat Apr 5 22:17:44 CEST 2003 - agruen@suse.de
+
+- Improve error checking of `quilt diff'.
+
+-------------------------------------------------------------------
+Mon Mar 24 12:29:58 CET 2003 - agruen@suse.de
+
+- Update patch_description function used in `quilt refresh' to
+ recognize `====' lines. Without that, quilt thinks these
+ lines are part of the comments before the actual patch starts,
+ so those lines will accumulate.
+
+-------------------------------------------------------------------
+Sun Mar 23 21:37:20 CET 2003 - agruen@suse.de
+
+- Update test script to reflect recent patch format changes.
+
+-------------------------------------------------------------------
+Sat Mar 22 12:28:43 CET 2003 - agruen@suse.de
+
+- Also substitute @SED@ and @AWK@.
+- Some versions of sed don't like '\t'. Expand those in the
+ shell instead.
+
+-------------------------------------------------------------------
+Fri Mar 21 10:42:27 CET 2003 - agruen@suse.de
+
+- Bump version number to 0.23 (CVS tag VER_0_23).
+
+-------------------------------------------------------------------
+Fri Feb 14 15:53:52 CET 2003 - agruen@suse.de
+
+- A couple more I18N fixes, minor cleanups in status messages.
+- Remove "quilt guidiff" (obsolete).
+
+-------------------------------------------------------------------
+Fri Feb 14 14:10:39 CET 2003 - martin.quinson@tuxfamily.org
+
+- Implement i18n, along with the french l10n.
+- It was long enough that we didn't release, so bump the version number.
+
+-------------------------------------------------------------------
+Sat Feb 8 15:43:26 CET 2003 - agruen@suse.de
+
+- Merge James Rowe <Jay@jnrowe.uklinux.net>'s quilt-help.diff
+ patch that fixes several help messages.
+
+-------------------------------------------------------------------
+Thu Feb 6 01:22:52 CET 2003 - agruen@suse.de
+
+- Quilt refresh: Create sub-directories in patches directory
+ so that new patches in sub-directories can be added easily.
+
+-------------------------------------------------------------------
+Wed Feb 5 12:37:34 CET 2003 - agruen@suse.de
+
+- Quilt diff: If a patch has been force applied, quilt diff -z
+ will also have failures when generating the temporary files.
+ Ignore these failures in this case.
+- Add -R option to quilt diff to generate a a reverse patch.
+- Fix deleting the temporary directory (by using an absolute
+ instead of a relative path).
+
+-------------------------------------------------------------------
+Sun Feb 2 15:23:20 CET 2003 - agruen@suse.de
+
+- Make quilt setup recognize the "# Sourcedir:" directive.
+- Fix bug with spurious `Index:' lines in diff/refresh output.
+- Add --diff option to quilt diff that allows to specify a
+ different utility that diff to run files through. (That utility
+ is only called for files that contain differences, not for
+ files that are in a patches' file list but jave not been
+ changed.)
+
+-------------------------------------------------------------------
+Sat Feb 1 18:52:15 CET 2003 - agruen@suse.de
+
+- Integrate James Rowe's Autoconf setup (with a comple of
+ additional changes/fixes).
+- Add some messages in configure.ac.
+- Make distclean removes autoconf garbage. The configure script is
+ no source file. Add rule to create it when necessary.
+- Invoke configure in the RPM spec file.
+- Merge James Rowe's guidiff.
+
+-------------------------------------------------------------------
+Fri Jan 31 13:05:18 CET 2003 - agruen@suse.de
+
+- Add syntax highlighting tags for emacs and vim.
+- Move all scripts from lib/ to scripts/. Install lib/backup-files
+ in /usr/lib/quilt/, and install the scripts in
+ /usr/share/quilt/scripts/, so that no binaries are installed
+ under /usr/share.
+- Fix quoting strings for inclusion in regular expressions.
+- Change literal '@SUBST@' strings in Makefile to '@SUBST''@',
+ so that Autoconf won't mess them up later.
+
+-------------------------------------------------------------------
+Fri Jan 31 09:15:01 CET 2003 - Martin.Quinson@ens-lyon.fr
+
+- Change '#!@BASH@' to '#! @BASH@'. It can look a bit stupid, but
+ it's needed for maximal portability.
+
+-------------------------------------------------------------------
+Fri Jan 31 08:52:20 CET 2003 - Martin.Quinson@ens-lyon.fr
+
+- Fight lintian warnings (lintian is a tool to check debian
+ packages):
+- Remove the dependencies on essential packages diff, gzip,
+ debianutils
+- Format the copyright file properly
+- Remove the #! /bin/bash header from patchfns, since it's not an
+ executable script, but a stuff to be sourced by others.
+
+-------------------------------------------------------------------
+Thu Jan 30 23:56:21 CET 2003 - agruen@suse.de
+
+- Also substitute @MKTEMP@.
+- For improved scripting support, add -n option to scripts that
+ print patch names prints the patch file name instead. This
+ is useful for selecting which patches to grep, etc.
+
+-------------------------------------------------------------------
+Thu Jan 30 19:02:14 CET 2003 - agruen@suse.de
+
+- Allow a file list to be diffed to be passed to quilt diff. Add
+ -P option for specifying a patch different from the topmost
+ patch,
+
+-------------------------------------------------------------------
+Thu Jan 30 16:11:00 CET 2003 - Martin.Quinson@ens-lyon.fr
+
+- Remove useless oldies. Missing functionnalities needs to be
+ reimplemented almost from the scratch due to the bunch of
+ changes to the core since those scripts were written.
+
+-------------------------------------------------------------------
+Thu Jan 30 13:25:51 CET 2003 - agruen@suse.de
+- Fix some regex quoting; use grep -E because we quote for extended
+ regexps. Filenames with "+^$" in it did not work in some places.
+- Prepare for GNU Autoconf: substitute @PERL@, @BASH@, @DIFF@,
+ @PATCH@ in scripts.
+- Some cleanups in Makefile.
+- Move documentation to doc/.
+- Forgot to mention that the patches produced now contain
+ `Index: dir/filename' just before the diff output for each file.
+ This is required by POSIX, and is also used by diffstat.
+- Adjust patch_description documentation extraction function to
+ check for Index: lines.
+- Quilt refresh looses text before actual patch due to but in
+ patch_description function.
+
+-------------------------------------------------------------------
+Tue Jan 28 23:41:19 CET 2003 - agruen@suse.de
+
+- Add --leave-rejects option to quilt push and apatch, to
+ leave reject files around for inspection even if a patch
+ does not apply.
+
+-------------------------------------------------------------------
+Tue Jan 28 23:38:59 CET 2003 - agruen@suse.de
+
+- Restart change log at quilt-0.21. Let orderly development
+ begin :)
--- /dev/null
+#
+# spec file for quilt - patch management scripts
+#
+
+Name: quilt
+Summary: Scripts for working with series of patches
+License: GPL
+Group: Productivity/Text/Utilities
+Version: 0
+Release: 0
+Requires: coreutils diffutils patch gzip bzip2 perl mktemp gettext
+Autoreqprov: off
+Source: quilt-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+
+%description
+The scripts allow to manage a series of patches by keeping
+track of the changes each patch makes. Patches can be
+applied, un-applied, refreshed, etc.
+
+The scripts are heavily based on Andrew Morton's patch scripts
+found at http://www.zip.com.au/~akpm/linux/patches/.
+
+Authors:
+--------
+ Andrew Morton <akpm@digeo.com>
+ Andreas Gruenbacher <agruen@suse.de>
+
+%prep
+%setup
+
+%build
+./configure
+make prefix=/usr BUILD_ROOT=$RPM_BUILD_ROOT
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install prefix=/usr BUILD_ROOT=$RPM_BUILD_ROOT
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-, root, root)
+/usr/bin/guards
+/usr/bin/quilt
+
+/usr/share/quilt/
+/usr/lib/quilt/
+
+/usr/share/locale/*/LC_MESSAGES/quilt.mo
+
+%doc /usr/share/man/man1/guards.1.gz
+%doc doc/README
+
+%changelog
+# The changelog is filled in by "make spec".
+
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt add [-p patch] {file} ..."
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Add one or more files to the topmost or named patch. Files must be
+added to the patch before being modified. Files that are modified by
+patches on top of the specified patch cannot be added.
+
+-p patch
+ Patch to add files to."
+
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o p:h -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -p)
+ opt_patch=$2
+ shift 2 ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -lt 1 ]
+then
+ usage
+fi
+
+patch=$(stripit $opt_patch)
+if [ -z "$patch" ]
+then
+ patch=$(top_patch)
+fi
+if [ -z "$patch" ]
+then
+ echo $"No patch applied"
+fi
+
+if ! is_applied $patch
+then
+ echo $"Patch $patch is not applied"
+ exit 1
+fi
+
+status=0
+for file in $*
+do
+ if file_in_patch $file $patch
+ then
+ echo $"File $file is already in patch $patch"
+ status=1
+ continue
+ fi
+ next_patch=$(next_patch_for_file $patch $file)
+ if [ -n "$next_patch" ]
+ then
+ echo $"File $file modified by patch $next_patch"
+ status=1
+ continue
+ fi
+
+ if ! @LIB@/backup-files -s -B .pc/$patch/ $file || \
+ ! echo $file >> $(pc_file_name $patch)
+ then
+ echo $"Failed to back up file $file" >&2
+ status=1
+ continue
+ fi
+
+ if [ -e $file ]
+ then
+ if [ "$(ls -dl $file | @AWK@ '{print $2}')" -gt 1 ]
+ then
+ # We have a file with several hard links.
+ # As the file may likely be modified by hand
+ # now, create a copy to make sure nothing
+ # happens to the original file.
+ tmpfile=$(gen_tempfile $file) &&
+ cp -fp $file $tmpfile &&
+ mv -f $tmpfile $file
+ rm -f $tmpfile
+ fi
+ fi
+
+ echo $"File $file added to patch $patch"
+done
+exit $status
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt applied [-n] [patch]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Print a list of applied patches.
+
+-n Print patch file names instead of patch names.
+
+"
+
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o nh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -n)
+ opt_filenames=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -gt 1 ]
+then
+ usage
+elif [ $# -eq 1 ]
+then
+ patch=$(stripit $1)
+ if ! is_applied "$patch"
+ then
+ echo $"Patch $patch is not applied" >&2
+ exit 1
+ fi
+else
+ patch=$(top_patch)
+fi
+
+for patch in $(applied_before "$patch") $patch
+do
+ [ -n "$opt_filenames" ] && patch=$(patch_file_name $patch)
+ echo $patch
+done
+
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt delete [patch]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Remove the specified or topmost patch from the series file. If the
+patch is applied, quilt will attempt to remove it first. (Only the
+topmost patch can be removed right now.)"
+
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o h -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -gt 1 ]
+then
+ usage
+fi
+
+patch=$(stripit $1)
+
+if [ -z "$patch" ]
+then
+ patch="$(top_patch)"
+ if [ -z "$patch" ]
+ then
+ echo $"No patch applied"
+ exit 1
+ fi
+else
+ if ! patch_in_series $patch
+ then
+ echo $"Patch $patch does not exist"
+ exit 1
+ fi
+fi
+if is_applied $patch
+then
+ if [ "$patch" != "$(top_patch)" ] || \
+ ! @SCRIPTS@/rpatch -fq "$patch"
+ then
+ echo $"Patch $patch is currently applied"
+ exit 1
+ fi
+fi
+if ! remove_from_series $patch
+then
+ echo $"Failed to remove patch $patch"
+fi
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ local redirect
+ if [ x$1 != x-h ]
+ then
+ redirect='>&2'
+ fi
+ echo $"Usage: quilt diff [-p n] [-c patch|-z] [-R] [-P patch] [file ...]" $redirect
+
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Produces a diff of the specified file(s) in the topmost or specified
+patch. If no files are specified, all files that are modified are
+included.
+
+-p n Create a -p n style patch (-p0 or -p1 are supported).
+
+-P patch
+ Create a diff for the specified patch. (Defaults to the topmost
+ patch.)
+
+-c patch
+ Create a combined diff for all patches between this patch and
+ the patch specified with -P. A patch name of \"-\" is equivalent
+ to specifying the first applied patch.
+
+-R Create a reverse diff.
+
+-z Write to standard output the changes that have been made
+ relative to the topmost or specified patch.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+do_diff()
+{
+ local file=$1 old_file=$2 new_file=$3
+
+ if [ -n "$opt_reverse" ]
+ then
+ local f=$new_file
+ new_file=$old_file
+ old_file=$f
+ fi
+
+ if [ -n "$opt_diff" ]
+ then
+ if ! @DIFF@ -qN $old_file $new_file >/dev/null
+ then
+ $opt_diff $old_file $new_file
+ true
+ fi
+ else
+ diff_file $file $old_file $new_file
+ fi
+}
+
+die ()
+{
+ local status=$1
+ [ -n "$workdir" ] && rm -rf $workdir
+ exit $status
+}
+
+options=`getopt -o p:P:c:Rzh --long diff: -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -p)
+ opt_strip_level=$2
+ shift 2 ;;
+ -P)
+ last_patch=$(stripit $2)
+ shift 2 ;;
+ -c)
+ opt_combine=$(stripit $2)
+ shift 2 ;;
+ -R)
+ opt_reverse=1
+ shift ;;
+ -z)
+ opt_relative=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --diff)
+ opt_diff=$2
+ shift 2 ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+opt_files=( "$@" )
+
+if [ -n "$opt_combine" -a -n "$opt_relative" ]
+then
+ echo $"Options \`-c patch' and \`-z' cannot be combined."
+ die 1
+fi
+
+if [ -z "$last_patch" ]
+then
+ last_patch=$(top_patch)
+ if [ -z "$last_patch" ]
+ then
+ echo $"No patch seem to be applied" >&2
+ die 1
+ fi
+fi
+
+if ! is_applied "$last_patch"
+then
+ echo $"Patch $last_patch is not applied" >&2
+ die 1
+fi
+
+if [ -z "$opt_strip_level" ]
+then
+ opt_strip_level=$(patch_strip_level $last_patch)
+fi
+if [ "$opt_strip_level" != 0 -a "$opt_strip_level" != 1 ]
+then
+ echo $"Cannot diff patches with -p$opt_strip_level, please specify -p0 or -p1 instead" >&2
+ die 1
+fi
+
+if [ -n "$opt_combine" ]
+then
+ if ! refresh_patches_per_file
+ then
+ echo $"refresh_patches_per_file failed."
+ die 1
+ fi
+
+ set -- $(patches_before $last_patch) $last_patch
+ if [ "x$opt_combine" != "x-" ]
+ then
+ while [ $# -ge 1 -a "$1" != "$opt_combine" ]
+ do
+ shift
+ done
+ if [ $# -eq 0 ]
+ then
+ echo $"Patch $opt_combine not applied before $last_patch."
+ die 1
+ fi
+ fi
+
+ while read file first garbage
+ do
+ if [ ${#opt_files[@]} -gt 0 ] && \
+ ! in_array "$file" "${opt_files[@]}"
+ then
+ continue
+ fi
+ patches[${#patches[@]}]="$first"
+ files[${#files[@]}]="$file"
+ done \
+ < <(modified_files -- "$@")
+else
+ for file in $(files_in_patch $last_patch)
+ do
+ if [ ${#opt_files[@]} -gt 0 ] && \
+ ! in_array "$file" "${opt_files[@]}"
+ then
+ continue
+ fi
+ files[${#files[@]}]="$file"
+ done
+fi
+
+if [ ${#opt_files[@]} -gt 0 ]
+then
+ for file in "${opt_files[@]}"
+ do
+ if ! in_array "$file" "${files[@]}"
+ then
+ echo $"File $file is not being modified."
+ fi
+ done
+fi
+
+trap "die 1" SIGTERM
+
+if [ -n "$opt_relative" ]
+then
+ patch_file=$(patch_file_name $last_patch)
+ pc_file=$(pc_file_name $last_patch)
+ patch_args=$(patch_args $last_patch)
+ workdir=$(gen_tempfile -d $PWD/quilt)
+ pwd=$PWD
+
+ if ! cd .pc/$last_patch
+ then
+ echo $"Cannot change into .pc/$last_patch"
+ die 1
+ fi
+ if ! cp -l --parents "${files[@]}" $workdir/
+ then
+ echo $"Failed to copy files to temporary directory"
+ die 1
+ fi
+ if ! cd $workdir
+ then
+ echo $"Cannot change to temporary directory"
+ die 1
+ fi
+
+ if [ -s $pwd/$patch_file ]
+ then
+ if ! cat_file $pwd/$patch_file \
+ | @PATCH@ $patch_args --no-backup-if-mismatch \
+ -E >/dev/null 2>/dev/null
+ then
+ # If a patch was force applied (and therefore needs
+ # refreshing), we know that patching the temporary
+ # files won't succeed, either. So, ignore the error
+ # in that particular case.
+
+ if ! [ -e $pwd/$pc_file~refresh ]
+ then
+ echo $"Failed to patch temporary files"
+ die 1
+ fi
+ fi
+ fi
+ if ! cd $pwd
+ then
+ echo $"Cannot change to source directory"
+ die 1
+ fi
+fi
+
+for ((i=0; i<${#files[@]}; i++))
+do
+ file="${files[$i]}"
+ first_patch=${patches[$i]:-$last_patch}
+
+ next_patch=$(next_patch_for_file $last_patch $file)
+ if [ -z "$next_patch" ]
+ then
+ new_file="$file"
+ else
+ new_file="$(backup_file_name $next_patch $file)"
+ files_were_shadowed=1
+ fi
+
+ if [ -z "$opt_relative" ]
+ then
+ old_file=$(backup_file_name $first_patch $file)
+ do_diff $file $old_file $new_file
+ else
+ do_diff $file "$workdir/$file" $new_file
+ fi
+
+ if [ $? -ne 0 ]
+ then
+ echo $"Diff failed, aborting." >&2
+ die 1
+ fi
+done
+
+if [ -n "$files_were_shadowed" ]
+then
+ echo $"More recent patches modify files in $last_patch."
+ die 1
+fi
+die 0
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt files [-v] [patch]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Print the list of files that the topmost or specified patch changes.
+
+-v Verbose, more user friendly output.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o vh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -v)
+ opt_verbose=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -gt 1 ]
+then
+ usage
+fi
+opt_patch=$1
+
+if [ -n "$opt_patch" ]
+then
+ patch=$(stripit "$opt_patch")
+else
+ patch=$(top_patch)
+ if [ -z "$patch" ]
+ then
+ echo $"No patch applied" >&2
+ exit 1
+ fi
+fi
+
+if ! is_applied $patch
+then
+ if [ -n "$opt_verbose" ]
+ then
+ echo $"Patch is not applied (no verbose output)" >&2
+ opt_verbose=0
+ else
+ echo $"Patch is not applied" >&2
+ fi
+fi
+
+if [ -z "$opt_verbose" ]
+then
+ files_in_patch $patch
+else
+ for file in $(files_in_patch $patch)
+ do
+ status=" "
+ if [ -s $(backup_file_name $patch $file) ]
+ then
+ if ! [ -s $file ]
+ then
+ status="-"
+ fi
+ else
+ if [ -s $file ]
+ then
+ status="+"
+ fi
+ fi
+ echo "$status $file"
+ done
+fi
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt fork {new_patchname}"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+ Fork the next patch in the series
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o h -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -ne 1 ]
+then
+ usage
+fi
+
+patch_file=$(echo $1 | @SED@ -e 's/^'"$(quote_bre $P)"'patches\///')
+patch=$(stripit $patch_file)
+
+if patch_in_series $patch
+then
+ echo $"Patch $patch exists already, please change a new_name"
+ exit 1
+fi
+
+mkdir -p $(dirname $(pc_file_name $patch))
+rm -f $(pc_file_name $patch)
+
+next_patch=$(patches_after $(top_patch) | head -n 1)
+#copy the original patch to the cloned patch
+
+next_patch_file=$(patch_file_name $next_patch)
+next_pc=$(pc_file_name $next_patch)
+
+cp -f ${next_patch_file} patches/${patch_file}.patch
+
+#remove the original patch
+if [ -z next_patch ]
+then
+ echo $"patch ended at $(top_patch)"
+ exit 1
+else
+ remove_from_series $next_patch
+fi
+
+#add the cloned patch to series
+if ! insert_in_series ${patch_file}.patch
+then
+ echo $"Failed to fork patch $patch"
+ exit 1
+fi
+echo $"cloned $next_patch to $patch_file"
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt import [-f] [-p num] [-n patch] [patchfile]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Import an external patch. If a patch file name is specified, the patch
+will be stored in this relative path in the patches/ directory. Else,
+if an input file name is given this name is used as the patch name.
+
+-p num
+ Number of directory levels to strip when aplying (default=1)
+
+-n patch
+ File name relative to patches/ to use.
+
+-f Overwite/update existing patches.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o fn:p:h -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -n)
+ opt_patch=$(echo "$2" |
+ @SED@ -e 's/^'"$(quote_bre $P)"'patches\///' \
+ -e 's/^\.pc\///')
+ shift 2 ;;
+ -p)
+ opt_strip=$2
+ shift 2 ;;
+ -f)
+ opt_force=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -eq 1 ]
+then
+ input_file=$1
+elif [ $# -gt 1 ]
+then
+ usage
+fi
+
+[ -n "$opt_strip" ] && patch_args="-p$opt_strip"
+
+if [ -n "$opt_patch" ]
+then
+ patch=$(stripit "$opt_patch")
+ patch_file="${P}patches/$opt_patch"
+else
+ patch="$(stripit "$input_file")"
+ if [ -n "$patch" ]
+ then
+ opt_patch="$patch.patch"
+ else
+ echo $"Please use -n to specify a patch file name."
+ exit 1
+ fi
+ patch_file="${P}patches/$opt_patch"
+fi
+
+if echo "$patch_file" | grep -q -e $'[ \t]'
+then
+ echo $"Patch file name \"$patch_file\" contains whitespace."
+ exit 1
+fi
+
+if is_applied $patch
+then
+ echo $"Patch $patch is applied."
+ exit 1
+fi
+
+case "$input_file" in
+'')
+ tmpfile=$(gen_tempfile)
+ if ! cat > $tmpfile
+ then
+ echo $"Cannot read from standard input."
+ rm -f $tmpfile
+ exit 1
+ fi
+ input_file=$tmpfile ;;
+*.gz)
+ tmpfile=$(gen_tempfile)
+ if ! gzip -cd "$input_file" > $tmpfile
+ then
+ echo $"Cannot decompress file $input_file"
+ rm -f $tmpfile
+ exit 1
+ fi
+ input_file=$tmpfile ;;
+*.bz2)
+ tmpfile=$(gen_tempfile)
+ if ! bzip2 -cd "$input_file" > $tmpfile
+ then
+ echo $"Cannot decompress file $input_file"
+ rm -f $tmpfile
+ exit
+ fi
+ input_file=$tmpfile ;;
+*)
+ if ! [ -r "$input_file" ]
+ then
+ echo $"Cannot read from file $input_file"
+ exit 1
+ fi
+esac
+
+if [ -e "$patch_file" ]
+then
+ if [ -z "$opt_force" ]
+ then
+ echo $"Patch $patch exists. Replace with -f."
+ exit 1
+ fi
+
+ if grep -q '^%patch$' "$patch_file" &&
+ ! grep -q '^%patch$' "$input_file"
+ then
+ echo $"Updating %patch section of patch $patch"
+ if ! @SCRIPTS@/parse-patch -u patch $patch_file < "$input_file"
+ then
+ echo $"Failed to update %patch section of patch $patch"
+ exit 1
+ fi
+ else
+ echo $"Replacing patch $patch with new version"
+ if ! cat "$input_file" > "$patch_file"
+ then
+ echo $"Failed to replace patch $patch"
+ exit 1
+ fi
+ fi
+else
+ echo $"Importing patch $patch (stored as $patch_file)"
+ if ! grep -q '^%patch$' "$input_file"
+ then
+ echo "%patch" >> "$patch_file"
+ fi
+ if ! cat "$input_file" >> "$patch_file"
+ then
+ echo $"Failed to import patch $patch"
+ exit 1
+ fi
+fi
+
+rm -rf .pc/$patch
+
+if ! patch_in_series $patch &&
+ ! insert_in_series $opt_patch "$patch_args"
+then
+ echo $"Failed to insert $patch in file series."
+fi
+
+if [ -n "$tmpfile" ]
+then
+ rm -f $tmpfile
+fi
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt new {patchname}"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Create a new patch with the specified file name, and insert it after the
+topmost patch in the patch series file.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o h -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -ne 1 ]
+then
+ usage
+fi
+
+patch_file=$(echo $1 | @SED@ -e 's/^'"$(quote_bre $P)"'patches\///')
+patch=$(stripit $patch_file)
+
+if patch_in_series $patch
+then
+ echo $"Patch $patch exists already"
+ exit 1
+fi
+
+mkdir -p $(dirname $(pc_file_name $patch))
+rm -f $(pc_file_name $patch)
+
+if ! insert_in_series $patch_file || \
+ ! add_to_db $patch
+then
+ echo $"Failed to create patch $patch"
+ exit 1
+else
+ echo $"Patch $patch is now on top"
+fi
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt next [patch]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Print the name of the next patch after the specified or topmost patch in
+the series file.
+
+-n Print patch file names instead of patch names.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o nh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -n)
+ opt_filenames=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -gt 1 ]
+then
+ usage
+elif [ $# -eq 1 ]
+then
+ patch=$(stripit $1)
+else
+ patch=$(top_patch)
+fi
+
+if [ -z "$patch" ]
+then
+ next=$(cat_series | head -n 1)
+else
+ next=$(patches_after $patch | head -n 1)
+fi
+[ -n "$opt_filenames" ] && next=$(patch_file_name $next)
+echo "$next"
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt patches {file}"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Print the list of patches that modify the specified file.
+
+-n Print the patch file names instead of the patch names.
+
+-v Verbose, more user friendly output.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+scan_patches()
+{
+ local prefix=$1 file=$2
+ shift 2
+ local patch
+
+ for patch in $(modified_files $file -- "$@" \
+ | cut -d $'\t' -f2)
+ do
+ [ -n "$opt_filenames" ] && patch=$(patch_file_name $patch)
+
+ echo "$prefix$patch"
+ done
+}
+
+options=`getopt -o nvh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -n)
+ opt_filenames=1
+ shift ;;
+ -v)
+ opt_verbose=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -ne 1 ]
+then
+ usage
+fi
+opt_file=$1
+
+if ! refresh_patches_per_file
+then
+ exit 1
+fi
+
+if [ -n "$opt_verbose" ]
+then
+ top=$(top_patch)
+ if [ -n "$top" ]
+ then
+ patches_before="$(patches_before $top)"
+ [ -n "$patches_before" ] &&
+ scan_patches "+ " $opt_file $patches_before
+ scan_patches "= " $opt_file $top
+ patches_after="$(patches_after $top)"
+ [ -n "$patches_after" ] &&
+ scan_patches " " $opt_file $(patches_after $top)
+ else
+ scan_patches " " $opt_file
+ fi
+else
+ scan_patches "" $opt_file
+fi
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt pop [-afRqv] [num|patch]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Remove patch(es) from the current stack. A number of patches to remove,
+or a patch name can be specified. If a patch name is given, remove all
+patches applied on top of the named patch. If neither a number nor a
+patch name is specified, remove the next patch from the series file.
+
+-a Remove all applied patches.
+
+-f Force remove. The state before the patch(es) were applied will
+ be restored from backup files.
+
+-R Remove the patch with \`patch -R' and check if the patch reverts
+ all changes properly.
+
+-q Quiet operation.
+
+-v Verbose operation.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+list_patches()
+{
+ local n=0 patch
+ applied_patches \
+ | tac \
+ | if [ -n "$opt_all" ]
+ then
+ cat
+ else
+ while read patch
+ do
+ if [ -n "$number" ]
+ then
+ if [ $n -eq $number ]
+ then
+ break
+ fi
+ n=$[$n+1]
+ fi
+ if [ $patch = "$stop_at_patch" ]
+ then
+ break
+ fi
+ echo $patch
+ done
+ fi
+}
+
+options=`getopt -o fRqvah -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -f)
+ opt_force=1
+ unset opt_remove
+ shift ;;
+ -R)
+ opt_remove=1 # remove with patch -R; no tricks
+ unset opt_force
+ shift ;;
+ -q)
+ opt_quiet=1
+ shift ;;
+ -v)
+ opt_verbose=1
+ shift ;;
+ -a)
+ opt_all=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -gt 1 -o \( -n "$opt_all" -a $# -ne 0 \) ]
+then
+ usage
+fi
+
+if [ $# -eq 1 ]
+then
+ if is_numeric $1
+ then
+ number=$1
+ else
+ stop_at_patch=$(stripit $1)
+ fi
+else
+ [ -n "$opt_all" ] || number=1
+fi
+
+[ -n "$opt_force" ] &&
+ rpatch_options="$rpatch_options -f"
+[ -n "$opt_remove" ] &&
+ rpatch_options="$rpatch_options -R"
+[ -n "$opt_quiet" ] &&
+ rpatch_options="$rpatch_options -q"
+[ -n "$opt_verbose" ] &&
+ rpatch_options="$rpatch_options -v"
+
+if [ -n "$stop_at_patch" ]
+then
+ if ! is_applied $stop_at_patch
+ then
+ echo $"Patch $stop_at_patch is not applied."
+ exit 1
+ fi
+fi
+
+if ! patches=$(list_patches) 2>&1
+then
+ exit 1
+elif [ -z "$patches" ]
+then
+ echo $"No patch removed"
+ exit 0
+fi
+
+trap "interrupted=1" SIGINT
+
+for patch in $patches
+do
+ if ! @SCRIPTS@/rpatch $rpatch_options $patch
+ then
+ exit 1
+ fi
+ if [ -n "$interrupted" ]
+ then
+ echo $"Interrupted by user"
+ exit 1
+ fi
+ [ -z "$opt_quiet" ] && echo
+done
+
+patch="$(top_patch)"
+if [ -z "$patch" ]
+then
+ echo $"No patches applied"
+else
+ echo $"Now at patch $patch"
+fi
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt previous [-n] [patch]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Print the name of the previous patch before the specified or topmost
+patch in the series file.
+
+-n Print patch file names instead of patch names.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o nh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -n)
+ opt_filenames=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -gt 1 ]
+then
+ usage
+elif [ $# -eq 1 ]
+then
+ patch=$(stripit $1)
+else
+ patch=$(top_patch)
+fi
+
+previous=$(applied_before "$patch" | tail -n 1)
+if [ -n "$previous" ]
+then
+ [ -n "$opt_filenames" ] && previous=$(patch_file_name $previous)
+ echo "$previous"
+fi
+
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt push [-afqv] [--leave-rejects] [num|patch]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Apply patch(es) from the series file. A number of patches to apply, or
+a patch name can be specified. If a patch name is given, apply all
+patches up to and including the named patch. If neither a number nor a
+patch name is specified, apply the next patch from the series file.
+
+-a Apply all patches in the series file.
+
+-f Force apply, even if the patch has rejects.
+
+-q Quiet operation.
+
+-v Verbose operation.
+
+--leave-rejects
+ Leave around the reject files patch produced, even if the patch
+ is not actually applied.
+
+--interactive
+ Allow the patch utility to ask how to deal with conflicts. If
+ this option is not given, the option -f will be passed to the
+ patch program.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+list_patches()
+{
+ local top=$(top_patch) n=0 patch
+ if [ -n "$top" ]
+ then
+ patches_after $top
+ else
+ cat_series
+ fi \
+ | if [ -n "$opt_all" ]
+ then
+ cat
+ else
+ while read patch
+ do
+ if [ -n "$number" ]
+ then
+ if [ $n -eq $number ]
+ then
+ break
+ fi
+ n=$[$n+1]
+ fi
+ echo $patch
+ if [ $patch = "$stop_at_patch" ]
+ then
+ break
+ fi
+ done
+ if [ -n "$stop_at_patch" -a "$patch" != "$stop_at_patch" ]
+ then
+ echo $"Patch $stop_at_patch not found in file series" >&2
+ return 1
+ fi
+ fi
+}
+
+options=`getopt -o fqvah --long leave-rejects,interactive -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -f)
+ opt_force=1
+ shift ;;
+ -q)
+ opt_quiet=1
+ shift ;;
+ -v)
+ opt_verbose=1
+ shift ;;
+ -a)
+ opt_all=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --leave-rejects)
+ opt_leave_rejects=1
+ shift ;;
+ --interactive)
+ opt_interactive=1
+ shift ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -gt 1 -o \( -n "$opt_all" -a $# -ne 0 \) ]
+then
+ usage
+fi
+
+if [ $# -eq 1 ]
+then
+ if is_numeric $1
+ then
+ number=$1
+ else
+ stop_at_patch=$(stripit $1)
+ fi
+else
+ [ -z "$opt_all" ] && number=1
+fi
+
+[ -n "$opt_force" ] &&
+ apatch_options="$apatch_options -f"
+[ -n "$opt_quiet" ] &&
+ apatch_options="$apatch_options -q"
+[ -n "$opt_verbose" ] &&
+ apatch_options="$apatch_options -v"
+[ -n "$opt_leave_rejects" ] &&
+ apatch_options="$apatch_options --leave-rejects"
+[ -n "$opt_interactive" ] &&
+ apatch_options="$apatch_options --interactive"
+
+if [ -n "$stop_at_patch" ]
+then
+ if is_applied $stop_at_patch
+ then
+ echo $"Patch $stop_at_patch is already applied."
+ exit 1
+ fi
+fi
+if ! patches=$(list_patches) 2>&1
+then
+ exit 1
+elif [ -z "$patches" ]
+then
+ top=$(top_patch)
+ top_patch_file=$(patch_file_name $top)
+
+ if [ -z "$top_patch_file" ]
+ then
+ echo "Now the top patch $top are not in series files anymore"
+ echo "Can not decide your next patches from the seriesi!"
+ echo "please pop -f the top file and check your series file again"
+ exit 1
+ fi
+
+ if [ -z "$top" ]
+ then
+ echo $"No patch applied"
+ else
+ echo $"File series fully applied, ends at patch $top"
+ fi
+ exit 0
+fi
+
+trap "interrupted=1" SIGINT
+
+for patch in $patches
+do
+ if ! @SCRIPTS@/apatch $apatch_options $patch
+ then
+ exit 1
+ fi
+ if [ -n "$interrupted" ]
+ then
+ echo $"Interrupted by user"
+ exit 1
+ fi
+ [ -z "$opt_quiet" ] && echo
+done
+
+patch="$(top_patch)"
+if [ -z "$patch" ]
+then
+ echo $"No patches applied"
+else
+ echo $"Now at patch $patch"
+fi
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ local redirect
+ if [ x$1 != x-h ]
+ then
+ redirect='>&2'
+ fi
+ echo $"Usage: quilt refresh [-p n] [-f] [patch]" $redirect
+
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Refreshes the specified patch, or the topmost patch by default.
+Documentation that comes before the actual patch in the patch file is
+retained.
+
+It is possible to refresh patches that are not on top. If any patches
+on top of the patch to refresh modify the same files, the script aborts
+by default. Patches can still be refreshed with -f. In that case this
+script will print a warning for each shadowed file, changes by more
+recent patches will be ignored, and only changes in files that have not
+been modified by any more recent patches will end up in the specified
+patch.
+
+-p n Create a -p n style patch (-p0 or -p1 supported).
+
+-f Force refresh, even if more recent patches modify
+ some of the same files.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+die ()
+{
+ local status=$1
+ [ -n "$tmpfile" ] && rm -f $tmpfile
+ [ -n "$tmpfile2" ] && rm -f $tmpfile2
+ exit $status
+}
+
+options=`getopt -o p:fh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -p)
+ opt_strip_level=$2
+ shift 2 ;;
+ -f)
+ opt_force=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -eq 1 ]
+then
+ opt_patch=$1
+elif [ $# -gt 1 ]
+then
+ usage
+fi
+
+if [ -n "$opt_patch" ]
+then
+ patch=$(stripit $opt_patch)
+else
+ patch=$(top_patch)
+ if [ -z "$patch" ]
+ then
+ echo $"No patch seem to be applied" >&2
+ exit 1
+ fi
+fi
+
+if ! is_applied "$patch"
+then
+ echo $"Patch $patch is not applied" >&2
+ exit 1
+fi
+
+if [ -z "$opt_strip_level" ]
+then
+ opt_strip_level=$(patch_strip_level $patch)
+fi
+if [ $opt_strip_level -gt 1 ]
+then
+ echo $"Cannot refresh patches with -p$opt_strip_level, please specify -p0 or -p1 instead" >&2
+ exit 1
+fi
+
+trap "die 1" SIGTERM
+
+tmpfile=$(gen_tempfile)
+
+for file in $(files_in_patch $patch)
+do
+ old_file=$(backup_file_name $patch $file)
+ next_patch=$(next_patch_for_file $patch $file)
+ if [ -z "$next_patch" ]
+ then
+ new_file=$file
+ else
+ new_file=$(backup_file_name $next_patch $file)
+ files_were_shadowed=1
+ fi
+ if ! diff_file $file $old_file $new_file >> $tmpfile
+ then
+ echo $"Diff failed, aborting." >&2
+ die 1
+ fi
+
+ if [ -n "$files_were_shadowed" -a -z "$opt_force" ]
+ then
+ echo $"More recent patches modify files in $patch. Enforce refresh with -f." >&2
+ die 1
+ fi
+done
+
+if ! [ -s $tmpfile ]
+then
+ echo $"Nothing in patch $patch" >&2
+ die 1
+fi
+
+patch_file=$(patch_file_name $patch)
+
+trap "" SIGINT
+
+if [ -e $patch_file ] && grep -q '^%patch$' $patch_file
+then
+ if [ -x "@DIFFSTAT@" ]
+ then
+ @DIFFSTAT@ $tmpfile 2>/dev/null \
+ | @SCRIPTS@/parse-patch -u diffstat $patch_file
+ fi
+ cat $tmpfile \
+ | @SCRIPTS@/parse-patch -u patch $patch_file
+else
+ if ! tmpfile2=$(gen_tempfile)
+ then
+ die 1
+ fi
+
+ mkdir -p $(dirname $patch_file)
+
+ if ! cat_file $patch_file \
+ | patch_description > $tmpfile2 || \
+ ! cat $tmpfile >> $tmpfile2 || \
+ ! cat $tmpfile2 \
+ | cat_to_file $patch_file
+ then
+ die 1
+ fi
+fi
+if [ $? -ne 0 ]
+then
+ die 1
+fi
+
+rm -f $(pc_file_name $patch)~refresh
+echo $"Refreshed patch $patch"
+if ! change_db_strip_level -p$opt_strip_level $patch
+then
+ die 1
+fi
+die 0
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt remove [-p patch] {file} ..."
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Remove one or more files from the topmost or named patch. Files that
+are modified by patches on top of the specified patch cannot be removed.
+
+-p patch
+ Patch to remove files from.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o p:h -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -p)
+ opt_patch=$2
+ shift 2 ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -lt 1 ]
+then
+ usage
+fi
+
+patch=$(stripit $opt_patch)
+if [ -z "$patch" ]
+then
+ patch=$(top_patch)
+fi
+if [ -z "$patch" ]
+then
+ echo $"No patch applied"
+fi
+
+if ! is_applied $patch
+then
+ echo $"Patch $patch is not applied"
+ exit 1
+fi
+
+status=0
+for file in $*
+do
+ if ! file_in_patch $file $patch
+ then
+ echo $"File $file is not in patch $patch"
+ status=1
+ continue
+ fi
+
+ next_patch=$(next_patch_for_file $patch $file)
+ if [ -n "$next_patch" ]
+ then
+ echo $"File $file modified by patch $next_patch"
+ status=1
+ continue
+ fi
+
+ # Restore file from backup
+ if ! @LIB@/backup-files -s -B .pc/$patch/ -r $file
+ then
+ echo $"Failed to remove file $file from patch $patch"
+ status=1
+ continue
+ fi
+
+ pc_file=$(pc_file_name $patch)
+ tmpfile=$(gen_tempfile)
+ grep -v -E '^'"$(quote_re $file)"'$' $pc_file > $tmpfile
+ mv -f $tmpfile $pc_file
+ rm -f $tmpfile
+
+ echo $"File $file removed from patch $patch"
+done
+exit $status
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt series [-v]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Print the names of all patches in the series file.
+
+-n Print patch file names instead patch names.
+
+-v Verbose, more user friendly output.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+cat_patches()
+{
+ local prefix=$1
+ shift
+ local patch
+
+ for patch in "$@"
+ do
+ [ -n "$opt_filenames" ] && patch=$(patch_file_name $patch)
+ echo "$prefix$patch"
+ done
+}
+
+options=`getopt -o nvh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+opt_what=here
+
+while true
+do
+ case "$1" in
+ -n)
+ opt_filenames=1
+ shift ;;
+ -v)
+ opt_verbose=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -ne 0 ]
+then
+ usage
+fi
+
+if [ -n "$opt_verbose" ]
+then
+ top=$(top_patch)
+ cat_patches "+ " $(patches_before $top)
+ [ -n "$top" ] && cat_patches "= " $top
+ cat_patches " " $(patches_after $top)
+else
+ cat_series
+fi
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt setup [-d sourcedir] {seriesfile|specfile}"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Initializes a source tree from a patch series file. The patch series
+file must contain the name of the relevant tar archive, in addition to
+the list of patches.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+parse_series()
+{
+ local series="$1"
+
+ perl -e '
+ while(<>) {
+ if (/^#\s*Sourcedir:\s*(\S+)/) {
+ print "SOURCEDIR $1\n";
+ } elsif (/^#\s*[Ss]ource:\s*(\S+)\s*(-C\s*(\S+))?/) {
+ print "SOURCE $1 ", ($3 ? $3 : "."), "\n";
+ } elsif (/^#\s*[Pp]atchdir:\s*(\S+)/) {
+ print "PATCHDIR $1\n";
+ } elsif (/^([^#\s]+)/) {
+ print "PATCH $1\n";
+ }
+ }
+ ' $series
+ echo "SERIES $series"
+}
+
+options=`getopt -o d:h -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -d)
+ opt_source=$2
+ shift 2 ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -ne 1 ]
+then
+ usage
+fi
+
+case "$1" in
+*.spec)
+ spec_file="$1"
+ tmpfile=$(gen_tempfile)
+ series_file=$tmpfile
+ if ! @SCRIPTS@/spec2series "$spec_file" > $tmpfile
+ then
+ exit 1
+ fi
+ ;;
+*)
+ series_file=$1
+ if ! [ -e "$series_file" ]
+ then
+ echo $"Series file $series_file not found"
+ exit 1
+ fi
+ ;;
+esac
+
+if [ -n "$opt_source" ]
+then
+ source="$opt_source"
+elif [ -n "$spec_file" ]
+then
+ source="$(dirname "$spec_file")"
+else
+ source="$(dirname "$series_file")"
+fi
+
+packagedir=.
+
+echo $"create link patch $packagedir/patches to $source"
+ln -s "$source" "${packagedir}/patches"
+rm -rf "${packagedir}/patches/series"
+echo $"creat link of $series_file"
+ln -s "$series_file" "${packagedir}/patches/series"
+
+if [ -n "$tmpfile" ]
+then
+ rm -f $tmpfile
+fi
+
+if [ "$packagedir" != "." ]
+then
+ echo $"Directory $packagedir set up."
+fi
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt top"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Print the name of the topmost patch on the current stack of applied
+patches.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o nh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -n)
+ opt_filenames=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -ne 0 ]
+then
+ usage
+fi
+
+top=$(top_patch)
+[ -n "$opt_filenames" ] && top=$(patch_file_name $top)
+echo "$top"
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: quilt unapplied [patch]"
+ if [ x$1 = x-h ]
+ then
+ echo $"
+
+Print a list of patches that are not applied, or all patches that follow
+the specified patch in the series file.
+
+-n Print patch file names instead of patch names.
+
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+options=`getopt -o nh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -n)
+ opt_filenames=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -gt 1 ]
+then
+ usage
+elif [ $# -eq 1 ]
+then
+ patch=$(stripit $1)
+else
+ patch=$(top_patch)
+fi
+
+if [ -z "$patch" ]
+then
+ cat_series
+else
+ patches_after $patch
+fi \
+| while read patch
+do
+ [ -n "$opt_filenames" ] && patch=$(patch_file_name $patch)
+ echo "$patch"
+done
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: $0 [-fqv] patchname"
+ exit 1
+}
+
+rollback_patch()
+{
+ local patch=$1 pc_file=$(pc_file_name $patch)
+ @LIB@/backup-files $silent_unless_verbose \
+ -f $pc_file -B .pc/$patch/ -r
+ if [ -z "$opt_leave_rejects" ]
+ then
+ rm -f $(files_in_patch $patch | @SED@ -e 's/$/\.rej/')
+ fi
+}
+
+interrupt()
+{
+ rollback_patch $1
+ echo $"Interrupted by user; patch $patch was not applied."
+ exit 1
+}
+
+apply_patch()
+{
+ local patch=$1
+ local patch_file=$(patch_file_name $patch)
+
+ if ! [ -s $patch_file ]
+ then
+ echo $"Patch file $patch_file appears to be empty"
+ return 0
+ fi
+
+ if [ "x${patch_file:(-3)}" = "x.gz" ]
+ then
+ gzip -cd $patch_file \
+ | @PATCH@ $(patch_args $patch) --no-backup-if-mismatch \
+ -E $silent $force_apply
+ elif [ "x${patch_file:(-4)}" = "x.bz2" ]
+ then
+ bzip2 -cd $patch_file \
+ | @PATCH@ $(patch_args $patch) --no-backup-if-mismatch \
+ -E $silent $force_apply
+ else
+ @PATCH@ $(patch_args $patch) --no-backup-if-mismatch \
+ -E $silent -i $patch_file $force_apply
+ fi
+}
+
+apatch()
+{
+ local patch=$(stripit $1)
+ local pc_file=$(pc_file_name $patch)
+ local file status
+
+ trap "" SIGINT
+ if ! refresh_file_list $patch
+ then
+ echo $"refresh_file_list failed"
+ return 1
+ fi
+
+ echo $"Applying $patch"
+ if ! [ -e $pc_file ]
+ then
+ echo $"Patch $patch appears to be empty, applied"
+ add_to_db $patch
+ return 0
+ fi
+
+ status=$?
+ if [ $status -eq 2 ]
+ then
+ [ -z "$opt_quiet" ] && echo $"Recreated file list for $patch"
+ elif [ $status -ne 0 ]
+ then
+ return 1
+ fi
+
+ if ! @LIB@/backup-files $silent_unless_verbose \
+ -f $pc_file -B .pc/$patch/
+ then
+ exit 1
+ fi
+
+ trap "interrupt $patch" SIGINT
+
+ apply_patch $patch
+ status=$?
+
+ trap "" SIGINT
+
+ # Remember date/time of applying so that pop can
+ # avoid reverse applying the patch in the usual cases.
+ touch $pc_file
+
+ if [ $status -eq 0 -o -n "$opt_force" ]
+ then
+ add_to_db $patch
+ if [ $status -eq 0 ]
+ then
+ rm -f $pc_file~refresh
+ else
+ touch $pc_file~refresh
+ echo $"Applied $patch (forced; needs refresh)"
+ fi
+ else
+ rollback_patch $patch
+ echo $"Patch $patch does not apply (enforce with -f)"
+ status=1
+ fi
+ trap - SIGINT
+ return $status
+}
+
+options=`getopt -o fqvh --long leave-rejects,interactive -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -f)
+ opt_force=1
+ shift ;;
+ -q)
+ opt_quiet=1
+ shift ;;
+ -v)
+ opt_verbose=1
+ shift ;;
+ --leave-rejects)
+ opt_leave_rejects=1
+ shift ;;
+ --interactive)
+ opt_interactive=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -ne 1 ]
+then
+ usage
+fi
+
+[ -n "$opt_quiet" ] && silent=-s
+[ -z "$opt_verbose" ] && silent_unless_verbose=-s
+[ -z "$opt_interactive" ] && force_apply=-f
+
+patch=$(stripit $1)
+
+top=$(top_patch)
+if [ -n "$top" -a -e $(pc_file_name $top)~refresh ]
+then
+ echo $"The topmost patch $top needs to be refreshed first."
+ exit 1
+fi
+
+apatch $patch
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#!@PERL@ -w
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Extract or update a section from a combined patch + documentation +
+# meta information file.
+
+use FileHandle;
+use Getopt::Long;
+use File::Temp qw(tempfile);
+use strict;
+
+my $select;
+my $update;
+
+if (!GetOptions("s|select=s" => \$select,
+ "u|update=s" => \$update) ||
+ (!defined $select && !defined $update)) {
+ print STDERR "USAGE: $0 {-s|-u} section file [< replacement]\n";
+ exit 1;
+}
+
+foreach my $arg (@ARGV) {
+ my $fh;
+
+ if (! -e $arg) {
+ $fh = new FileHandle("/dev/null");
+ } elsif ($arg =~ /\.gz$/) {
+ $fh = new FileHandle("gzip -cd $arg |");
+ } elsif ($arg =~ /\.bz2$/) {
+ $fh = new FileHandle("bzip2 -cd $arg |");
+ } else {
+ $fh = new FileHandle("< $arg");
+ }
+
+ unless ($fh) {
+ print STDERR "$arg: $!\n";
+ next;
+ }
+
+ if (defined $select) {
+ my $section = "head";
+ my $newline = "";
+ while (<$fh>) {
+ if (/^%(.*)/) {
+ last if $section eq $select;
+ $section = $1;
+ next;
+ }
+ if ($section eq $select) {
+ print $newline;
+ if ($_ eq "\n") {
+ $newline = $_;
+ } else {
+ $newline="";
+ print;
+ }
+ }
+ }
+ } elsif (defined $update) {
+ my ($fh2, $tempname) = tempfile("$arg.XXXXXX");
+ if ($arg =~ /\.gz$/) {
+ $fh2->close();
+ if (! -e $tempname) {
+ die "File $tempname disappeared!\n";
+ }
+ $fh2 = new FileHandle("| gzip -c > $tempname");
+ } elsif ($arg =~ /\.bz2$/) {
+ $fh2->close();
+ if (! -e $tempname) {
+ die "File $tempname disappeared!\n";
+ }
+ $fh2 = new FileHandle("| bzip2 -c > $tempname");
+ }
+ unless ($fh2) {
+ die "$tempname: $!\n";
+ }
+
+ # Copy things before updated section
+ my $last_was_newline=1; # start first section in first line
+ while (<$fh>) {
+ if (/^%(.*)/ && $1 eq $update) {
+ last;
+ }
+ $last_was_newline = ($_ eq "\n");
+ print $fh2 $_;
+ }
+ print $fh2 "\n"
+ unless ($last_was_newline);
+
+ # Create/replace updated section
+ print $fh2 "%$update\n";
+ while (<STDIN>) {
+ print $fh2 $_;
+ }
+ print $fh2 "\n";
+
+ # Skip obsolete section
+ while (<$fh>) {
+ if (/^%(.*)/) {
+ print $fh2 $_;
+ last;
+ }
+ }
+ # Copy things after updated section
+ while (<$fh>) {
+ print $fh2 $_;
+ }
+ unless (close $fh2) {
+ die "$arg.patch: $!\n";
+ }
+
+ if (-e $arg) {
+ unlink "$arg~";
+ unless (rename $arg, "$arg~") {
+ die "Failed to rename $arg to $arg~: $!\n";
+ }
+ }
+ unless (rename $tempname, $arg) {
+ rename("$arg~", $arg);
+ die "Failed to rename $arg.parse to $arg: $!\n";
+ }
+ }
+ close $fh;
+}
--- /dev/null
+# This file contains the common functions used in all quilt script
+# It is meant to be sourced by bash scripts.
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+export TEXTDOMAIN=quilt
+
+
+if [ -e $HOME/.quiltrc ]
+then
+ . $HOME/.quiltrc
+fi
+
+if [ -n "$PATCHSCRIPTS" ]
+then
+ P=$PATCHSCRIPTS/
+else
+ unset P
+fi
+
+if [ -e .pc/series ]
+then
+ SERIES=.pc/series
+elif [ -e series ]
+then
+ SERIES=series
+else
+ SERIES=${P}patches/series
+fi
+
+DB=".pc/applied-patches"
+DB_FILE=".pc/applied-patches-file"
+
+# Quote a string for use in a basic regular expression.
+quote_bre()
+{
+ echo "$1" | @SED@ -e 's:\([][^$/.*\\]\):\\\1:g'
+}
+
+# Quote a string for use in an extended regular expression.
+quote_re()
+{
+ echo "$1" | @SED@ -e 's:\([][?{(|)}^$/.+*\\]\):\\\1:g'
+}
+
+basename()
+{
+ local path="${1//\/\//}"
+ path="${path%%/}"
+ echo "${path##*/}"
+}
+
+dirname()
+{
+ local path="${1//\/\//}"
+ path="${path%%/}"
+ local basename="${path##*/}"
+ path="${path:0:${#path}-${#basename}}"
+ [ x"$path" != x"/" ] && path="${path%/}"
+ echo "${path:-.}"
+}
+
+patch_file_name()
+{
+ local patch=$1
+
+ if [ -e $SERIES ]
+ then
+ @AWK@ '/^'"$(quote_re $patch)"'(|\.patch|\.diff?)(|\.gz|\.bz2)([ \t]|$)/ \
+ { printf "'"$P"'patches/%s\n", $1
+ exit
+ }
+ ' $SERIES
+ fi
+}
+applied_patch_file_name()
+{
+ local patch=$1
+
+ if [ -e $DB_FILE ]
+ then
+ /bin/gawk '/^'"$(quote_re $patch)"'(|\.patch|\.diff?)(|\.gz|\.bz2)([ \t]|$)/ \
+ { printf "'"$P"'patches/%s\n", $1
+ exit
+ }
+ ' $DB_FILE
+ fi
+}
+# The -pN option and possibly others that should be passed to patch.
+patch_args()
+{
+ local patch=$1
+
+ if [ -e $SERIES ]
+ then
+ @AWK@ '
+ /^'"$(quote_re $patch)"'(|\.patch|\.diff?)(|\.gz|\.bz2)([ \t]|$)/ \
+ { if (NF >= 2)
+ for (i=2; i <= NF; i++)
+ print $i
+ else
+ print "-p1" ;
+ exit
+ }
+ ' $SERIES
+ fi
+}
+
+patch_strip_level()
+{
+ local patch=$1 i
+ for i in $(patch_args $patch)
+ do
+ case $i in
+ -p)
+ echo $2
+ return ;;
+ -p*)
+ echo ${i:2}
+ return ;;
+ esac
+ done
+ echo "1"
+}
+
+change_db_strip_level()
+{
+ local level=$1 patch=$2
+
+ if [ x$level != x-p1 ]
+ then
+ level="$level"
+ else
+ level=""
+ fi
+
+ if [ -e $SERIES ]
+ then
+ local tmpfile=$(gen_tempfile)
+ @AWK@ '
+ /^'"$(quote_re $patch)"'(\.patch|\.diff?)(|\.gz|\.bz2)([ \t]|$)/ \
+ { for(i=2; i<=NF; i++)
+ if ($i ~ /^-p/) {
+ $i="'"$level"'"
+ break
+ }
+ if (i > NF)
+ $i="'"$level"'"
+ }
+ { print }
+ ' $SERIES > $tmpfile
+ if cmp $SERIES $tmpfile >/dev/null 2>/dev/null
+ then
+ rm -f $tmpfile
+ else
+ mv -f $tmpfile $SERIES
+ fi
+ else
+ return 1
+ fi
+}
+
+patch_in_series()
+{
+ local patch=$1
+
+ if ! [ -e $SERIES ]
+ then
+ return 1
+ else
+ grep -q -E '^'"$(quote_re $patch)"'(|\.patch|\.diff?)(|\.gz|\.bz2)([ \t]|$)' $SERIES
+ fi
+}
+
+# Insert new patch after topmost patch
+insert_in_series()
+{
+ local patch=$1 patch_args=$2
+ local top=$(top_patch) tmpfile
+
+ if [ -n "$patch_args" ]
+ then
+ patch_args=" $patch_args"
+ fi
+
+ tmpfile=$(gen_tempfile) || return 1
+ mkdir -p $(dirname $SERIES)
+ if [ -n "$top" ]
+ then
+ @AWK@ '
+ { print }
+ /^'"$(quote_re $top)"'(|\.patch|\.diff?)(|\.gz|\.bz2)([ \t]|$)/ \
+ { print "'"$patch$patch_args"'" }
+ ' $SERIES > $tmpfile
+ status=$?
+ if [ $status -ne 0 ]
+ then
+ rm -f $tmpfile
+ return 1
+ fi
+ else
+ echo $patch$patch_args > $tmpfile
+ if [ -e $SERIES ]
+ then
+ cat $SERIES >> $tmpfile
+ fi
+ fi
+ mv -f $tmpfile $SERIES
+}
+
+remove_from_series()
+{
+ local patch=$1
+
+ tmpfile=$(gen_tempfile) || return 1
+ @AWK@ '
+ ! /^'"$(quote_re $patch)"'(|\.patch|\.diff?)(|\.gz|\.bz2)([ \t]|$)/ \
+ { print }
+ ' $SERIES > $tmpfile
+ if [ $? -eq 0 ]
+ then
+ mv -f $tmpfile $SERIES
+ else
+ rm -f $tmpfile
+ return 1
+ fi
+}
+
+pc_file_name()
+{
+ while [ $# -gt 0 ]
+ do
+ echo ".pc/$1/.pc"
+ shift
+ done
+
+}
+
+backup_file_name()
+{
+ local patch=$1
+ while [ $# -gt 1 ]
+ do
+ echo ".pc/$patch/$2"
+ shift
+ done
+}
+
+cat_series()
+{
+ if [ -e $SERIES ]
+ then
+ @SED@ -e '/^#/d' -e 's/^[ '$'\t'']*//' -e 's/[ '$'\t''].*//' \
+ -e 's/\.gz$//' -e 's/\.bz2$//' \
+ -e 's/\.patch$//' -e 's/\.diff\?$//' $SERIES
+ else
+ return 1
+ fi
+}
+
+top_patch()
+{
+ [ -e $DB ] && tail -n 1 $DB
+}
+
+is_numeric()
+{
+ echo $1 | grep -q '^[0-9]*$'
+}
+
+is_applied_last()
+{
+ local patch=$1
+ [ "$(top_patch)" == $patch ]
+}
+
+is_applied()
+{
+ local patch=$1
+ [ -e $DB ] || return 1
+ grep -q -E "^$(quote_re $patch)\$" $DB
+}
+
+applied_patches()
+{
+ [ -e $DB ] || return 1
+ cat $DB
+}
+
+applied_before()
+{
+ local patch=$1
+
+ if [ -n "$patch" ]
+ then
+ @AWK@ '
+ $0 == "'"$patch"'" { exit }
+ { print }
+ ' $DB
+ fi
+}
+
+patches_before()
+{
+ local patch=$1
+
+ if [ -n "$patch" ]
+ then
+ cat_series \
+ | @AWK@ '
+ $0 == "'"$patch"'" { exit }
+ { print }
+ '
+ fi
+}
+
+patches_after()
+{
+ local patch=$1
+ if [ -n "$patch" ]
+ then
+ cat_series \
+ | @AWK@ '
+ seen { print }
+ $0 == "'"$patch"'" { seen=1 }
+ '
+ else
+ cat_series
+ fi
+}
+
+# List all patches that have been applied on top of patch $1
+patches_on_top_of()
+{
+ local patch=$1
+ [ -e $DB ] || return
+ @AWK@ '
+ $0 == "'"$patch"'" { seen=1 ; next }
+ seen { print }
+ ' $DB
+}
+
+# Print the name of the patch that modified the file $2 next after
+# patch $1, or print nothing if patch $1 is on top.
+next_patch_for_file()
+{
+ local patch=$1 file=$2
+ local patches_on_top=$(patches_on_top_of $patch)
+
+ if [ -n "$patches_on_top" ]
+ then
+ grep -l -E "^$(quote_re $file)\$" \
+ $(pc_file_name $patches_on_top) \
+ | head -n 1 \
+ | @SED@ -e 's:^\.pc/::' -e 's:/\.pc$::'
+ fi
+
+ #modified_files $file -- $patches_on_top \
+ #| cut -d $'\t' -f2 \
+ #| cut -d ' ' -f1
+}
+
+# Create a list of files and the patches that modify them.
+refresh_patches_per_file()
+{
+ local pc_files=$(pc_file_name $(cat_series))
+ local ex_pc_files pc_file
+
+ if [ -e .pc/patches-per-file ]
+ then
+ local needs_refresh
+ for pc_file in pc_files
+ do
+ if [ .pc/patches-per-file -ot $pc_file ]
+ then
+ needs_refresh=1
+ break
+ fi
+ done
+ if [ -z "$needs_refresh" ]
+ then
+ return 0
+ fi
+ fi
+
+ for pc_file in $pc_files
+ do
+ if [ -e $pc_file ]
+ then
+ ex_pc_files[${#ex_pc_files[@]}]=$pc_file
+ fi
+ done
+
+ if [ ${#ex_pc_files[@]} -eq 0 ]
+ then
+ rm -f .pc/patches-per-file
+ return 0
+ fi
+
+ @AWK@ '
+ ARGIND!=saved { sub(/^.pc\//, "", FILENAME)
+ sub(/\/\.pc/, "", FILENAME)
+ saved=ARGIND
+ }
+ { if (files[$0])
+ files[$0]=files[$0] " " FILENAME
+ else
+ files[$0]=FILENAME
+ }
+ END { for (file in files)
+ printf "%s\t%s\n", file, files[file]
+ }
+ ' "${ex_pc_files[@]}" > .pc/patches-per-file
+}
+
+# For a lists of patches and a list of files, compute which patches
+# modify which files. Invoked as
+# modified_files file ... [-- patch ...]
+#
+modified_files()
+{
+ if ! refresh_patches_per_file
+ then
+ return 1
+ fi
+
+ @AWK@ '
+ BEGIN { no_files=1
+ no_patches=1
+ for (i=1; i<ARGC; i++) {
+ if (ARGV[i]=="--")
+ break
+ files[ARGV[i]]=1
+ no_files=0
+ }
+ for (i++; i<ARGC; i++) {
+ patches[ARGV[i]]=1
+ no_patches=0
+ }
+ split("", ARGV) # read from standard input
+ }
+ no_files || files[$1] {
+ if (no_patches) {
+ print
+ next
+ }
+ for (i=2; i<=NF; i++)
+ if ($i in patches) {
+ printf "%s\t%s", $1, $i
+ for (i++; i<=NF; i++)
+ if ($i in patches)
+ printf " %s", $i
+ printf "\n"
+ }
+ }
+ ' "$@" < .pc/patches-per-file
+}
+
+add_to_db()
+{
+ local file_name=$(patch_file_name $1)
+ file_name=`basename $(patch_file_name $1)`
+ echo $1 >> $DB
+ echo $file_name >> $DB_FILE
+}
+
+remove_from_db()
+{
+ local patch=$1
+ local tmpfile tmpfile2
+ local patch_file=$(applied_patch_file_name $1)
+ tmpfile2=$(gen_tempfile)
+ if tmpfile=$(gen_tempfile)
+ then
+ grep -v -E "^$(quote_re $patch)\$" $DB > $tmpfile
+ grep -v -E "^$(quote_re $patch_file)\$" $DB > $tmpfile2
+ mv -f $tmpfile $DB
+ mv -f $tmpfile2 $DB_FILE
+ rm -f $tmpfile
+ rm -f $tmpfile2
+ [ -s $DB ] || rm -f $DB
+ [ -s $DB_FILE ] || rm -f $DB_FILE
+ fi
+}
+
+stripit()
+{
+ if [ -n "$1" ]
+ then
+ echo $1 |
+ @SED@ -e 's/^\(\.\/\)*//' \
+ -e 's/^'"$(quote_bre $P)"'patches\///' \
+ -e 's/\.gz$//' -e 's/\.bz2$//' \
+ -e 's/\.patch$//' -e 's/\.diff\?$//'
+ fi
+}
+
+file_in_patch()
+{
+ local file=$1 patch=$2
+ files_in_patch $patch \
+ | grep -q -E "^$(quote_re $file)\$"
+}
+
+files_in_patch()
+{
+ local pc_file=$(pc_file_name $1)
+ if [ -e "$pc_file" ]
+ then
+ cat $pc_file
+ fi
+}
+
+touched_by_patch()
+{
+ local strip=$1 patch=$2
+ cat_file $(patch_file_name $patch) \
+ | @AWK@ '
+ /^\+\+\+[ \t]/ {
+ sub(/^\+\+\+[ \t]/, "")
+ sub(/[ \t].*/, "")
+ sub(/^\/dev\/null/, "")
+ for (i=0; i<'$strip'; i++)
+ sub(/^[^\/]*\//, "")
+ print
+ }'
+}
+
+refresh_file_list()
+{
+ local patch=$1
+ local pc_file=$(pc_file_name $patch)
+ local patch_file=$(patch_file_name $patch)
+
+ if ! [ -e "$patch_file" ]
+ then
+ return 0
+ fi
+ if [ ! -e $pc_file -o \
+ $pc_file -ot $patch_file -o \
+ $pc_file -ot $SERIES ]
+ then
+ local tmpfile status
+ if ! mkdir -p $(dirname $pc_file) || \
+ ! tmpfile=$(gen_tempfile)
+ then
+ return 1
+ fi
+
+ # Do not reorder files in the file list...
+
+ if [ -e $pc_file ]
+ then
+ cat $pc_file >> $tmpfile
+ fi
+ if ! touched_by_patch $(patch_strip_level $patch) \
+ $patch >> $tmpfile
+ then
+ return 1
+ fi
+ @AWK@ ' { if (seen[$0]) next
+ seen[$0]=1
+ print
+ }' $tmpfile > $pc_file
+ rm $tmpfile
+ return 0
+ fi
+}
+
+fix_diff_header()
+{
+ local from=$1 to=$2
+ @SED@ -e 's/^--- [^ '$'\t'']*/--- '"$(quote_bre $from)"'/' \
+ -e 's/^+++ [^ '$'\t'']*/+++ '"$(quote_bre $to)"'/'
+}
+
+diff_file()
+{
+ local file=$1 old_file=$2 new_file=$3
+ local old_hdr new_hdr line
+
+ if [ ! -e "$old_file" -a ! -e "$new_file" ]
+ then
+ return 0
+ fi
+ if [ $opt_strip_level -eq 0 ]
+ then
+ old_hdr=$file.orig
+ new_hdr=$file
+ else
+ local dir=$(basename $PWD)
+ old_hdr=$dir.orig/$file
+ new_hdr=$dir/$file
+ fi
+
+ @DIFF@ -Nu $QUILT_DIFF_OPTS $old_file $new_file |
+ if read line
+ then
+ echo "Index: $new_hdr"
+ echo "==================================================================="
+ (echo "$line" ; cat) \
+ | fix_diff_header $old_hdr $new_hdr
+ fi
+}
+
+cat_file()
+{
+ local filename
+
+ for filename in "$@"
+ do
+ if [ -e "$filename" ]
+ then
+ case "$filename" in
+ *.gz|*.tgz)
+ gzip -cd "$filename" ;;
+ *.bz2)
+ bzip2 -cd "$filename" ;;
+ *)
+ cat "$filename" ;;
+ esac
+ fi
+ done
+}
+
+cat_to_file()
+{
+ local filename="$1"
+
+ if [ -z "$filename" ]
+ then
+ cat
+ else
+ case "$filename" in
+ *.gz|*.tgz)
+ gzip -c > "$filename" ;;
+ *.bz2)
+ bzip2 -c > "$filename" ;;
+ *)
+ cat > "$filename" ;;
+ esac
+ fi
+}
+
+patch_description()
+{
+ local patch_file=$1
+
+ if [ -e "$patch_file" -o -z "$patch_file" ]
+ then
+ @AWK@ '
+ $1 == "---" { exit }
+ /^Index:[ \t]|^diff[ \t]|^==*$/ \
+ { eat = eat $0
+ next }
+ eat { print eat
+ eat="" }
+ { print }
+ ' $patch_file
+ fi
+}
+
+in_array()
+{
+ local a=$1
+ while [ $# -gt 1 ]
+ do
+ shift
+ [ "$a" = "$1" ] && return 0
+ done
+ return 1
+}
+
+gen_tempfile()
+{
+ # This is a substitute for the mktemp executable.
+ internal_mktemp()
+ {
+ local try n
+ if [ x"$1" = x"-d" ]
+ then
+ for ((n=0 ; $n<100 ; n++))
+ do
+ try=${2%XXXXXX}$RANDOM
+ mkdir -m 700 $try 2>/dev/null \
+ && break
+ done
+ else
+ local user_mask=$(umask)
+ umask 077
+ set -o noclobber
+ for ((n=0 ; $n<100 ; n++))
+ do
+ try=${1%XXXXXX}$RANDOM
+ echo -n "" 2> /dev/null > $try \
+ && break
+ done
+ set +o noclobber
+ umask $user_mask
+ fi
+ if [ $n -lt 100 ]
+ then
+ echo $try
+ else
+ return 1
+ fi
+ }
+
+ local dir
+ if [ x"$1" = x"-d" ]
+ then
+ dir=-d
+ shift
+ fi
+ @MKTEMP@ $dir ${1:-${TMPDIR:-/tmp}/quilt}.XXXXXX
+}
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r @SCRIPTS@/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . @SCRIPTS@/patchfns
+fi
+
+usage()
+{
+ echo $"Usage: $0 [-fRq] patchname"
+ exit 1
+}
+
+verify_removal()
+{
+ local patch=$1
+ local bup file status=0
+ local dir=$(basename $PWD) suffix=${patch//\//_}
+
+ # Check if all changes of the patch are undone
+ for file in $(files_in_patch $patch)
+ do
+ bup=$(backup_file_name $patch $file)
+ if ! [ -s $file -o -s $bup ] || \
+ cmp $file $bup > /dev/null 2> /dev/null
+ then
+ continue
+ fi
+
+ if [ $status -eq 0 ]
+ then
+ echo $"Patch does not remove changes:"
+ fi
+
+ @DIFF@ -Nu $QUILT_DIFF_OPTS $bup $file \
+ | @SED@ -e 's:^--- [^ '$'\t'']*:--- '"$dir/$file.orig"':' \
+ -e 's:^+++ [^ '$'\t'']*:+++ '"$dir/$file"':'
+
+ status=1
+ done
+ return $status
+}
+
+files_may_have_changed()
+{
+ local patch=$1 file
+ local patch_file=$(applied_patch_file_name $patch)
+ local pc_file=$(pc_file_name $patch)
+
+ if ! [ -e $pc_file ]
+ then
+ return 1
+ fi
+
+ local apply_ts=$(date -r $pc_file '+%s') ts
+
+ if [ -e "$patch_file" -a $pc_file -ot "$patch_file" ]
+ then
+ return 0
+ fi
+
+ for file in $(files_in_patch $patch)
+ do
+ if ! [ -e $file ]
+ then
+ return 0 # file is missing
+ fi
+
+ ts=$(date -r $file '+%s')
+ if [ $? -ne 0 -o $ts -gt $apply_ts ]
+ then
+ return 0 # file has changed
+ fi
+ done
+ return 1
+}
+
+rollback_patch()
+{
+ local patch=$1 pc_file=$(pc_file_name $patch)
+ @LIB@/backup-files $silent_unless_verbose \
+ -f $pc_file -z ~rpatch -r
+ rm -f $(files_in_patch $patch | @SED@ -e 's/$/\.rej/')
+}
+
+interrupt()
+{
+ local patch=$1
+ rollback_patch $patch
+ echo $"Interrupted by user; patch $patch was not removed."
+ exit 1
+}
+
+reverse_patch()
+{
+ local patch=$1
+ local patch_file=$(patch_file_name $patch)
+
+ if ! [ -s $patch_file ]
+ then
+ echo $"Patch file $patch_file appears to be empty"
+ return 0
+ fi
+
+ if [ "x${patch_file:(-3)}" = "x.gz" ]
+ then
+ gzip -cd $patch_file \
+ | @PATCH@ $(patch_args $patch) --no-backup-if-mismatch \
+ -R -E $silent
+ elif [ "x${patch_file:(-4)}" = "x.bz2" ]
+ then
+ bzip2 -cd $patch_file \
+ | @PATCH@ $(patch_args $patch) --no-backup-if-mismatch \
+ -R -E $silent
+ else
+ @PATCH@ $(patch_args $patch) --no-backup-if-mismatch \
+ -R -E $silent -i $patch_file
+ fi
+}
+
+rpatch()
+{
+ local patch=$1 pc_file=$(pc_file_name $patch)
+
+ local patch_file=$(patch_file_name $patch)
+ if [ $opt_force != 1 ] && [ -z "$patch_file" ]
+ then
+ echo "can not find the $patch in your series file, the series file may changed"
+ echo "please use -f option"
+ return 0
+ fi
+ if ! [ -e $pc_file ]
+ then
+ echo $"Patch $patch appears to be empty, removed"
+ remove_from_db $patch
+ return 0
+ fi
+
+ echo $"Removing $patch"
+ trap "" SIGINT
+ if [ -n "$opt_force" ] || \
+ ( [ -z "$opt_remove" ] && ! files_may_have_changed $patch )
+ then
+ # Optimize: Force remove if the patch has not been
+ # modified since it was applied. (Forced remove is
+ # faster!)
+
+ @LIB@/backup-files $silent -f $pc_file -B .pc/$patch/ -r
+ status=$?
+ remove_from_db $patch
+ rm -f $pc_file~refresh
+ if [ $status != 0 ]
+ then
+ exit $status
+ fi
+ else
+ if ! @LIB@/backup-files $silent_unless_verbose \
+ -f $pc_file -z ~rpatch
+ then
+ echo $"Failed to create temporary files" >&2
+ return 1
+ fi
+
+ trap "interrupt $patch" SIGINT
+
+ reverse_patch $patch
+ status=$?
+
+ trap "" SIGINT
+
+ if [ $status -eq 0 ] && verify_removal $patch
+ then
+ @LIB@/backup-files $silent_unless_verbose \
+ -f $pc_file -z ~rpatch -x
+ @LIB@/backup-files $silent_unless_verbose \
+ -f $pc_file -B .pc/$patch/ -x
+
+ remove_from_db $patch
+ else
+ rollback_patch $patch
+ echo $"Patch $patch does not remove (enforce with -f)"
+ return 1
+ fi
+ fi
+ trap - SIGINT
+}
+
+options=`getopt -o fRqvh -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+opt_force=0
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -f)
+ opt_force=1
+ shift ;;
+ -R)
+ opt_remove=1 # remove properly with patch -R; no tricks
+ unset opt_force
+ shift ;;
+ -q)
+ opt_quiet=1
+ shift ;;
+ -v)
+ opt_verbose=1
+ shift ;;
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -ne 1 ]
+then
+ usage
+fi
+
+patch=$(stripit $1)
+[ -n "$opt_quiet" ] && silent=-s
+[ -z "$opt_verbose" ] && silent_unless_verbose=-s
+
+top=$(top_patch)
+if [ -n "$top" -a -e $(pc_file_name $top)~refresh -a -z "$opt_force" ]
+then
+ echo $"The topmost patch $top needs to be refreshed first."
+ exit 1
+fi
+
+rpatch "$patch" || exit 1
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
--- /dev/null
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# defaults
+debug=0
+specfile=""
+outfile=""
+
+function usage() {
+cat <<EOF
+Usage: quilt spec2series [ options ] specfile
+
+-h print this text
+-d debug mode (prints lots additional info
+ as comments into the output file)
+-o <file>
+ specify output file, stdout if unspecified
+
+EOF
+}
+
+# parse args
+while test "$1" != ""; do
+ case "$1" in
+ -h | --help)
+ usage; exit 0
+ ;;
+ -d | --debug)
+ debug=1; shift
+ ;;
+ -o | --outfile)
+ outfile="$2"; shift; shift
+ ;;
+ *)
+ specfile="$1"
+ break;
+ ;;
+ esac
+done
+
+if test ! -f "$specfile"; then
+ usage
+ exit 1
+fi
+
+# get absolute patch for specfile location
+specdir=`dirname $specfile`
+specfile=`basename $specfile`
+case "$specdir" in
+ .) specdir="`pwd`"
+ ;;
+ /*) # nothing
+ ;;
+ *) specdir="`pwd`/$specdir"
+ ;;
+esac
+
+# create tmp work dir
+WORK="${TMPDIR-/tmp}/rpmlog-$$"
+mkdir -p "$WORK" || exit 1
+trap 'rm -rf "$WORK"' EXIT
+mkdir -p "$WORK/build"
+mkdir -p "$WORK/bin"
+
+# create md5 sums, also for uncompressed files
+echo -n "### md5: " >&2
+(cd $specdir; for file in /dev/null *; do
+ case "$file" in
+ ready | bigpack | MD5SUMS | MD5SUMS.meta | *.spec | *.changes)
+ continue
+ ;;
+ esac
+ type="`file -b $file | cut -d" " -f1`"
+ case "$type" in
+ compress*)
+ echo -n "z" >&2
+ set -- `zcat $file | md5sum`
+ echo "$1 zcat ${file}"
+ ;;
+ gzip)
+ echo -n "g" >&2
+ set -- `zcat $file | md5sum`
+ echo "$1 zcat ${file}"
+ ;;
+ bzip2)
+ echo -n "b" >&2
+ set -- `bzcat $file | md5sum`
+ echo "$1 bzcat ${file}"
+ ;;
+ esac
+ echo -n "." >&2
+ set -- `md5sum < $file`
+ echo "$1 cat ${file}"
+done) > $WORK/md5sum
+echo $" done" >&2
+
+# prepare rpm dir fixups and hooks
+RPM="rpm --rcfile=/usr/lib/rpm/rpmrc:$WORK/rpmrc"
+PATH="$WORK/bin:$PATH"
+grep ^macrofiles /usr/lib/rpm/rpmrc \
+ | @SED@ -e "/macrofiles/s|$|:$WORK/rpmmacros|" \
+ > $WORK/rpmrc
+cat <<-EOF > "$WORK/rpmmacros"
+ %_sourcedir $specdir
+ %_specdir $specdir
+ %_builddir $WORK/build
+EOF
+
+# wrapper script for patch and tar
+cat <<-'EOF' > "$WORK/bin/patch"
+ #!/bin/sh
+
+ # save stuff for log
+ unpackcmd=`basename $0`
+ unpackdir=`pwd`
+ unpackargs="$*"
+ uncompress="false"
+ unpackfile="[oops]"
+
+ # sort of progress bar
+ case $unpackcmd in
+ tar) echo -n "t" >&2;;
+ patch) echo -n "p" >&2;;
+ *) echo -n "?" >&2;;
+ esac
+
+ # find real binary
+ realcmd=""
+ test -x "/bin/$unpackcmd" && realcmd="/bin/$unpackcmd"
+ test -x "/usr/bin/$unpackcmd" && realcmd="/usr/bin/$unpackcmd"
+ test "$realcmd" = "" && exit 1
+
+ # put data into tmpfile, exec real cmd, return on failure
+ WORK=`dirname $RPM_BUILD_DIR`
+ cat > "$WORK/data"
+ if test -x /bin/$unpackcmd; then
+ cmddir="/bin"
+ fi
+ $realcmd $* < "$WORK/data"
+ retval="$?"
+ test "$retval" != "0" && exit $retval
+
+ # find original data file by md5sum
+ set -- `md5sum < "$WORK/data"`
+ unpackfile="[$1]"
+ set -- `cat "$WORK/md5sum"`
+ while test "$1" != ""; do
+ if test "[$1]" = "$unpackfile"; then
+ uncompress="$2"
+ unpackfile="$3"
+ break
+ fi
+ shift
+ done
+
+ # print results
+ unpackdir=`echo $unpackdir | @SED@ -e "s|$RPM_BUILD_DIR|BUILD|"`
+ echo -n "# log: [$unpackdir] $uncompress $unpackfile" >>$WORK/cmdlog
+ echo " | $unpackcmd $unpackargs" >>$WORK/cmdlog
+ if test "$unpackcmd" = "patch" -a \
+ -f "$RPM_SOURCE_DIR/$unpackfile"; then
+ patchdir="${unpackdir#BUILD/}"
+ if test ! -f "$WORK/patchdir"; then
+ echo -n $patchdir > $WORK/patchdir
+ fi
+ if test "`cat $WORK/patchdir`" = "$patchdir"; then
+ level=`echo $unpackargs | tr " " "\n" | grep ^-p`
+ echo "$unpackfile $level" >> $WORK/patchlog
+ fi
+ fi
+ if test "$unpackcmd" = "tar" -a \
+ -f "$RPM_SOURCE_DIR/$unpackfile"; then
+ echo -n "# Source: $unpackfile" >>$WORK/tarlog
+ if test "$unpackdir" != "BUILD"; then
+ echo -n " -C ${unpackdir#BUILD/}" >>$WORK/tarlog
+ fi
+ echo "" >>$WORK/tarlog
+ fi
+EOF
+chmod 755 "$WORK/bin/patch"
+ln -s patch "$WORK/bin/tar"
+
+# let rpm do all the dirty specfile stuff ...
+echo -n "### rpm: " >&2
+touch $WORK/patchlog
+$RPM --nodeps --quiet -bp "$specdir/$specfile" </dev/null
+echo $" done" >&2
+
+# print results saved by the wrapper script
+(
+ # header
+ echo "# Patch series file for quilt, created by $0"
+ echo "#"
+ echo "# Sourcedir: $specdir"
+ echo "# Specfile: $specfile"
+ if test -f $WORK/patchdir; then
+ echo "# Patchdir: `cat $WORK/patchdir`"
+ fi
+ echo "#"
+
+ # additional info for trouble shooting
+ if test "$debug" = "1"; then
+ cat $WORK/md5sum | @SED@ -e 's/^/# md5: /'
+ echo "#"
+
+ test -f $WORK/cmdlog && cat $WORK/cmdlog && echo "#"
+ fi
+
+ # list tarballs + patches
+ test -f $WORK/tarlog && cat $WORK/tarlog && echo "#"
+ test -f $WORK/patchlog && cat $WORK/patchlog
+)|(
+ if test "$outfile" != ""; then
+ cat > "$outfile"
+ else
+ cat
+ fi
+)
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh