aboutsummaryrefslogtreecommitdiffstats
path: root/doc/gawkworkflow.texi
diff options
context:
space:
mode:
Diffstat (limited to 'doc/gawkworkflow.texi')
-rwxr-xr-xdoc/gawkworkflow.texi2158
1 files changed, 2158 insertions, 0 deletions
diff --git a/doc/gawkworkflow.texi b/doc/gawkworkflow.texi
new file mode 100755
index 00000000..4d9ddd05
--- /dev/null
+++ b/doc/gawkworkflow.texi
@@ -0,0 +1,2158 @@
+\input texinfo @c -*-texinfo-*-
+@c vim: filetype=texinfo expandtab tabstop=4 shiftwidth=4
+@c %**start of header (This is for running Texinfo on a region.)
+@setfilename gawkworkflow.info
+@settitle GNU Awk Development Workflow
+@c %**end of header (This is for running Texinfo on a region.)
+
+@dircategory Text creation and manipulation
+@direntry
+* Gawk Work Flow: (gawkworkflow). Participating in @command{gawk} development.
+@end direntry
+@dircategory Individual utilities
+@direntry
+* Gawk Work Flow: (gawkworkflow)Overview. Participating in @command{gawk} development.
+@end direntry
+
+@c With early 2014 texinfo.tex, restore PDF links and colors
+@tex
+\gdef\linkcolor{0.5 0.09 0.12} % Dark Red
+\gdef\urlcolor{0.5 0.09 0.12} % Also
+\global\urefurlonlylinktrue
+@end tex
+
+@set xref-automatic-section-title
+
+@c The following information should be updated here only!
+@c This sets the edition of the document, the version of gawk it
+@c applies to and all the info about who's publishing this edition
+
+@c These apply across the board.
+@set UPDATE-MONTH April, 2017
+
+@set TITLE Participating in @command{gawk} Development
+@set EDITION 0.7
+
+@iftex
+@set DOCUMENT booklet
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end iftex
+@ifinfo
+@set DOCUMENT Info file
+@set CHAPTER major node
+@set APPENDIX major node
+@set SECTION minor node
+@set SUBSECTION node
+@end ifinfo
+@ifhtml
+@set DOCUMENT Web page
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end ifhtml
+@ifdocbook
+@set DOCUMENT booklet
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end ifdocbook
+@ifxml
+@set DOCUMENT booklet
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end ifxml
+@ifplaintext
+@set DOCUMENT booklet
+@set CHAPTER chapter
+@set APPENDIX appendix
+@set SECTION section
+@set SUBSECTION subsection
+@end ifplaintext
+
+
+@ifnottex
+@ifnotdocbook
+@macro ii{text}
+@i{\text\}
+@end macro
+@end ifnotdocbook
+@end ifnottex
+
+@ifdocbook
+@macro ii{text}
+@inlineraw{docbook,<lineannotation>\text\</lineannotation>}
+@end macro
+@end ifdocbook
+
+@c For HTML, spell out email addresses, to avoid problems with
+@c address harvesters for spammers.
+@ifhtml
+@macro EMAIL{real,spelled}
+``\spelled\''
+@end macro
+@end ifhtml
+@ifnothtml
+@macro EMAIL{real,spelled}
+@email{\real\}
+@end macro
+@end ifnothtml
+
+
+@c merge the function and variable indexes into the concept index
+@ifinfo
+@synindex fn cp
+@synindex vr cp
+@end ifinfo
+@iftex
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end iftex
+@ifxml
+@syncodeindex fn cp
+@syncodeindex vr cp
+@end ifxml
+@ifdocbook
+@synindex fn cp
+@synindex vr cp
+@end ifdocbook
+
+@c If "finalout" is commented out, the printed output will show
+@c black boxes that mark lines that are too long. Thus, it is
+@c unwise to comment it out when running a master in case there are
+@c overfulls which are deemed okay.
+
+@iftex
+@finalout
+@end iftex
+
+@copying
+@docbook
+<para>Published by:</para>
+
+<literallayout class="normal">Free Software Foundation
+51 Franklin Street, Fifth Floor
+Boston, MA 02110-1301 USA
+Phone: +1-617-542-5942
+Fax: +1-617-542-2652
+Email: <email>gnu@@gnu.org</email>
+URL: <ulink url="http://www.gnu.org">http://www.gnu.org/</ulink></literallayout>
+
+<literallayout class="normal">Copyright &copy; 2017
+Free Software Foundation, Inc.
+All Rights Reserved.</literallayout>
+@end docbook
+
+@ifnotdocbook
+Copyright @copyright{} 2017
+Free Software Foundation, Inc.
+@end ifnotdocbook
+@sp 2
+
+This is Edition @value{EDITION} of @cite{@value{TITLE}}.
+
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with the
+Invariant Sections being ``GNU General Public License'', with the
+Front-Cover Texts being ``A GNU Manual'', and with the Back-Cover Texts
+as in (a) below.
+A copy of the license is included in the section entitled
+``GNU Free Documentation License''.
+
+@enumerate a
+@item
+The FSF's Back-Cover Text is: ``You have the freedom to
+copy and modify this GNU manual.''
+@end enumerate
+@end copying
+
+@c Comment out the "smallbook" for technical review. Saves
+@c considerable paper. Remember to turn it back on *before*
+@c starting the page-breaking work.
+
+@c 4/2002: Karl Berry recommends commenting out this and the
+@c `@setchapternewpage odd', and letting users use `texi2dvi -t'
+@c if they want to waste paper.
+@c @smallbook
+
+
+@c Uncomment this for the release. Leaving it off saves paper
+@c during editing and review.
+@c @setchapternewpage odd
+
+@c @shorttitlepage @value{TITLE}
+@titlepage
+@title @value{TITLE}
+@subtitle Edition @value{EDITION}
+@subtitle @value{UPDATE-MONTH}
+@author Arnold D. Robbins
+
+@ifnotdocbook
+@c Include the Distribution inside the titlepage environment so
+@c that headings are turned off. Headings on and off do not work.
+
+@page
+@vskip 0pt plus 1filll
+Published by:
+@sp 1
+
+Free Software Foundation @*
+51 Franklin Street, Fifth Floor @*
+Boston, MA 02110-1301 USA @*
+Phone: +1-617-542-5942 @*
+Fax: +1-617-542-2652 @*
+Email: @email{gnu@@gnu.org} @*
+URL: @uref{http://www.gnu.org/} @*
+
+@c ISBN x-xxxxxx-xx-x @*
+@sp 2
+@insertcopying
+@end ifnotdocbook
+@end titlepage
+
+@iftex
+@headings off
+@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @|
+@oddheading @| @| @strong{@thischapter}@ @ @ @thispage
+@end iftex
+
+@ifnottex
+@ifnotxml
+@ifnotdocbook
+@node Top
+@top General Introduction
+@c Preface node should come right after the Top
+@c node, in `unnumbered' sections, then the first chapter.
+
+This file describes how to participate in software development for
+@uref{http://www.gnu.org/software/gawk, GNU Awk (@command{gawk})}.
+
+@insertcopying
+
+@end ifnotdocbook
+@end ifnotxml
+@end ifnottex
+
+@menu
+* Preface:: Some introductory remarks.
+* Contributing:: How to contribute to @command{gawk}
+ development.
+* Using Git:: Getting started with Git.
+* Configuring git:: Configuring Git.
+* Development without commit access:: How to wwork without commit access.
+* Development with commit access:: How to work with commit access.
+* General practices:: How things should usually be done.
+* Repo Maintenance:: Tips for keeping your repo clean.
+* Development Stuff:: Things you need to know to be a
+ @command{gawk} developer.
+* Cheat Sheet:: Git command summary.
+* Resources:: Some further resources.
+* TODO:: Stuff still to do.
+* Index:: The index.
+
+@detailmenu
+* This Manual:: How to use this manual.
+* Conventions:: Typographical Conventions.
+* Acknowledgments:: Acknowledgments.
+* Reviewers:: A note to reviewers.
+* Push Pull:: The push/pull software development model.
+* Repo Copies:: What it means to have a copy of a repo.
+* Local Branches:: How to best use local branches.
+* Branches are state:: Branches represent development state.
+* Repo State:: The different branch types in the repo.
+* Local State:: Managing local branches.
+* Remotes:: What a ``remote'' is.
+* Cloning:: Cloning the repo the first time.
+* Switching Branches:: Moving from one branch to another.
+* Starting A New Branch:: Starting a new branch for development.
+* Undoing a change:: Throwing away changes.
+* Updating:: Keeping in sync with the upstream repo.
+* Rebasing:: Rebasing A Local Branch.
+* Merge Conflicts:: Dealing With Merge Conflicts.
+* Submitting Changes:: How to submit your changes.
+* Removing Branches:: Getting rid of unneeded branches.
+* Points to remember:: Things you need to keep in mind.
+* Initial setup:: Getting started with commit access.
+* ssh clone:: Cloning using an @samp{ssh://} URL.
+* Developing patches:: Developing patches.
+* Developing new features:: Developing new features.
+* Developing fixes:: Developing fixes.
+* Coding style:: Where to read up on the coding style.
+* Doing paperwork:: Legal stuff in order to contribute.
+* Tools:: Tools to have on your system for
+ development.
+* GNU Tools:: The GNU Autotools.
+* Compilers:: A discussion of compilers that can be
+ used.
+* Debugging:: Compiling for debugging.
+@end detailmenu
+@end menu
+
+@c @summarycontents
+@contents
+
+@node Preface
+@unnumbered Preface
+@c I saw a comment somewhere that the preface should describe the book itself,
+@c and the introduction should describe what the book covers.
+
+This @value{DOCUMENT} describes how to participate in development
+of GNU Awk (@command{gawk}). GNU Awk is a Free Software project
+belonging to the Free Software Foundation's GNU project.
+
+@cindex Git Project
+The @value{DOCUMENT} focuses on participation in the project (that is,
+how to work most effectively if you wish to contribute to it) and
+also describes how to make use of the @uref{http://git-scm.org, Git}
+distributed source code management system for @command{gawk} development.
+
+You should be comfortable working with traditional UNIX-style
+tools and with the C language and standard library facilities.
+
+@menu
+* This Manual:: How to use this manual.
+* Conventions:: Typographical Conventions.
+* Acknowledgments:: Acknowledgments.
+* Reviewers:: A note to reviewers.
+@end menu
+
+
+@node This Manual
+@unnumberedsec Using This Book
+
+This @value{DOCUMENT} has the following chapters and appendices:
+
+@itemize @bullet
+
+@item
+@ref{Contributing} describes how to start contributing to
+the @command{gawk} project.
+
+@item
+@ref{Using Git} introduces the Git distributed source code
+management system.
+
+@item
+@ref{Configuring git} describes some initial set-up you need to do
+before using Git seriously.
+
+@item
+@ref{Development without commit access} gets into the meat of the
+development workflow, describing how to work if you don't have
+commit access to the Savannah repository.
+
+@item
+@ref{Development with commit access} continues the discussion,
+covering what's different when you can commit directly to the
+Savannah repository.
+
+@item
+@ref{General practices} describes general development
+practices used by the @command{gawk} development team.
+
+@item
+@ref{Repo Maintenance} presents several different things
+you need to know about to keep your repo in good shape.
+
+@item
+@ref{Development Stuff} describes some important points you
+should be familiar with in order to participate in @command{gawk}
+development and presents some tools that may make your work easier.
+
+@item
+@ref{Cheat Sheet} provides a short ``cheat sheet'' summarizing
+all the Git commands referenced in this @value{DOCUMENT}.
+
+@item
+@ref{Resources} provides a few pointers to Internet
+resources for learning more about Git.
+
+@end itemize
+
+@node Conventions
+@unnumberedsec Typographical Conventions
+
+@cindex Texinfo
+This @value{DOCUMENT} is written in @uref{http://www.gnu.org/software/texinfo/, Texinfo},
+the GNU documentation formatting language.
+A single Texinfo source file is used to produce both the printed and online
+versions of the documentation.
+@ifnotinfo
+Because of this, the typographical conventions
+are slightly different than in other books you may have read.
+@end ifnotinfo
+@ifinfo
+This @value{SECTION} briefly documents the typographical conventions used in Texinfo.
+@end ifinfo
+
+Examples you would type at the command line are preceded by the common
+shell primary and secondary prompts, @samp{$} and @samp{>}.
+Input that you type is shown @kbd{like this}.
+Output from the command is preceded by the glyph ``@print{}''.
+This typically represents the command's standard output.
+Error messages and other output on the command's standard error are preceded
+by the glyph ``@error{}''. For example:
+
+@example
+$ @kbd{echo hi on stdout}
+@print{} hi on stdout
+$ @kbd{echo hello on stderr 1>&2}
+@error{} hello on stderr
+@end example
+
+@ifnotinfo
+In the text, almost anything related to programming, such as command
+names, variable and function names, and string, numeric and regexp
+constants appear in @code{this font}. Code fragments appear in the same
+font and quoted, @samp{like this}. Things that are replaced by the
+user or programmer appear in @var{this font}. Options look like this:
+@option{-f}. File names are indicated like this: @file{/path/to/ourfile}.
+Some things are emphasized @emph{like this}, and if a point needs to be
+made strongly, it is done @strong{like this}. The first occurrence of
+a new term is usually its @dfn{definition} and appears in the same font
+as the previous occurrence of ``definition'' in this sentence.
+@end ifnotinfo
+
+Characters that you type at the keyboard look @kbd{like this}. In particular,
+there are special characters called ``control characters.'' These are
+characters that you type by holding down both the @kbd{CONTROL} key and
+another key, at the same time. For example, a @kbd{Ctrl-d} is typed
+by first pressing and holding the @kbd{CONTROL} key, next
+pressing the @kbd{d} key, and finally releasing both keys.
+
+@quotation NOTE
+Notes of interest look like this.
+@end quotation
+
+@quotation CAUTION
+Cautionary or warning notes look like this.
+@end quotation
+
+@node Acknowledgments
+@unnumberedsec Acknowledgments
+
+@cindex Kahrs, J@"urgen
+Thanks to J@"urgen Kahrs for his initial efforts to write a document like this.
+Although his prose has not survived, his material was helpful in preparing
+this @value{DOCUMENT}.
+
+@cindex Bernat, Yehezkel
+Thanks to Yehezkel Bernat for reviewing this document and
+in general for his good intentions.
+
+@strong{FIXME:} YOUR NAME HERE...
+
+@node Reviewers
+@unnumberedsec Notes to Reviewers
+
+Please let me know if anything is missing, or unclear.
+Real errors with respect Git commands and usage are
+very important as well.
+
+Spelling errors and typo fixes welcome, but not as important.
+
+@node Contributing
+@chapter How to Start Contributing
+
+@command{gawk} development is distributed. It's done using electronic
+mail (email) and via branches in the Git repo@footnote{Short for
+``repository''.} on @uref{http://savannah.gnu.org, Savannah}, the GNU
+project's source code management site.
+
+In this @value{CHAPTER} we use some Git terminology. If you're not at
+all familiar with Git, then skim this @value{CHAPTER} and come back
+after reading the rest of the @value{DOCUMENT}.
+
+@command{gawk} is similar to many other Free Software projects. To begin
+contributing, simply start! Take a look at the @file{TODO} file in the
+distribution, see if there is something of interest to you, and ask on
+the @email{bug-gawk@@gnu.org} mailing list if anyone else is working
+on it. If not, then go for it! (@xref{Development Stuff} for a discussion of some
+of the technical things you'll need to do. Here we describe the process
+in general.)
+
+Your contribution can be almost anything that is relevant for
+@command{gawk}, such as code fixes, documentation fixes, and/or new
+features.
+
+@quotation NOTE
+If possible, new features should be done using @command{gawk}'s extension
+mechanism. If you want to add a user-visible language change to the
+@command{gawk} core, you're going to have to convince the maintainer
+and other developers that it's really worthwile to do so.
+
+Changes that improve performance or portability, or that fix bugs,
+or that enable more things in extensions,
+will require less convincing, of course.
+@end quotation
+
+As you complete a task, submit patches for review to the
+@email{bug-gawk@@gnu.org} mailing list, where you'll be given feedback
+about your work. Once your changes are acceptable, the maintainer will
+commit them to the Git repository.
+
+Over time, as the maintainer and development team gain confidence in your
+ability to contribute, you may be asked to join the private @command{gawk}
+developers' mailing list, and/or be granted commit access to the Git
+repository on Savannah. This has happened to more than one person who
+just ``came out of the woodwork.''
+
+Until that happens, or if you don't want to join the list, you should
+continue to work with private branches and submission of patches to the
+mailing list.
+
+Once you have commit access, if you want to make a major change or add a
+major feature, where the patch(es) would be very large, it has become the
+practice to create a separate branch, based off of @code{master}, to host
+the feature. This way the maintainer can review it, and you can continue
+to improve it, until it's ready for integration into @code{master}.
+
+@cindex GitHub
+@quotation NOTE
+Because of the GNU project's requirements for signed paperwork for
+contributions, the @command{gawk} project will @strong{not} work
+with pull requests from @uref{http://github.com, GitHub} or any other
+Git-based software hosting service. You must submit patches to the
+mailing list, and be willing to sign paperwork for large patches.
+@end quotation
+
+The @email{bug-gawk@@gnu.org} mailing list is not private. Anyone may
+send mail to it, and anyone may subscribe to it. To subscribe,
+go to the list's @uref{https://lists.gnu.org/mailman/listinfo/bug-gawk,
+web page} and follow the instructions there. If you plan to be involved
+long-term with @command{gawk} development, then you probably should
+subscribe to the list.
+
+@node Using Git
+@chapter Using Git
+
+This chapter provides an introduction to using Git. Our point is
+@emph{not} to rave about how wonderful Git is, nor to go into painful
+detail about how it works. Rather we want to give you enough background
+to understand how to use Git effectively for bug fix and feature
+development and to interact (``play nicely'') with the development team.
+
+@menu
+* Push Pull:: The push/pull software development model.
+* Repo Copies:: What it means to have a copy of a repo.
+* Local Branches:: How to best use local branches.
+* Branches are state:: Branches represent development state.
+@end menu
+
+@node Push Pull
+@section The ``Push/Pull'' Model of Software Development
+
+Git is a powerful, distributed source code management system. However,
+the way it's used for @command{gawk} development purposely does not take
+advantage of all its features.
+
+Instead, the model is rather simple, and in many ways much like more
+traditional distributed systems such as the @uref{http://www.nongnu.org/cvs,
+Concurrent Versions System} (CVS) or
+@uref{http://subversion.apache.org, Subversion} (SVN).
+
+The central idea can be termed ``push/pull.'' You @emph{pull} updates down from
+the central repository to your local copy, and if you have commit rights,
+you @emph{push} your changes or updates up to the central repository.
+
+Where Git does stand out is in its management of multiple branches of
+development. Git makes it very easy to set up a separate branch for
+use in fixing a bug or developing a feature. You can then easily keep
+that branch up to date with respect to the main development branch(es),
+and eventually merge the changes from your branch into the main branch.
+
+Almost always Git does these merges for you without problem. When there
+is a problem (a @dfn{merge conflict}), usually it is very easy for you
+to @dfn{resolve} them and then complete the merge. We talk about this
+in more detail later (@pxref{Merge Conflicts}).
+
+@node Repo Copies
+@section How Git Stores Branches and Their Copies
+
+So how does Git work?@footnote{The following description is greatly
+simplified.}
+
+A repository consists of a collection of @dfn{branches}. Each branch
+represents the history of a collection of files and directories (a file
+@dfn{tree}). Each combined set of changes to this collection (files and
+directories added or deleted, and/or file contents changed) is termed
+a @dfn{commit}.
+
+When you first create a local copy of a remote repository (``clone
+the repo''), Git copies all of the original repository's branches to
+your local system. The original remote repository is referred to as
+being @dfn{upstream}, and your local repo is @dfn{downstream} from it.
+Git distinguishes branches from the upstream repo by prefixing their
+names with @samp{origin/}. Let's draw some pictures. @ref{savannah-repo}
+represents the state of the repo on Savannah:
+
+@page
+@float Figure,savannah-repo
+@caption{The Savannah @command{gawk} Repository}
+@smallexample
++======================+
+| Branches |
++======================+
+| master |
++----------------------+
+| gawk-4.1-stable |
++----------------------+
+| gawk-4.0-stable |
++----------------------+
+| feature/fix-comments |
++----------------------+
+| ... |
++----------------------+
+@end smallexample
+@end float
+
+@cindex @code{git branch}
+After you clone the repo, on your local system you will have a single
+branch named @code{master} that's visible when you use @samp{git branch}
+to see your branches.
+
+@cindex @code{git clone}
+@example
+$ @kbd{git clone http://git.savannah.gnu.org/r/gawk.git} @ii{Clone the repo}
+$ @kbd{cd gawk} @ii{Change to local copy}
+$ @kbd{git branch} @ii{See branch information}
+@print{} * master
+@end example
+
+@noindent
+The current branch is always indicated with a leading asterisk (@samp{*}).
+
+Pictorially, the local repo looks like @ref{your-repo} (you can ignore
+the @samp{T} column for the moment):
+
+@float Figure,your-repo
+@caption{Your Local @command{gawk} Repository}
+@smallexample
++===+======================++=============================+
+| T | Local Branches || Remote Branches |
++===+======================++=============================+
+| X | master || origin/master |
++---+----------------------++-----------------------------+
+| | || origin/gawk-4.1-stable |
++---+----------------------++-----------------------------+
+| | || origin/gawk-4.0-stable |
++---+----------------------++-----------------------------+
+| | || origin/feature/fix-comments |
++---+----------------------++-----------------------------+
+| | || ... |
++---+----------------------++-----------------------------+
+@end smallexample
+@end float
+
+@noindent
+@cindex @code{origin/} branches
+@cindex branches, @code{origin/}
+Note that what is simply @code{gawk-4.1-stable} in the upstream repo
+is now referred to as @code{origin/gawk-4.1-stable}. The @samp{origin/}
+branches are a snapshot of the state of the upstream repo. This is
+how Git allows you to see what changes you've made with respect to the
+upstream repo, without having to actually communicate with the upstream
+repo over the Internet. (When files are identical, Git is smart enough
+to not have two separate physical copies on your local disk.)
+
+If you're working on a simple bug fix or change, you can do so directly
+in your local @code{master} branch. You can then commit your changes,
+and if you have access rights, push them upstream to the Savannah repo.
+(However, there is a process to follow. Please read the rest of
+this @value{DOCUMENT}.)
+
+@node Local Branches
+@section Local Branches
+
+@cindex local branches
+@cindex branches, local
+Let's talk about local branches in more detail. (The terminology used
+here is my own, not official Git jargon.) There are two kinds of local
+branches:
+
+@table @dfn
+@item Tracking Branches
+@cindex tracking branches
+@cindex branches, tracking
+@cindex @code{git checkout}
+Tracking branches track branches from the upstream repository. You first
+create a tracking branch simply by checking out a branch from the
+upstream. You use the branch name without the leading @samp{origin/}
+prefix. For example, @samp{git checkout gawk-4.1-stable}.
+
+@cindex @code{git push}
+You can then work on this branch, making commitments to it as you wish.
+Once things are ready to move upstream, you simply use @samp{git push},
+and your changes will be pushed up to the main repo.@footnote{Assuming
+you have permission to do so, of course.}
+
+You should @strong{never} checkout a branch using the @samp{origin/}
+prefix. Things will get very confused. Always work on local tracking
+branches.
+
+@item Purely Local Branches
+A @dfn{purely local branch} exists only on your system. You may be developing
+some large new feature, or fixing a very difficult bug, or have a change
+for which paperwork has not yet been completed.
+
+In such a case, you would keep your changes on a local branch, and
+periodically synchronize it with @code{master} (or whichever upstream
+branch you started from).
+@end table
+
+This may seem somewhat abstract so far. We demonstrate with commands
+and branches in @ref{Development without commit access},
+later in this @value{DOCUMENT}.
+
+Let's say you have checked out a copy of @code{gawk-4.1-stable} and
+have created a purely local branch named @code{better-random}. Then
+our picture now looks like @ref{your-repo-2}, where the @samp{T} column
+indicates a tracking branch.
+
+@float Figure,your-repo-2
+@caption{Your Local @command{gawk} Repository With a Purely Local Branch}
+@smallexample
++===+======================++=============================+
+| T | Local Branches || Remote Branches |
++===+======================++=============================+
+| X | master || origin/master |
++---+----------------------++-----------------------------+
+| X | gawk-4.1-stable || origin/gawk-4.1-stable |
++---+----------------------++-----------------------------+
+| | || origin/gawk-4.0-stable |
++---+----------------------++-----------------------------+
+| | || origin/feature/fix-comments |
++---+----------------------++-----------------------------+
+| | || ... |
++---+----------------------++-----------------------------+
+| | better-random || |
++---+----------------------++-----------------------------+
+@end smallexample
+@end float
+
+@node Branches are state
+@section Branches Represent Development State
+
+Branches represent development state. At any given time, when you
+checkout a particular branch (or create a new one), you have a copy
+of the @command{gawk} source tree that you should be able to build
+and test.
+
+The following @value{SECTION}s describe the different branches
+in the @command{gawk} repository and what they are for, as well
+as how to use your own branches.
+
+@menu
+* Repo State:: The different branch types in the repo.
+* Local State:: Managing local branches.
+* Remotes:: What a ``remote'' is.
+@end menu
+
+@node Repo State
+@subsection Branches in the Savannah Repository
+
+There are several kinds of branches in the Savannah repository.
+
+@table @dfn
+@cindex branches, dead
+@cindex dead branches
+@item Dead Branches
+Branches with the prefix @samp{dead-branches/} (such as
+@code{dead-branches/const}) hold code that was never merged into the
+main code base. For example, a feature which was started, but later
+deemed to be unwise to add. These branches keep the code available,
+but they are not updated.
+
+@cindex branches, stable
+@cindex stable branches
+@item Stable Branches
+These branches are used for bug fixes to released versions
+of @command{gawk}. Sometimes new development (i.e., user-visible
+changes) also occurs on these branches, although in a perfect world
+they would be used only for bug fixes.
+
+These branches have names like @code{gawk-4.1-stable},
+@code{gawk-4.0-stable}, and so on. Once a release has been made from
+@code{master}, the previous stable branch is not updated. For example,
+once @command{gawk} 4.1.0 was released, no more work was done on
+@code{gawk-4.0-stable}.
+
+@cindex branch, main
+@cindex main branch
+@cindex branch, @code{master}
+@cindex @code{master} branch
+@item The Main Branch
+This is the @code{master} branch. Here is where most new feature
+development takes place, and releases of new major versions are based
+off of this branch.
+
+Feature branches are typically based off this branch as well, and when
+the feature is deemed complete, merged back into it.
+
+@cindex branches, feature
+@cindex feature branches
+@item Feature Branches
+Often, a proposed new feature or code improvement is quite involved.
+It may take some time to perfect, or the @command{gawk} development team
+may not be convinced that the feature should be kept.
+
+For this purpose, the team uses branches prefixed with @samp{feature/}.
+This prefix is used even for code that simply improves the internals
+and does not make a user-visible change.
+
+Having large changes on separate branches makes it easier for members
+of the team to review the code, and also makes it easier to keep the
+changes up-to-date with respect to @code{master}, since Git excels at
+merging commits from one branch to another.
+@end table
+
+@node Local State
+@subsection Branches in Your Local Repository
+
+@cindex branches, purely local
+@cindex purely local branches
+Purely local branches are where you do your own development.
+You may use purely local branches because you don't have commit rights
+to the Savannah repo. You may also use them if you are doing some work
+that isn't ready for sharing with the rest of the team, or cannot be
+committed for some other reason.
+
+For example, for around a nine-month period, the maintainer kept a
+purely local branch for some contributed changes for which paperwork had
+not yet been completed.
+
+@node Remotes
+@subsection A Closer Look at Branch Naming
+
+@cindex @command{git branch} command, @option{-a} option
+Earlier, we said that Git maintains copies of the branches
+in the upstream repo, as well as manages your local branches.
+You can see all these branches with @samp{git branch -a}:
+
+@example
+$ @kbd{git branch -a}
+@print{} gawk-4.1-stable
+@print{} * master
+@print{} remotes/origin/HEAD -> origin/master
+@print{} remotes/origin/dead-branches/async-events
+@print{} @dots{}
+@print{} remotes/origin/feature/api-mpfr
+@print{} remotes/origin/feature/array-iface
+@print{} remotes/origin/feature/fix-comments
+@print{} @dots{}
+@end example
+
+You'll note that what we've referred to as @samp{origin/} branches
+appear in the output with an additional prefix: @samp{remotes/}.
+Up to this point, we've treated Git as if it allowed only a singled
+upstream repository. But in fact, you can configure it to use more
+than one. All the known upstream repositories are grouped under
+the @samp{remotes/} prefix, with @code{remotes/origin} being the one
+from which you initially cloned your local repository.
+
+The ability to work with multiple upstream repositories is an
+advanced one; @command{gawk} development does not make use of it.
+The intent of this @value{SUBSECTION} is to explain the output
+from @samp{git branch -a}, nothing more.
+
+@node Configuring git
+@chapter Configuring Global Settings For Git
+
+@cindex configuration settings
+@cindex settings, configuration
+@cindex global configuration settings
+@cindex configuration settings, global
+Before starting to use Git, you should configure it with some important
+settings that won't change as you use Git. You may configure options
+both globally, and on a per-repository basis. Here, we discuss only
+global configuration settings.
+
+@cindex @code{git config}
+You can configure Git using either @samp{git config}, or by editing
+the relevant files with your favorite text editor.@footnote{You are
+required to use either Vim or Emacs, other text editors are not
+allowed. Of course, reasonable developers wouldn't want to use
+any other editor anyway.}
+
+@cindex email address
+The first things to set are your email address and your real name:
+
+@cindex @code{user.name} configuration setting
+@cindex @code{user.email} configuration setting
+@cindex configuration setting, @code{user.name}
+@cindex configuration setting, @code{user.email}
+@example
+$ @kbd{git config --global user.name "J.P. Developer"} @ii{Set full name}
+$ @kbd{git config --global user.email jpdev@@example.com} @ii{Set email address}
+@end example
+
+Setting these two items are an absolute requirement.
+@strong{Note}: No aliases are allowed. If you can't supply your
+real name, you cannot contribute to the project. Other options that
+the @command{gawk} maintainer recommends that you use are:
+
+@cindex @code{push.default} configuration setting
+@cindex @code{pager.status} configuration setting
+@cindex configuration setting, @code{push.default}
+@cindex configuration setting, @code{pager.status}
+@example
+$ @kbd{git config --global push.default=simple} @ii{Only push current branch}
+$ @kbd{git config --global pager.status=true} @ii{Use pager for output of} git status
+@end example
+
+@cindex @file{.gitconfig} file
+The global settings are stored in the @file{.gitconfig} file in your
+home directory. The file looks like this:
+
+@example
+[user]
+ name = J.P. Developer
+ email = jpdev@@example.com
+[push]
+ default = simple
+[pager]
+ status = true
+@end example
+
+The @code{push.default=simple} setting ensures that older
+versions of Git only push the current branch up to the Savannah
+repo. This is the safest way to operate, and is the default
+in current Git versions.
+
+There may be other settings in your configuration file as well.
+Use @samp{git config} to see your settings:
+
+@example
+$ @kbd{git config --list}
+@print{} user.name=J.P. Developer
+@print{} user.email=jpdev@@example.com
+@print{} push.default=simple
+@end example
+
+Here are the @command{gawk} maintainer's settings:
+
+@example
+$ @kbd{git config --global --list}
+@print{} user.name=Arnold D. Robbins
+@print{} user.email=arnold@@@dots{}
+@print{} credential.helper=cache --timeout=3600
+@print{} push.default=simple
+@print{} color.ui=false
+@print{} core.autocrlf=input
+@print{} pager.status=true
+@print{} log.decorate=auto
+@end example
+
+Additional, per-project (``local'') settings are stored in
+each repo's @file{.git/config} file.
+
+@node Development without commit access
+@chapter Development Without Commit Access
+
+In this chapter we present step-by-step recipes for checking out
+and working with a local
+copy of the Savannah Git repo for @command{gawk}.
+The presentation is for when you do not have commit access
+to the Git repo, and so you cannot push your changes directly.
+
+@menu
+* Cloning:: Cloning the repo the first time.
+* Switching Branches:: Moving from one branch to another.
+* Starting A New Branch:: Starting a new branch for development.
+* Undoing a change:: Throwing away changes.
+* Updating:: Keeping in sync with the upstream repo.
+* Submitting Changes:: How to submit your changes.
+* Removing Branches:: Getting rid of unneeded branches.
+* Points to remember:: Things you need to keep in mind.
+@end menu
+
+@node Cloning
+@section Cloning The Repo
+
+@cindex @code{git clone}
+Clone the Savannah repo using @samp{git clone}. You may do so using
+either the native Git protocol, or using HTTP if you must go through a
+gateway or firewall that won't pass the Git protocol.
+
+@cindex URL, for cloning repositories
+To choose which method, you supply a @dfn{URL} for the repo when you
+clone it, as follows.
+
+@cindex URL, for @command{gawk} repository
+@cindex Repository, @command{gawk}, URL for
+@itemize @bullet
+@item
+Clone via the Git native protocol:
+
+@example
+$ @kbd{git clone git://git.savannah.gnu.org/gawk.git} @ii{Clone the repo}
+@print{} ...
+$ @kbd{cd gawk} @ii{Start working}
+@end example
+
+This will be faster, but not all firewalls pass the Git protocol
+on through.
+
+@item
+Clone via the HTTP protocol:
+
+@example
+$ @kbd{git clone http://git.savannah.gnu.org/r/gawk.git} @ii{Clone the repo}
+@print{} ...
+$ @kbd{cd gawk} @ii{Start working}
+@end example
+@end itemize
+
+@emph{You only need to clone the repo once.} From then on, you update its
+contents using other Git commands. For example, after coming back from
+your vacation in the Bahamas:
+
+@cindex @code{git pull}
+@example
+$ @kbd{cd gawk} @ii{Move to the repo}
+$ @kbd{make distclean} @ii{A good idea before updating}
+@print{} ...
+$ @kbd{git pull} @ii{Update it}
+@end example
+
+To build, you should generally follow this recipe:
+
+@example
+$ @kbd{./bootstrap.sh && ./configure && make -j && make check}
+@end example
+
+@cindex @file{bootstrap.sh} script
+@quotation NOTE
+Unless you have installed all the tools described in @ref{GNU Tools},
+you @emph{must} run @command{./bootstrap.sh} every time you clone a repo,
+do a @samp{git pull} or checkout a different branch. (In the latter case,
+do @samp{make distclean} first.) Otherwise things will get messy very
+quickly. The @command{bootstrap.sh} script ensures that all of the file
+time stamps are up to date so that it's not necessary to run the various
+configuration tools.
+@end quotation
+
+@node Switching Branches
+@section Switching Branches
+
+So far, we've been working in the default @code{master} branch.
+Let's check what's happening in the @code{gawk-4.1-stable} branch:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@example
+$ @kbd{make distclean} @ii{Clean up}
+$ @kbd{git checkout gawk-4.1-stable} @ii{Checkout a different branch}
+@print{} ...
+$ @kbd{git pull} @ii{Get up to date}
+@print{} ...
+$ @kbd{./bootstrap.sh && ./configure && make -j && make check} @ii{Start working}
+@end example
+
+@node Starting A New Branch
+@section Starting A New Branch
+
+Let's say you want to work on a new feature. For example,
+you might decide to add Python syntax support.@footnote{Just joking.
+Please don't attempt this for real.} You should create a
+new branch on which to work. First, switch back to @code{master}:
+
+@cindex @code{git checkout}
+@example
+$ @kbd{make distclean}
+$ @kbd{git checkout master}
+@end example
+
+Now, create a new branch. The easiest way to do that is
+with the @option{-b} option to @samp{git checkout}:
+
+@example
+$ @kbd{git checkout -b feature/python}
+@print{} ...
+@end example
+
+@cindex @file{ChangeLog} file
+@cindex committing changes
+You now do massive amounts of work in order to add Python syntax support.
+As you do each defined chunk of work, you update the @file{ChangeLog}
+file with your changes before @dfn{committing} them to the repo.
+
+@cindex @code{git status}
+Let's say you've added a new file @file{python.c} and updated several
+others. Use @samp{git status} to see what's changed:
+
+@example
+$ @kbd{git status}
+@print{} ...
+@end example
+
+@cindex @code{git diff}
+@cindex @code{git difftool}
+@cindex @command{meld} utility
+Before committing the current set of changes, you can use @samp{git diff}
+to view the changes. You may also use @samp{git difftool}@footnote{Don't
+run @samp{git difftool} in the background; it works interactively.} to run an
+external @command{diff} command, such as @command{meld} on GNU/Linux:
+
+@example
+$ @kbd{git diff} @ii{Regular built-in tool}
+$ @kbd{git difftool --tool=meld} @ii{GUI diff tool}
+@end example
+
+@cindex @code{git add}
+When you're happy with the changes, use @samp{git add} to tell
+Git which of the changed and/or new files you wish to have ready to
+be committed:
+
+@example
+$ @kbd{git add ...}
+@end example
+
+@cindex @code{git status}
+Use @samp{git status} to see that your changes are scheduled for committing:
+
+@example
+$ @kbd{git status}
+@print{}
+@end example
+
+Now you can commit your changes to your branch:
+
+@cindex @code{git commit}
+@example
+$ @kbd{git commit}
+@end example
+
+@noindent
+@cindex @code{git log}
+Running @samp{git commit} causes Git to invoke an editor
+(typically from the @env{$EDITOR} environment variable)
+in which you can compose a commit message. Please supply a
+short message summarizing the commit. This message will be
+visible via @samp{git log}.
+
+@node Undoing a change
+@section Undoing A Change
+
+Should you need to undo a change that you have not yet
+committed (so that you can start over), you can do so on
+per-file basis by simply checking out the file again:
+
+@cindex @code{git checkout}
+@example
+git checkout awkgram.y @ii{Undo changes to} awkgram.y@ii{. There is no output}
+@end example
+
+@cindex @code{git reset}
+To start over completely, use @samp{git reset --hard}.
+Note that this will @emph{throw away} all your changes, with no
+chance for recovery, so be sure you really want to do it.
+
+@node Updating
+@section Updating and Merging
+
+As you work on your branch, you will occasionally want to bring it
+up to date with respect to @code{master}.
+This @value{SECTION} dicusses updating locale branches
+and handling merge conflicts.
+
+@menu
+* Rebasing:: Rebasing A Local Branch.
+* Merge Conflicts:: Dealing With Merge Conflicts.
+@end menu
+
+@node Rebasing
+@subsection Rebasing A Local Branch
+
+@cindex rebasing
+For purely local branches, bringing your branch up to date is called
+@dfn{rebasing}, which causes the branch to look @emph{as if} you had
+started from the latest version of @code{master}. The steps are as
+follows:
+
+@cindex @code{git rebase}
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@example
+$ @kbd{git checkout master} @ii{Checkout} master
+$ @kbd{git pull} @ii{Update it}
+$ @kbd{git checkout feature/python} @ii{Move back to new, purely local branch}
+$ @kbd{git rebase master} @ii{``Start over'' from current} master
+@end example
+
+@node Merge Conflicts
+@subsection Dealing With Merge Conflicts
+
+@cindex conflicts, from merging
+@cindex merge conflicts
+
+Sometimes, when merging from @code{master} into your branch, or from
+a branch into @code{master}, there will be @dfn{merge conflicts}.
+These are one or more areas within a file where there are conflicting
+sets of changes, and Git could not do the merge for you.
+In this case, the conflicted area will be delimited by the traditional
+conflict markers, @samp{<<<}, @samp{===} and @samp{>>>}.
+
+Your mission is then to edit the file and @dfn{resolve} the conflict
+by fixing the order of additions (such as in a @file{ChangeLog} file),
+or fixing the code to take new changes into account.
+
+Once you have done so, you tell Git that everything is OK using
+@samp{git add} and @samp{git commit}:
+
+@example
+$ @kbd{git checkout feature/python} @ii{Move back to new, purely local branch}
+$ @kbd{git rebase master} @ii{``Start over'' from current} master
+@print{} ... Kaboom! Conflict. FIXME: Show real output here
+$ @kbd{gvim main.c} @ii{Edit the file and fix the problem}
+$ @kbd{git add main.c} @ii{Tell Git everything is OK now @dots{}}
+$ @kbd{git commit} @ii{@dots{} and it's settled}
+$ @kbd{git rebase --continue} @ii{Continue the rebase}
+@end example
+
+The @command{git rebase --continue} then continues the process of
+rebasing the current branch that we started in @ref{Rebasing}.
+It's not necessary if you are using @samp{git merge}
+(@pxref{Points to remember}).
+
+@node Submitting Changes
+@section Submitting Your Changes
+
+So now your feature is complete. You've added test cases for it to
+the test suite@footnote{You did do this, didn't you?}, you have
+@file{ChangeLog} entries that describe all the changes@footnote{You remembered this, right?},
+you have documented the new feature@footnote{You wouldn't neglect this, would you?},
+and everything works great. You're ready
+to submit the changes for review, and with any luck, inclusion into
+@command{gawk}.
+
+@cindex review, changes you made
+@cindex changes, submitting for review
+There are two ways to submit your changes for review.
+
+@table @emph
+@cindex generating a single patch
+@cindex patch, single, generation of
+@item Generate a single large patch
+To do this, simply compare your branch
+to the branch off which it is based:
+
+@cindex @code{git checkout}
+@cindex @code{git diff}
+@example
+$ @kbd{git checkout feature/python}
+$ @kbd{git diff master > /tmp/python.diff}
+@end example
+
+Mail the @file{python.diff} file to the appropriate mailing list
+along with a description of what you've changed and why.
+
+@cindex @code{git format-patch}
+@cindex generating multiple patches
+@cindex patches, multiple, generation of
+@item Generate a set of patches that in toto comprise your changes
+To do this, use @samp{git format-patch}:
+
+@cindex @code{git checkout}
+@example
+$ @kbd{git checkout feature/python}
+$ @kbd{git format-patch}
+@end example
+
+This creates a set of patch files, one per commit that isn't on the
+original branch. Mail these patches, either separately, or as a set of
+attachments, to the appropriate mailing list along with a description
+of what you've changed and why.
+
+@end table
+
+Either way you choose to submit your changes, the @command{gawk}
+maintainer and development team will review your changes and provide feedback.
+If you have signed paperwork with the FSF for @command{gawk} and the maintainer
+approves your changes, he will apply the patch(es) and commit the changes.
+
+Which list should you send mail to? If you are just starting to
+contribute, use @email{bug-gawk@@gnu.org}. After making enough
+contributions, you may be invited to join the private @command{gawk}
+developers' mailing list. If you do so, then submit your changes to
+that list.
+
+If you make any substantial changes, you will need to assign copyright
+in those changes to the Free Software Foundation before the maintainer
+can commit those changes. @xref{Doing paperwork}, for more information.
+
+@node Removing Branches
+@section Removing Branches
+
+@cindex removing branches
+@cindex branches, removing
+Once the maintainer has integrated your changes, you can get
+rid of your local branch:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git branch}
+@example
+$ @kbd{git checkout master} @ii{Move to upstream branch}
+$ @kbd{git pull} @ii{Update}
+$ @kbd{gvim ChangeLog ...} @ii{Verify your changes are in}
+$ @kbd{git branch -d feature/python} @ii{Remove your local branch}
+@end example
+
+@node Points to remember
+@section Points to Remember
+
+There are some important points to remember:
+
+@itemize @bullet
+@item
+Always do a @samp{make distclean} before switching between branches.
+Things will get really confused if you don't.
+
+@item
+For upstream branches, @emph{always} work with tracking branches. @emph{Never}
+use @samp{git checkout origin/@var{whatever}}. Git will happily let
+you do something like that, but it's just plain asking for trouble.
+
+@item
+Make sure your tracking branches are up-to-date before doing anything
+with them, particularly using them as the basis for a rebase
+or merge. This typically means a three-step process:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@example
+$ @kbd{git checkout master} @ii{Get to local copy}
+$ @kbd{git pull} @ii{Bring it up to date}
+$ @kbd{git checkout feature/python} @ii{Go back to your branch}
+@end example
+
+@noindent
+You can then do the actual rebase:
+
+@cindex @code{git rebase}
+@example
+$ @kbd{git rebase master} @ii{Now rebase your feature off of master}
+@end example
+
+@item
+Git always treats the currently checked-out branch as the object of
+operations. For example, when comparing files with the regular
+@command{diff} command, the usage is @samp{diff @var{oldfile} @var{newfile}}.
+For @samp{git diff}, the current branch takes the place of @var{newfile}, thus:
+
+@cindex @code{git checkout}
+@cindex @code{git diff}
+@example
+$ @kbd{git checkout feature/python}
+$ @kbd{git diff master} @ii{Compare} master @ii{to current branch}
+@end example
+
+@noindent
+or if merging:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git merge}
+@example
+$ @kbd{git checkout master} @ii{Checkout} master
+$ @kbd{git pull} @ii{Update tracking branch}
+$ @kbd{git merge feature/python} @ii{Merge changes into} master
+@end example
+
+@end itemize
+
+@node Development with commit access
+@chapter Development With Commit Access
+
+This @value{CHAPTER} describes how to do development when you @emph{do}
+have commit access to the @command{gawk} repo on Savannah.
+
+@menu
+* Initial setup:: Getting started with commit access.
+* ssh clone:: Cloning using an @samp{ssh://} URL.
+* Developing patches:: Developing patches.
+* Developing new features:: Developing new features.
+* Developing fixes:: Developing fixes.
+@end menu
+
+@node Initial setup
+@section Initial Setup
+
+Congratulations! After becoming a quality contributor to @command{gawk}
+development, you've been invited to join the private development list
+and to accept having commit access to the repo.
+
+@cindex Savannah, creating an account
+@cindex account, Savannah, creation of
+@cindex @code{ssh} key
+The first thing to do is to create an account on Savannah, choosing a
+unique user name. To do so, go to the @uref{http://savannah.gnu.org,
+Savannah home page} and click on the ``New User'' link. The setup
+will include uploading of your @command{ssh} key, as per the instructions
+on the Savannah web page.
+
+After you've done all this, send email to the maintainer with your
+Savannah user name, and he will add you to the list of users who have
+commit access to the repo.
+
+@node ssh clone
+@section Cloning The Repo With An @command{ssh} URL
+
+In order to be able to commit changes to the repo, you must
+clone it using an @samp{ssh://} URL.
+Cloning the repo with @command{ssh} is similar to cloning
+with the Git protocol or with HTTP, but the URL is different:
+
+@cindex @code{git clone}
+@cindex URL, for @command{gawk} repository
+@cindex Repository, @command{gawk}, URL for
+@example
+$ @kbd{git clone ssh://yourname@@git.sv.gnu.org/srv/git/gawk.git}
+@print{} ...
+@end example
+
+Here, you should replace @samp{yourname} in the command with the user
+name you chose for use on Savannah.
+
+@node Developing patches
+@section Developing Patches
+
+The first part of developing a patch is the same as for developers
+without commit access:
+
+@enumerate 1
+@item
+Develop the code and test it.
+
+@item
+@cindex @file{ChangeLog} file
+Update the @file{ChangeLog}.
+
+@item
+@cindex documentation files
+@cindex @file{gawktexi.in} documentation
+@cindex @file{gawk.1} manual page
+If necessary, update the documentation: @file{doc/gawktexi.in}
+and/or @file{doc/gawk.1}.
+
+@cindex @code{git diff}
+@item
+Use @samp{git diff > mychange.diff} to create a patch file.
+
+@item
+Send it to the mailing list for discussion.
+
+@item
+Iterate until the patch is ready to be committed.
+@end enumerate
+
+However, now that you have commit access, you can commit the fix and push
+it up to the repo yourself!
+Let's assume you've made a bug fix directly on @code{master}.
+Here's how to commit your changes:
+
+@cindex @code{git diff}
+@cindex @code{git add}
+@cindex @code{git commit}
+@cindex @code{git push}
+@example
+$ @kbd{git diff} @ii{Review the patch one more time}
+$ @kbd{git add @dots{}} @ii{Add any files for committing}
+$ @kbd{git commit} @ii{Commit the files. Include a commit message.}
+$ @kbd{git push} @ii{Push the files up to the repo. Ta da!}
+@end example
+
+The first three steps are the same described earlier
+(@pxref{Starting A New Branch}).
+The @samp{git push} is what's new, and it updates the repo on
+Savannah. Congratulations!
+
+As a courtesy, you should send a note to the mailing list indicating
+that you have pushed your change.
+
+@node Developing new features
+@section Developing New Features
+
+Developing a new feature can be easier once you have commit access
+to the repo. First, create a new branch to hold your feature:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@example
+$ @kbd{git checkout master} @ii{Start from} master
+$ @kbd{git pull} @ii{Be sure to be up to date}
+$ @kbd{git checkout -b feature/python} @ii{Create and switch to a new branch}
+@end example
+
+Now, you can develop as normal, adding new files if necessary (such as new tests),
+modifying code, updating the @file{ChangeLog} and documentation, and so on.
+
+You can share changes with the mailing list as diffs, as usual. However, especially
+for a large feature, it would be better to push your branch up to Savannah. Then,
+everyone else can simply pull it down to their local systems and review your
+changes at their leisure.
+
+To push your branch up initially:
+
+@cindex @code{git diff}
+@cindex @code{git add}
+@cindex @code{git commit}
+@cindex @code{git push}
+@example
+$ @kbd{git diff} @ii{Review your changes}
+$ @kbd{git add @dots{}} @ii{Add any files for committing}
+$ @kbd{git commit} @ii{Commit the files. Include a commit message}
+$ @kbd{git push -u origin feature/python} @ii{Push the branch up to the repo}
+@end example
+
+When you use @samp{push -u origin}, Git helpfully converts
+your purely local branch into a tracking branch. It becomes
+as if the branch had originated from the upstream repo
+and you checked it out locally.
+
+@emph{You only need to do @samp{git push -u origin} once.}
+As you continue to work on your branch, the workflow simplifies
+into this:
+
+@cindex @code{git diff}
+@cindex @code{git add}
+@cindex @code{git commit}
+@cindex @code{git push}
+@example
+$ @kbd{git diff} @ii{Review your changes}
+$ @kbd{git add @dots{}} @ii{Add any files for committing}
+$ @kbd{git commit} @ii{Commit the files}
+$ @kbd{git push} @ii{Push your changes to the branch upstream}
+@end example
+
+@node Developing fixes
+@section Developing Fixes
+
+If you want to make a fix on @code{master} or on the current
+stable branch, you work the same way, by producing and discussing
+a diff on the mailing list. Once it's approved, you can commit it
+yourself:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git add}
+@cindex @code{git commit}
+@cindex @code{git diff}
+@example
+$ @kbd{git checkout master} @ii{Move to} master
+$ @kbd{git pull} @ii{Make sure we're up to date with the maintainer}
+$ @kbd{gvim @dots{}} @ii{Make any fixes, compile, test}
+$ @kbd{git diff} @ii{Review your changes}
+$ @kbd{git add @dots{}} @ii{Add any files for committing}
+$ @kbd{git commit} @ii{Commit the files. Include a commit message.}
+@end example
+
+When you're ready to push your changes:
+
+@cindex @code{git pull}
+@cindex @code{git push}
+@example
+$ @kbd{git pull} @ii{Download latest version; Git will merge}
+$ @kbd{gvim ...} @ii{Resolve any merge conflicts with} git add @ii{and} git commit
+$ @kbd{git push} @ii{Now you can push your changes upstream}
+@end example
+
+@xref{Merge Conflicts} for instructions on dealing with merge conflicts.
+
+@node General practices
+@chapter General Development Practices
+
+This @value{CHAPTER} discusses general practices for @command{gawk} development.
+The discussion here is mainly for developers with commit access to the
+Savannah repo.
+
+@table @dfn
+@cindex propagating fixes to other branches
+@cindex fixes, propagating to other branches
+@item Propagating Fixes
+Usually, bug fixes should be made on the current ``stable'' branch.
+Once a fix has been reviewed and approved, you can commit it and
+push it yourself.
+Typically, the maintainer then takes care to merge the fix to @code{master}
+and from there to any other branches. However, you are welcome to
+save him the time and do this yourself.
+
+@cindex directory ownership
+@cindex ownership of directories
+@item Directory ownership
+Some developers ``own'' certain parts of the tree, such as the @file{pc} and @file{vms} directories.
+They are allowed to commit changes to those directories without review by the mailing
+list, but changes that also touch the mainline code should be submitted for review.
+
+@item New feature development
+Unless you can convince the maintainer (and the other developers!) otherwise,
+you should @emph{always} start branches for new features from @code{master},
+and not from the current ``stable'' branch.
+
+Use @samp{checkout -b feature/@var{feature_name}} to create the initial branch.
+You may then elect to keep it purely local, or to push it up to Savannah for
+review, even if the feature is not yet totally ``ready for prime time.''
+@end table
+
+During development of a new feature, you will most likely wish to keep your
+feature branch up to date with respect to ongoing improvements in @code{master}.
+This is generally easy to do. There are two different mechanisms, and which
+one you use depends upon the nature of your new feature branch.
+
+@table @dfn
+@item As long as your branch is purely local
+You should use @samp{git rebase}
+to the keep the branch synchronized with the original branch from which it was forked:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git rebase}
+@example
+$ @kbd{git checkout master} @ii{Move to} master
+$ @kbd{git pull} @ii{Bring it up to date}
+$ @kbd{git checkout feature/python} @ii{Move to your new feature branch}
+$ @kbd{git rebase master} @ii{Rebase from} master
+@end example
+
+@noindent
+The rebasing operation may require that you resolve conflicts
+(@pxref{Merge Conflicts}).
+Edit any conflicted files and resolve the problem(s). Compile and
+test your changes, then use @samp{git add}
+and @samp{git commit} to indicate resolution, and then use
+@samp{git rebase --continue} to continue the rebasing.
+Git is very good about providing short instructions on how to
+continue when such conflicts occur.
+
+@item Once the branch has been pushed up to Savannah
+You @emph{must} use @samp{git merge} to bring your feature branch up
+to date. That flow looks like this:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git merge}
+@example
+$ @kbd{git checkout master} @ii{Move to} master
+$ @kbd{git pull} @ii{Bring it up to date}
+$ @kbd{git checkout feature/python} @ii{Move to your new feature branch}
+$ @kbd{git merge master} @ii{Merge from} master
+@end example
+
+@noindent
+Here too, you may have to resolve any merge conflicts
+(@pxref{Merge Conflicts}).
+Once that's done, you can push the changes up to Savannah.
+
+When the changes on your branch are complete, usually the
+maintainer merges the branch to @code{master}. But
+there's really no magic involved, the merge is simply
+done in the other direction:
+
+@cindex @code{git checkout}
+@cindex @code{git pull}
+@cindex @code{git merge}
+@example
+$ @kbd{git checkout feature/python} @ii{Checkout feature branch}
+$ @kbd{git pull} @ii{Bring it up to date}
+$ @kbd{git checkout master} @ii{Checkout} master
+$ @kbd{git pull} @ii{Bring it up to date}
+$ @kbd{git merge feature/python} @ii{Merge from} feature/python @ii{into} master
+@end example
+
+If you've been keeping @samp{feature/python} in sync with
+@code{master}, then there should be no merge conflicts to
+resolve, and you can push the result to Savannah:
+
+@cindex @code{git push}
+@example
+$ @kbd{git push} @ii{Push up to Savannah}
+@end example
+
+Since @samp{feature/python} is no longer needed, it can be
+gotten rid of:
+
+@cindex @code{git branch}
+@cindex @code{git push}
+@example
+$ @kbd{git branch -d feature/python} @ii{Still on} master@ii{, delete feature branch}
+$ @kbd{git push -u origin -d feature/python} @ii{Delete the branch on Savannah}
+@end example
+
+The @samp{git push} command deletes the @code{feature/python}
+branch from the Savannah repo.
+
+@cindex @code{git fetch}
+@noindent
+Finally, you should send an email to developer's list describing
+what you've done so that everyone else can delete their
+copies of the branch and do a @samp{git fetch --prune}
+(@pxref{Repo Maintenance}).
+
+To update the other remaining development branches
+with the latest changes on @code{master}, use the
+@samp{helpers/update-branches.sh} script in the repo.
+
+@end table
+
+@node Repo Maintenance
+@chapter Keeping Your Repo Organized
+
+There are a few commands you should know about to help keep
+your local repo clean.
+
+@table @emph
+@cindex removing old branches
+@cindex old branches, removing
+@cindex branches, removing
+@item Removing old branches
+Developers add branches to the Savannah repo and when development
+on them is done, they
+get merged into @code{master}. Then the branches on Savannah are
+deleted (as shown in @ref{General practices}).
+
+However, your local copies of those branches (labelled with the
+@samp{origin/} prefix) remain in your local repo. If you don't
+need them, then you can clean up your repo as follows.
+
+First, remove any related tracking branch you may have:
+
+@cindex @code{git pull}
+@cindex @code{git branch}
+@example
+$ @kbd{git pull} @ii{Get up to date}
+$ @kbd{git branch -d feature/merged-feature} @ii{Remove tracking branch}
+@end example
+
+Then, ask Git to clean things up for you:
+
+@cindex @code{git fetch}
+@example
+$ @kbd{git fetch --prune} @ii{Remove unneeded branches}
+@end example
+
+@cindex removing cruft
+@cindex cruft, removing
+@item Removing cruft
+As Git works, occasional ``cruft'' collects in the repository.
+Git does occasionally clean this out on its own, but if you're
+concerned about disk usage, you can do so yourself
+using @samp{git gc} (short for ``garbage collect''). For
+example:
+
+@cindex @code{git gc}
+@example
+$ @kbd{du -s .} @ii{Check disk usage}
+@print{} 99188 . @ii{Almost 10 megabytes}
+$ @kbd{git gc} @ii{Collect garbage}
+@print{} Counting objects: 32114, done.
+@print{} Delta compression using up to 4 threads.
+@print{} Compressing objects: 100% (6370/6370), done.
+@print{} Writing objects: 100% (32114/32114), done.
+@print{} Total 32114 (delta 25655), reused 31525 (delta 25231)
+$ @kbd{du -s .} @ii{Check disk usage again}
+@print{} 75168 . @ii{Down to 7 megabytes}
+@end example
+
+@cindex renaming branches
+@cindex branches, renaming
+@item Renaming branches
+Occasionally you may want to rename a branch.@footnote{This discussion
+adopted from
+@uref{https://multiplestates.wordpress.com/2015/02/05/rename-a-local-and-remote-branch-in-git, here}.}
+If your branch is local and you are on it, us:
+
+@example
+$ @kbd{git branch -m feature/@var{new-name}}
+@end example
+
+@noindent
+Otherwise, use:
+
+@example
+$ @kbd{git branch -m feature/@var{old-name} feature/@var{new-name}}
+@end example
+
+You then need to fix the upstream repo. This command does so,
+using an older syntax to simultaneously delete the old name and
+push the new name. You should be on the new branch:
+
+@example
+$ @kbd{git push origin :feature/@var{old-name} feature/@var{new-name}}
+@end example
+
+@quotation NOTE
+It is the leading @samp{:} in the first branch name that causes
+Git to delete the old name in the upstream repo. Don't omit it!
+@end quotation
+
+Finally, reset the upstream branch for the local branch
+with the new name:
+
+@example
+$ @kbd{git push -u origin feature/@var{new-name}}
+@end example
+
+@end table
+
+@node Development Stuff
+@chapter Development Stuff
+
+This @value{CHAPTER} discusses other things you need to know and/or do
+if you're going to participate seriously in @command{gawk} development.
+
+@menu
+* Coding style:: Where to read up on the coding style.
+* Doing paperwork:: Legal stuff in order to contribute.
+* Tools:: Tools to have on your system for development.
+* Debugging:: Compiling for debugging.
+@end menu
+
+@node Coding style
+@section Coding Style
+
+@cindex coding style
+You should read the discussion about adding code in the @command{gawk}
+documentation.
+@ifnothtml
+@xref{Additions, Additions, Making Additions to @command{gawk}, gawk, GAWK: Effective awk Programming},
+for a discussion of the general procedure. In particular, pay attention to the
+coding style guidelines in
+@ref{Adding Code, Adding Code, Adding New Features, gawk, GAWK: Effective awk Programming}.@footnote{Changes that don't follow the coding
+style guidelines won't be accepted. Period.}
+These two sections may also be found online, at
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Additions.html#Additions}, and
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Adding-Code.html#Adding-Code},
+respectively.
+@end ifnothtml
+@ifhtml
+See @uref{https://www.gnu.org/software/gawk/manual/html_node/Additions.html#Additions,
+the section @cite{Making Additions to @command{gawk}}}, in the online documentation
+for a discussion of the general procedure. In particular, pay attention to the
+coding style guidelines in
+@uref{https://www.gnu.org/software/gawk/manual/html_node/Adding-Code.html#Adding-Code,
+the section @cite{Adding New Features}}, also in the online documentation.
+@end ifhtml
+
+@node Doing paperwork
+@section Assigning Copyrights to the FSF
+
+@cindex assigning copyright
+@cindex copyright, assignment
+For any change of more than just a few lines, you will need to assign
+copyright in (that is, ownership of) those changes to the Free Software
+Foundation.
+
+This is generally an easy thing to do. In particular, you can choose to
+use a version of the copyright assignment which assigns all your current
+@emph{and future} changes to @command{gawk} to the FSF. This means
+that you only need to do the paperwork once, and from then on all your
+changes will automatically belong to the FSF. The maintainer recommends
+doing this.
+
+The maintainer will help you with this process once you have a
+contribution that warrants it.
+
+@node Tools
+@section Software Tools You Will Need
+
+@cindex software tools
+This @value{SECTION} discusses additional tools that you may need to
+install on your system in order to be in sync with what the @command{gawk}
+maintainer uses. It also discusses different C compiler options for use
+during code development, and how to compile @command{gawk} for debugging.
+
+@menu
+* GNU Tools:: The GNU Autotools.
+* Compilers:: A discussion of compilers that can be used.
+@end menu
+
+@node GNU Tools
+@subsection GNU Tools
+
+@cindex GNU software tools
+@cindex autotools
+If you expect to work with the configuration files and/or the
+@file{Makefile} files, you will need to install a number of other GNU
+tools. In general, you should be using the latest versions of the tools,
+or least the same ones that the maintainer himself uses. This helps
+minimize the differences that the maintainer has to resolve when merging
+changes, and in general avoids confusion and hassle.
+Similarly, you should install the latest GNU documentation tools as well.
+The tools are described in the following list:
+
+@table @command
+@cindex @command{autoconf}
+@cindex GNU @command{autoconf}
+@cindex @file{configure.ac} file
+@item autoconf
+GNU Autoconf processes the @file{configure.ac} files in order to
+generate the @file{configure} shell script and @file{config.h.in}
+input file. See @uref{https://www.gnu.org/software/autoconf/autoconf.html,
+the Autoconf home page} for more information.
+
+@cindex @command{automake}
+@cindex GNU @command{automake}
+@cindex @file{Makefile.am} file
+@item automake
+GNU Automake processes the @file{configure.ac} and @file{Makefile.am}
+files to produce @file{Makefile.in} files. See @uref{https://www.gnu.org/software/automake,
+the Automake home page} for more information.
+
+@cindex @command{gettext}
+@cindex GNU @command{gettext}
+@cindex @file{gawk.pot} file
+@item gettext
+GNU Gettext processes the @command{gawk} source code to produce the
+original @file{po/gawk.pot} message template file. Normally you
+should not need need to do this; the maintainer usually
+manages this task. See @uref{https://www.gnu.org/software/gettext,
+the Gettext home page} for more information.
+
+@cindex @command{libtool}
+@cindex GNU @command{libtool}
+@cindex extensions, @command{gawk}
+@item libtool
+GNU Libtool works with Autoconf and Automake to produce portable
+shared libraries. It is used for the extensions that ship with @command{gawk},
+whose code is in the @file{extensions} directory.
+See @uref{https://www.gnu.org/software/libtool, the Libtool home page}
+for more information.
+
+@cindex @command{makeinfo}
+@cindex GNU @command{makeinfo}
+@cindex @command{Texinfo}
+@cindex GNU Texinfo
+@item makeinfo
+The @command{makeinfo} command is used to build the Info versions of
+the documentation. You need to have the same version as the maintainer
+uses, so that when you make a change to the documentation, the corresponding
+change to the generated Info file will be minimal. @command{makeinfo} is
+part of GNU Texinfo. See @uref{https://www.gnu.org/software/texinfo,
+the Texinfo home page} for more information.
+
+@end table
+
+@node Compilers
+@subsection Compilers
+
+@cindex compilers
+@cindex GCC, the GNU Compiler Collection
+The default compiler for @command{gawk} development is GCC, the
+@uref{https://gcc.gnu.org, GNU Compiler Collection}.
+The default version of GCC is whatever is on the
+maintainer's personal GNU/Linux system, although he does try to build
+the latest released version if that is newer than what's
+on his system, and then occasionally test @command{gawk} with it.
+
+@cindex @command{clang} compiler
+He also attempts to test occasionally with @uref{https://clang.llvm.org/,
+@command{clang}}. However, he uses whatever is the default for his
+GNU/Linux system, and does @emph{not} make an effort to build the current
+version for testing.
+
+Both GCC and @command{clang} are highly optimizing compilers that produce
+good code, but are very slow. There are two other compilers that
+are faster, but that may not produce quite as good code. However, they
+are both reasonable for doing development.
+
+@table @emph
+@cindex @command{tcc} compiler
+@cindex Tiny C compiler
+@item The Tiny C Compiler, @command{tcc}
+This compiler is @emph{very} fast, but it produces only mediocre code.
+It is capable of compiling @command{gawk}, and it does so well enough
+that @samp{make check} runs without errors.
+
+However, in the past the quality has varied, and the maintainer has
+had problems with it. He recommends using it for regular development,
+where fast compiles are important, but rebuilding with GCC before doing
+any commits, in case @command{tcc} has missed something.@footnote{This
+bit the maintainer once.}
+
+See @uref{http://www.tinycc.org, the project's home page} for
+some information. More information can be found in the project's
+@uref{http://repo.or.cz/tinycc.git, Git repository}. The maintainer builds
+from the @code{mob} branch for his work, but after updating it you should
+check that this branch still works to compile @command{gawk} before
+installing it.
+
+@cindex @command{pcc} compiler
+@cindex Portable C compiler
+@item The (Revived) Portable C Compiler
+This is an updated version of the venerable Unix Portable C Compiler,
+PCC. It accepts ANSI C syntax and supports both older and modern
+architectures. It produces better code than @command{tcc} but is slower,
+although still much faster than GCC and @command{clang}.
+
+See @uref{http://pcc.ludd.ltu.se, the project's home page} for more
+information. See @uref{http://pcc.ludd.ltu.se/supported-platforms}
+for instructions about obtaining the code using CVS and building it.
+
+@cindex @command{pcc} compiler, Git mirror
+An alternative location for the source is the @command{gawk}
+maintainer's @uref{https://github.com/arnoldrobbins/pcc-revived,
+Git mirror} of the code.
+@end table
+
+@node Debugging
+@section Compiling For Debugging
+
+@cindex debugging, compiling for
+@cindex compiling for debugging
+If you wish to compile for debugging, you should use GCC. After
+running @command{configure} but before running @command{make}, edit the
+@file{Makefile} and remove the @option{-O2} flag from the definition of
+@code{CFLAGS}. Optionally, do the same for @file{extensions/Makefile}.
+Then run @command{make}.
+
+@cindex @file{.developing} file
+You can enable additional debugging code by creating a file
+named @file{.developing} in the @command{gawk} source code directory
+@emph{before} running @command{configure}. Doing so enables additional
+conditionally-compiled debugging code within @command{gawk}, and adds
+additional warning and debugging options if compiling with GCC.
+
+@node Cheat Sheet
+@appendix Git Command Cheat Sheet
+
+This @value{APPENDIX} provides an alphabetical list of the Git commands
+cited in this @value{DOCUMENT}, along with brief descriptions of
+what the commands do.
+
+@cindex @code{git help}
+@cindex @option{--help} option for @command{git}
+@cindex @command{git} command, @option{--help} option
+Note that you may always use either @samp{git help @var{command}}
+or @samp{git @var{command} --help} to get short, man-page style
+help on how to use any given Git command.
+
+@table @code
+@item git add
+Add a file to the list of files to be committed.
+
+@item git branch
+View existing branches, or delete a branch.
+Most useful options: @option{-a} and @option{-d}.
+
+@item git checkout
+Checkout an existing branch, create a new branch, or checkout a file to
+reset it. Use the @option{-b} option to create and checkout a
+new branch in one operation.
+
+@item git clone
+Clone (make a new copy of) an existing repository. You generally
+only need to do this once.
+
+@item git commit
+Commit changes to files which have been staged for committing
+with @samp{git add}.
+This makes your changes permanent, @emph{in your local repository only}.
+To publish your changes to an upstream repo, you must use @samp{git push}.
+
+@item git config
+Display and/or change global and/or local configuration settings.
+
+@item git diff
+Show a unified-format diff of what's changed in the current directory
+as of the last commit. It helps to have Git configured to use
+its builtin pager for reviewing diffs (@pxref{Configuring git}).
+
+@item git difftool
+Use a ``tool'' (usually a GUI-based program) to view differences,
+instead of the standard textual diff as you'd get from @samp{git diff}.
+
+@item git fetch
+Update your local copy of the upstream's branches. That is,
+update the various @samp{origin/} branches. This leaves your
+local tracking branches unchanged.
+With the @option{--prune} option, this removes any copies
+of stale @samp{origin/} branches.
+
+@item git format-patch
+Create a series of patch files, one per commit not on the
+original branch from which you started.
+
+@item git gc
+Run a ``garbage collection'' pass in the current repository.
+This can often reduce the space used in a large repo. For
+@command{gawk} it does not make that much difference.
+
+@item git help
+Print a man-page--style usage summary for a command.
+
+@item git log
+Show the current branch's commit log. This includes who
+made the commit, the date, and the commit message.
+Commits are shown from newest to oldest.
+
+@item git merge
+Merge changes from the named branch into the current one.
+
+@item git pull
+When in your local tracking branch @code{@var{xxx}},
+run @samp{git fetch}, and then merge from @code{origin/@var{xxx}}
+into @code{@var{xxx}}.
+
+@item git push
+Push commits from your local tracking branch @code{@var{xxx}}
+through @code{origin/@var{xxx}} and on to branch @code{@var{xxx}}
+in the upstream repo. Use @samp{git push -u origin -d @var{xxx}} to delete
+an upstream branch. (Do so carefully!)
+
+@item git rebase
+Rebase the changes in the current purely local branch to
+look as if they had been made relative to the latest
+commit in the current upstream branch (typically @code{master}).
+This is how you keep your local, in-progress changes up-to-date
+with respect to the original branch from which they were started.
+
+@item git reset
+@cindex @code{git reset}, @option{--hard} option
+Restore the original state of the repo, especially with the
+@option{--hard} option. Read up on this command, and use it carefully.
+
+@item git status
+Show the status of files that are scheduled to be committed,
+and those that have been modified but not yet scheduled for committing.
+Use @samp{git add} to schedule a file for committing.
+This command also lists untracked files.
+
+@end table
+
+@node Resources
+@appendix Git Resources
+
+@cindex @cite{Pro Git} book
+There are many Git resources available on the Internet.
+Start at the @uref{http://git-scm.org, Git Project home page}.
+In particular, the @uref{https://git-scm.com/book/en/v2,
+@cite{Pro Git} book} is available online.
+
+@cindex Savannah, using Git guide
+See also @uref{http://savannah.gnu.org/maintenance/UsingGit,
+the Savannah quick introduction to Git}.
+
+@node TODO
+@appendix Stuff Still To Do In This Document
+
+@itemize @bullet
+@item
+Fill out all examples with full output
+
+@end itemize
+
+@ifnotdocbook
+@node Index
+@unnumbered Index
+@end ifnotdocbook
+@printindex cp
+
+@bye