diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2017-04-07 09:08:22 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2017-04-07 09:08:22 +0300 |
commit | 6de370d832e5145ed6a4cb05099f51192773a4b1 (patch) | |
tree | 0434e3832b072e300d145d2d46d607165526f8b6 /doc | |
parent | 4271b995d64430e794e344f0c4985162eb991052 (diff) | |
download | egawk-6de370d832e5145ed6a4cb05099f51192773a4b1.tar.gz egawk-6de370d832e5145ed6a4cb05099f51192773a4b1.tar.bz2 egawk-6de370d832e5145ed6a4cb05099f51192773a4b1.zip |
Remove using-git.texi. Add gawkworkflow.texi.
Diffstat (limited to 'doc')
-rw-r--r-- | doc/ChangeLog | 7 | ||||
-rw-r--r-- | doc/Makefile.am | 22 | ||||
-rw-r--r-- | doc/Makefile.in | 54 | ||||
-rw-r--r-- | doc/gawkworkflow.info | 1980 | ||||
-rwxr-xr-x | doc/gawkworkflow.texi | 2158 | ||||
-rw-r--r-- | doc/using-git.texi | 1179 | ||||
-rw-r--r-- | doc/wordlist2 | 176 |
7 files changed, 4367 insertions, 1209 deletions
diff --git a/doc/ChangeLog b/doc/ChangeLog index 142f035e..dd3e1c93 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,3 +1,10 @@ +2017-04-07 Arnold D. Robbins <arnold@skeeve.com> + + * using-git.texi: Removed. + * gawkworkflow.texi: Added. New file. + * wordlist2: New file. + * Makefile.am: Revised for new document. Copyright years updated. + 2017-03-17 Arnold D. Robbins <arnold@skeeve.com> * gawktexi.in: Improve the discussion of quoting on diff --git a/doc/Makefile.am b/doc/Makefile.am index 002fafa5..76ba8246 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -1,7 +1,7 @@ # # doc/Makefile.am --- automake input file for gawk # -# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2007, 2010, 2011 +# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2007, 2010, 2011, 2016, 2017 # the Free Software Foundation, Inc. # # This file is part of GAWK, the GNU implementation of the @@ -24,7 +24,7 @@ ## process this file with automake to produce Makefile.in -info_TEXINFOS = gawk.texi gawkinet.texi using-git.texi +info_TEXINFOS = gawk.texi gawkinet.texi gawkworkflow.texi man_MANS = gawk.1 @@ -51,7 +51,7 @@ EXTRA_DIST = ChangeLog ChangeLog.0 README.card ad.block setter.outline \ bc_notes # Get rid of generated files when cleaning -CLEANFILES = *.ps *.html *.dvi *~ awkcard.nc awkcard.tr gawk.pdf gawkinet.pdf using-git.pdf awkcard.pdf gawk.1.pdf +CLEANFILES = *.ps *.html *.dvi *~ awkcard.nc awkcard.tr gawk.pdf gawkinet.pdf gawkworkflow.pdf awkcard.pdf gawk.1.pdf MAKEINFO = @MAKEINFO@ --no-split --force @@ -77,7 +77,7 @@ AWKCARD = awkcard.ps gawk.texi: $(srcdir)/gawktexi.in $(srcdir)/sidebar.awk awk -f $(srcdir)/sidebar.awk < $(srcdir)/gawktexi.in > gawk.texi -postscript: gawk.ps gawkinet.ps using-git.ps gawk.1.ps $(AWKCARD) +postscript: gawk.ps gawkinet.ps gawkworkflow.ps gawk.1.ps $(AWKCARD) pdf-local: postscript gawk.pdf gawkinet.pdf awkcard.pdf gawk.1.pdf @@ -87,8 +87,8 @@ gawk.ps: gawk.dvi gawkinet.ps: gawkinet.dvi TEXINPUTS=$(srcdir): dvips -o gawkinet.ps gawkinet.dvi -using-git.ps: using-git.dvi - TEXINPUTS=$(srcdir): dvips -o using-git.ps using-git.dvi +gawkworkflow.ps: gawkworkflow.dvi + TEXINPUTS=$(srcdir): dvips -o gawkworkflow.ps gawkworkflow.dvi gawk.1.ps: gawk.1 -groff -man $(srcdir)/gawk.1 > gawk.1.ps @@ -108,6 +108,14 @@ awkcard.nc: $(CARDFILES) awkcard.pdf: awkcard.ps ps2pdf awkcard.ps awkcard.pdf -spell: +spell: spellmanual spell workflow + +spellmanual: + @echo ==== gawktexi.in ====; export LC_ALL=C ; spell "$(srcdir)"/gawktexi.in | \ sort -u | comm -23 - "$(srcdir)"/wordlist + +spellworkflow: + @echo ==== gawkworkflow.texi ==== + export LC_ALL=C ; spell "$(srcdir)"/gawkworkflow.texi | \ + sort -u | comm -23 - "$(srcdir)"/wordlist2 diff --git a/doc/Makefile.in b/doc/Makefile.in index b3523a20..fd4f47a3 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -17,7 +17,7 @@ # # doc/Makefile.am --- automake input file for gawk # -# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2007, 2010, 2011 +# Copyright (C) 2000, 2001, 2002, 2004, 2005, 2007, 2010, 2011, 2016, 2017 # the Free Software Foundation, Inc. # # This file is part of GAWK, the GNU implementation of the @@ -174,13 +174,13 @@ am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) am__v_texidevnull_0 = > /dev/null am__v_texidevnull_1 = INFO_DEPS = $(srcdir)/gawk.info $(srcdir)/gawkinet.info \ - $(srcdir)/using-git.info + $(srcdir)/gawkworkflow.info am__TEXINFO_TEX_DIR = $(srcdir) -DVIS = gawk.dvi gawkinet.dvi using-git.dvi -PDFS = gawk.pdf gawkinet.pdf using-git.pdf -PSS = gawk.ps gawkinet.ps using-git.ps -HTMLS = gawk.html gawkinet.html using-git.html -TEXINFOS = gawk.texi gawkinet.texi using-git.texi +DVIS = gawk.dvi gawkinet.dvi gawkworkflow.dvi +PDFS = gawk.pdf gawkinet.pdf gawkworkflow.pdf +PSS = gawk.ps gawkinet.ps gawkworkflow.ps +HTMLS = gawk.html gawkinet.html gawkworkflow.html +TEXINFOS = gawk.texi gawkinet.texi gawkworkflow.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html @@ -354,7 +354,7 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -info_TEXINFOS = gawk.texi gawkinet.texi using-git.texi +info_TEXINFOS = gawk.texi gawkinet.texi gawkworkflow.texi man_MANS = gawk.1 EXTRA_DIST = ChangeLog ChangeLog.0 README.card ad.block setter.outline \ awkcard.in awkforai.txt texinfo.tex cardfonts \ @@ -380,7 +380,7 @@ EXTRA_DIST = ChangeLog ChangeLog.0 README.card ad.block setter.outline \ # Get rid of generated files when cleaning -CLEANFILES = *.ps *.html *.dvi *~ awkcard.nc awkcard.tr gawk.pdf gawkinet.pdf using-git.pdf awkcard.pdf gawk.1.pdf +CLEANFILES = *.ps *.html *.dvi *~ awkcard.nc awkcard.tr gawk.pdf gawkinet.pdf gawkworkflow.pdf awkcard.pdf gawk.1.pdf TROFF = groff -t -Tps -U SEDME = sed -e "s/^level0 restore/level0 restore flashme 100 72 moveto (Copyright `date '+%m-%d-%y %T'`, FSF, Inc. (all)) show/" \ -e "s/^\/level0 save def/\/level0 save def 30 -48 translate/" @@ -478,10 +478,10 @@ $(srcdir)/gawkinet.info: gawkinet.texi gawkinet.dvi: gawkinet.texi gawkinet.pdf: gawkinet.texi gawkinet.html: gawkinet.texi -$(srcdir)/using-git.info: using-git.texi -using-git.dvi: using-git.texi -using-git.pdf: using-git.texi -using-git.html: using-git.texi +$(srcdir)/gawkworkflow.info: gawkworkflow.texi +gawkworkflow.dvi: gawkworkflow.texi +gawkworkflow.pdf: gawkworkflow.texi +gawkworkflow.html: gawkworkflow.texi .dvi.ps: $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) $(AM_V_texinfo) -o $@ $< @@ -563,16 +563,16 @@ dist-info: $(INFO_DEPS) done mostlyclean-aminfo: - -rm -rf gawk.t2d gawk.t2p gawkinet.t2d gawkinet.t2p using-git.t2d \ - using-git.t2p + -rm -rf gawk.t2d gawk.t2p gawkinet.t2d gawkinet.t2p gawkworkflow.t2d \ + gawkworkflow.t2p clean-aminfo: -test -z "gawk.dvi gawk.pdf gawk.ps gawk.html gawkinet.dvi gawkinet.pdf \ - gawkinet.ps gawkinet.html using-git.dvi using-git.pdf \ - using-git.ps using-git.html" \ + gawkinet.ps gawkinet.html gawkworkflow.dvi gawkworkflow.pdf \ + gawkworkflow.ps gawkworkflow.html" \ || rm -rf gawk.dvi gawk.pdf gawk.ps gawk.html gawkinet.dvi gawkinet.pdf \ - gawkinet.ps gawkinet.html using-git.dvi using-git.pdf \ - using-git.ps using-git.html + gawkinet.ps gawkinet.html gawkworkflow.dvi gawkworkflow.pdf \ + gawkworkflow.ps gawkworkflow.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ @@ -891,7 +891,7 @@ uninstall-man: uninstall-man1 gawk.texi: $(srcdir)/gawktexi.in $(srcdir)/sidebar.awk awk -f $(srcdir)/sidebar.awk < $(srcdir)/gawktexi.in > gawk.texi -postscript: gawk.ps gawkinet.ps using-git.ps gawk.1.ps $(AWKCARD) +postscript: gawk.ps gawkinet.ps gawkworkflow.ps gawk.1.ps $(AWKCARD) pdf-local: postscript gawk.pdf gawkinet.pdf awkcard.pdf gawk.1.pdf @@ -901,8 +901,8 @@ gawk.ps: gawk.dvi gawkinet.ps: gawkinet.dvi TEXINPUTS=$(srcdir): dvips -o gawkinet.ps gawkinet.dvi -using-git.ps: using-git.dvi - TEXINPUTS=$(srcdir): dvips -o using-git.ps using-git.dvi +gawkworkflow.ps: gawkworkflow.dvi + TEXINPUTS=$(srcdir): dvips -o gawkworkflow.ps gawkworkflow.dvi gawk.1.ps: gawk.1 -groff -man $(srcdir)/gawk.1 > gawk.1.ps @@ -922,10 +922,18 @@ awkcard.nc: $(CARDFILES) awkcard.pdf: awkcard.ps ps2pdf awkcard.ps awkcard.pdf -spell: +spell: spellmanual spell workflow + +spellmanual: + @echo ==== gawktexi.in ====; export LC_ALL=C ; spell "$(srcdir)"/gawktexi.in | \ sort -u | comm -23 - "$(srcdir)"/wordlist +spellworkflow: + @echo ==== gawkworkflow.texi ==== + export LC_ALL=C ; spell "$(srcdir)"/gawkworkflow.texi | \ + sort -u | comm -23 - "$(srcdir)"/wordlist2 + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/doc/gawkworkflow.info b/doc/gawkworkflow.info new file mode 100644 index 00000000..64e13a13 --- /dev/null +++ b/doc/gawkworkflow.info @@ -0,0 +1,1980 @@ +This is gawkworkflow.info, produced by makeinfo version 6.1 from +gawkworkflow.texi. + +Copyright (C) 2017 Free Software Foundation, Inc. + + + This is Edition 0.7 of 'Participating in 'gawk' Development'. + + 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". + + a. The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual." +INFO-DIR-SECTION Text creation and manipulation +START-INFO-DIR-ENTRY +* Gawk Work Flow: (gawkworkflow). Participating in 'gawk' development. +END-INFO-DIR-ENTRY + +INFO-DIR-SECTION Individual utilities +START-INFO-DIR-ENTRY +* Gawk Work Flow: (gawkworkflow)Overview. Participating in 'gawk' development. +END-INFO-DIR-ENTRY + + +File: gawkworkflow.info, Node: Top, Next: Preface, Up: (dir) + +General Introduction +******************** + +This file describes how to participate in software development for GNU +Awk ('gawk') (http://www.gnu.org/software/gawk). + + Copyright (C) 2017 Free Software Foundation, Inc. + + + This is Edition 0.7 of 'Participating in 'gawk' Development'. + + 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". + + a. The FSF's Back-Cover Text is: "You have the freedom to copy and + modify this GNU manual." + +* Menu: + +* Preface:: Some introductory remarks. +* Contributing:: How to contribute to '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 + 'gawk' developer. +* Cheat Sheet:: Git command summary. +* Resources:: Some further resources. +* TODO:: Stuff still to do. +* Index:: The index. + +* 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 '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. + + +File: gawkworkflow.info, Node: Preface, Next: Contributing, Prev: Top, Up: Top + +Preface +******* + +This Info file describes how to participate in development of GNU Awk +('gawk'). GNU Awk is a Free Software project belonging to the Free +Software Foundation's GNU project. + + The Info file 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 Git (http://git-scm.org) distributed +source code management system for '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. + + +File: gawkworkflow.info, Node: This Manual, Next: Conventions, Up: Preface + +Using This Book +=============== + +This Info file has the following chapters and appendices: + + * *note Contributing:: describes how to start contributing to the + 'gawk' project. + + * *note Using Git:: introduces the Git distributed source code + management system. + + * *note Configuring git:: describes some initial set-up you need to + do before using Git seriously. + + * *note 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. + + * *note Development with commit access:: continues the discussion, + covering what's different when you can commit directly to the + Savannah repository. + + * *note General practices:: describes general development practices + used by the 'gawk' development team. + + * *note Repo Maintenance:: presents several different things you need + to know about to keep your repo in good shape. + + * *note Development Stuff:: describes some important points you + should be familiar with in order to participate in 'gawk' + development and presents some tools that may make your work easier. + + * *note Cheat Sheet:: provides a short "cheat sheet" summarizing all + the Git commands referenced in this Info file. + + * *note Resources:: provides a few pointers to Internet resources for + learning more about Git. + + +File: gawkworkflow.info, Node: Conventions, Next: Acknowledgments, Prev: This Manual, Up: Preface + +Typographical Conventions +========================= + +This Info file is written in Texinfo +(http://www.gnu.org/software/texinfo/), the GNU documentation formatting +language. A single Texinfo source file is used to produce both the +printed and online versions of the documentation. This minor node +briefly documents the typographical conventions used in Texinfo. + + Examples you would type at the command line are preceded by the +common shell primary and secondary prompts, '$' and '>'. Input that you +type is shown 'like this'. Output from the command is preceded by the +glyph "-|". 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: + + $ echo hi on stdout + -| hi on stdout + $ echo hello on stderr 1>&2 + error-> hello on stderr + + Characters that you type at the keyboard look 'like this'. In +particular, there are special characters called "control characters." +These are characters that you type by holding down both the 'CONTROL' +key and another key, at the same time. For example, a 'Ctrl-d' is typed +by first pressing and holding the 'CONTROL' key, next pressing the 'd' +key, and finally releasing both keys. + + NOTE: Notes of interest look like this. + + CAUTION: Cautionary or warning notes look like this. + + +File: gawkworkflow.info, Node: Acknowledgments, Next: Reviewers, Prev: Conventions, Up: Preface + +Acknowledgments +=============== + +Thanks to Ju"rgen Kahrs for his initial efforts to write a document like +this. Although his prose has not survived, his material was helpful in +preparing this Info file. + + Thanks to Yehezkel Bernat for reviewing this document and in general +for his good intentions. + + *FIXME:* YOUR NAME HERE... + + +File: gawkworkflow.info, Node: Reviewers, Prev: Acknowledgments, Up: Preface + +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. + + +File: gawkworkflow.info, Node: Contributing, Next: Using Git, Prev: Preface, Up: Top + +1 How to Start Contributing +*************************** + +'gawk' development is distributed. It's done using electronic mail +(email) and via branches in the Git repo(1) on Savannah +(http://savannah.gnu.org), the GNU project's source code management +site. + + In this major node we use some Git terminology. If you're not at all +familiar with Git, then skim this major node and come back after reading +the rest of the Info file. + + 'gawk' is similar to many other Free Software projects. To begin +contributing, simply start! Take a look at the 'TODO' file in the +distribution, see if there is something of interest to you, and ask on +the <bug-gawk@gnu.org> mailing list if anyone else is working on it. If +not, then go for it! (*Note 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 'gawk', +such as code fixes, documentation fixes, and/or new features. + + NOTE: If possible, new features should be done using 'gawk''s + extension mechanism. If you want to add a user-visible language + change to the '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. + + As you complete a task, submit patches for review to the +<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 '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 '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 'master'. + + NOTE: Because of the GNU project's requirements for signed + paperwork for contributions, the 'gawk' project will *not* work + with pull requests from GitHub (http://github.com) 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. + + The <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 web page (https://lists.gnu.org/mailman/listinfo/bug-gawk) and +follow the instructions there. If you plan to be involved long-term +with 'gawk' development, then you probably should subscribe to the list. + + ---------- Footnotes ---------- + + (1) Short for "repository". + + +File: gawkworkflow.info, Node: Using Git, Next: Configuring git, Prev: Contributing, Up: Top + +2 Using Git +*********** + +This chapter provides an introduction to using Git. Our point is _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. + + +File: gawkworkflow.info, Node: Push Pull, Next: Repo Copies, Up: Using Git + +2.1 The "Push/Pull" Model of Software Development +================================================= + +Git is a powerful, distributed source code management system. However, +the way it's used for '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 Concurrent Versions System +(http://www.nongnu.org/cvs) (CVS) or Subversion +(http://subversion.apache.org) (SVN). + + The central idea can be termed "push/pull." You _pull_ updates down +from the central repository to your local copy, and if you have commit +rights, you _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 "merge conflict"), usually it is very easy for you +to "resolve" them and then complete the merge. We talk about this in +more detail later (*note Merge Conflicts::). + + +File: gawkworkflow.info, Node: Repo Copies, Next: Local Branches, Prev: Push Pull, Up: Using Git + +2.2 How Git Stores Branches and Their Copies +============================================ + +So how does Git work?(1) + + A repository consists of a collection of "branches". Each branch +represents the history of a collection of files and directories (a file +"tree"). Each combined set of changes to this collection (files and +directories added or deleted, and/or file contents changed) is termed a +"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 +"upstream", and your local repo is "downstream" from it. Git +distinguishes branches from the upstream repo by prefixing their names +with 'origin/'. Let's draw some pictures. *note Figure 2.1: +savannah-repo. represents the state of the repo on Savannah: + + +======================+ + | Branches | + +======================+ + | master | + +----------------------+ + | gawk-4.1-stable | + +----------------------+ + | gawk-4.0-stable | + +----------------------+ + | feature/fix-comments | + +----------------------+ + | ... | + +----------------------+ + +Figure 2.1: The Savannah 'gawk' Repository + + After you clone the repo, on your local system you will have a single +branch named 'master' that's visible when you use 'git branch' to see +your branches. + + $ git clone http://git.savannah.gnu.org/r/gawk.git Clone the repo + $ cd gawk Change to local copy + $ git branch See branch information + -| * master + +The current branch is always indicated with a leading asterisk ('*'). + + Pictorially, the local repo looks like *note Figure 2.2: your-repo. +(you can ignore the 'T' column for the moment): + + +===+======================++=============================+ + | T | Local Branches || Remote Branches | + +===+======================++=============================+ + | X | master || origin/master | + +---+----------------------++-----------------------------+ + | | || origin/gawk-4.1-stable | + +---+----------------------++-----------------------------+ + | | || origin/gawk-4.0-stable | + +---+----------------------++-----------------------------+ + | | || origin/feature/fix-comments | + +---+----------------------++-----------------------------+ + | | || ... | + +---+----------------------++-----------------------------+ + +Figure 2.2: Your Local 'gawk' Repository + +Note that what is simply 'gawk-4.1-stable' in the upstream repo is now +referred to as 'origin/gawk-4.1-stable'. The '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 '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 Info file.) + + ---------- Footnotes ---------- + + (1) The following description is greatly simplified. + + +File: gawkworkflow.info, Node: Local Branches, Next: Branches are state, Prev: Repo Copies, Up: Using Git + +2.3 Local Branches +================== + +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: + +"Tracking Branches" + 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 + 'origin/' prefix. For example, 'git checkout gawk-4.1-stable'. + + You can then work on this branch, making commitments to it as you + wish. Once things are ready to move upstream, you simply use 'git + push', and your changes will be pushed up to the main repo.(1) + + You should *never* checkout a branch using the 'origin/' prefix. + Things will get very confused. Always work on local tracking + branches. + +"Purely Local Branches" + A "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 'master' (or whichever upstream + branch you started from). + + This may seem somewhat abstract so far. We demonstrate with commands +and branches in *note Development without commit access::, later in this +Info file. + + Let's say you have checked out a copy of 'gawk-4.1-stable' and have +created a purely local branch named 'better-random'. Then our picture +now looks like *note Figure 2.3: your-repo-2, where the 'T' column +indicates a tracking branch. + + +===+======================++=============================+ + | 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 || | + +---+----------------------++-----------------------------+ + +Figure 2.3: Your Local 'gawk' Repository With a Purely Local Branch + + ---------- Footnotes ---------- + + (1) Assuming you have permission to do so, of course. + + +File: gawkworkflow.info, Node: Branches are state, Prev: Local Branches, Up: Using Git + +2.4 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 'gawk' source tree that you should be able to build and test. + + The following minor nodes describe the different branches in the +'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. + + +File: gawkworkflow.info, Node: Repo State, Next: Local State, Up: Branches are state + +2.4.1 Branches in the Savannah Repository +----------------------------------------- + +There are several kinds of branches in the Savannah repository. + +"Dead Branches" + Branches with the prefix 'dead-branches/' (such as + '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. + +"Stable Branches" + These branches are used for bug fixes to released versions of + '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 'gawk-4.1-stable', + 'gawk-4.0-stable', and so on. Once a release has been made from + 'master', the previous stable branch is not updated. For example, + once 'gawk' 4.1.0 was released, no more work was done on + 'gawk-4.0-stable'. + +"The Main Branch" + This is the '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. + +"Feature Branches" + Often, a proposed new feature or code improvement is quite + involved. It may take some time to perfect, or the 'gawk' + development team may not be convinced that the feature should be + kept. + + For this purpose, the team uses branches prefixed with '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 'master', since Git + excels at merging commits from one branch to another. + + +File: gawkworkflow.info, Node: Local State, Next: Remotes, Prev: Repo State, Up: Branches are state + +2.4.2 Branches in Your Local Repository +--------------------------------------- + +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. + + +File: gawkworkflow.info, Node: Remotes, Prev: Local State, Up: Branches are state + +2.4.3 A Closer Look at Branch Naming +------------------------------------ + +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 'git branch -a': + + $ git branch -a + -| gawk-4.1-stable + -| * master + -| remotes/origin/HEAD -> origin/master + -| remotes/origin/dead-branches/async-events + -| ... + -| remotes/origin/feature/api-mpfr + -| remotes/origin/feature/array-iface + -| remotes/origin/feature/fix-comments + -| ... + + You'll note that what we've referred to as 'origin/' branches appear +in the output with an additional prefix: '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 'remotes/' prefix, with +'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; 'gawk' development does not make use of it. The intent of +this node is to explain the output from 'git branch -a', nothing more. + + +File: gawkworkflow.info, Node: Configuring git, Next: Development without commit access, Prev: Using Git, Up: Top + +3 Configuring Global Settings For Git +************************************* + +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. + + You can configure Git using either 'git config', or by editing the +relevant files with your favorite text editor.(1) + + The first things to set are your email address and your real name: + + $ git config --global user.name "J.P. Developer" Set full name + $ git config --global user.email jpdev@example.com Set email address + + Setting these two items are an absolute requirement. *Note*: No +aliases are allowed. If you can't supply your real name, you cannot +contribute to the project. Other options that the 'gawk' maintainer +recommends that you use are: + + $ git config --global push.default=simple Only push current branch + $ git config --global pager.status=true Use pager for output of git status + + The global settings are stored in the '.gitconfig' file in your home +directory. The file looks like this: + + [user] + name = J.P. Developer + email = jpdev@example.com + [push] + default = simple + [pager] + status = true + + The '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 +'git config' to see your settings: + + $ git config --list + -| user.name=J.P. Developer + -| user.email=jpdev@example.com + -| push.default=simple + + Here are the 'gawk' maintainer's settings: + + $ git config --global --list + -| user.name=Arnold D. Robbins + -| user.email=arnold@... + -| credential.helper=cache --timeout=3600 + -| push.default=simple + -| color.ui=false + -| core.autocrlf=input + -| pager.status=true + -| log.decorate=auto + + Additional, per-project ("local") settings are stored in each repo's +'.git/config' file. + + ---------- Footnotes ---------- + + (1) 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. + + +File: gawkworkflow.info, Node: Development without commit access, Next: Development with commit access, Prev: Configuring git, Up: Top + +4 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 '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. + + +File: gawkworkflow.info, Node: Cloning, Next: Switching Branches, Up: Development without commit access + +4.1 Cloning The Repo +==================== + +Clone the Savannah repo using '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. + + To choose which method, you supply a "URL" for the repo when you +clone it, as follows. + + * Clone via the Git native protocol: + + $ git clone git://git.savannah.gnu.org/gawk.git Clone the repo + -| ... + $ cd gawk Start working + + This will be faster, but not all firewalls pass the Git protocol on + through. + + * Clone via the HTTP protocol: + + $ git clone http://git.savannah.gnu.org/r/gawk.git Clone the repo + -| ... + $ cd gawk Start working + + _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: + + $ cd gawk Move to the repo + $ make distclean A good idea before updating + -| ... + $ git pull Update it + + To build, you should generally follow this recipe: + + $ ./bootstrap.sh && ./configure && make -j && make check + + NOTE: Unless you have installed all the tools described in *note + GNU Tools::, you _must_ run './bootstrap.sh' every time you clone a + repo, do a 'git pull' or checkout a different branch. (In the + latter case, do 'make distclean' first.) Otherwise things will get + messy very quickly. The '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. + + +File: gawkworkflow.info, Node: Switching Branches, Next: Starting A New Branch, Prev: Cloning, Up: Development without commit access + +4.2 Switching Branches +====================== + +So far, we've been working in the default 'master' branch. Let's check +what's happening in the 'gawk-4.1-stable' branch: + + $ make distclean Clean up + $ git checkout gawk-4.1-stable Checkout a different branch + -| ... + $ git pull Get up to date + -| ... + $ ./bootstrap.sh && ./configure && make -j && make check Start working + + +File: gawkworkflow.info, Node: Starting A New Branch, Next: Undoing a change, Prev: Switching Branches, Up: Development without commit access + +4.3 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.(1) You should create a new branch +on which to work. First, switch back to 'master': + + $ make distclean + $ git checkout master + + Now, create a new branch. The easiest way to do that is with the +'-b' option to 'git checkout': + + $ git checkout -b feature/python + -| ... + + 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 +'ChangeLog' file with your changes before "committing" them to the repo. + + Let's say you've added a new file 'python.c' and updated several +others. Use 'git status' to see what's changed: + + $ git status + -| ... + + Before committing the current set of changes, you can use 'git diff' +to view the changes. You may also use 'git difftool'(2) to run an +external 'diff' command, such as 'meld' on GNU/Linux: + + $ git diff Regular built-in tool + $ git difftool --tool=meld GUI diff tool + + When you're happy with the changes, use 'git add' to tell Git which +of the changed and/or new files you wish to have ready to be committed: + + $ git add ... + + Use 'git status' to see that your changes are scheduled for +committing: + + $ git status + -| + + Now you can commit your changes to your branch: + + $ git commit + +Running 'git commit' causes Git to invoke an editor (typically from the +'$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 'git log'. + + ---------- Footnotes ---------- + + (1) Just joking. Please don't attempt this for real. + + (2) Don't run 'git difftool' in the background; it works +interactively. + + +File: gawkworkflow.info, Node: Undoing a change, Next: Updating, Prev: Starting A New Branch, Up: Development without commit access + +4.4 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: + + git checkout awkgram.y Undo changes to awkgram.y. There is no output + + To start over completely, use 'git reset --hard'. Note that this +will _throw away_ all your changes, with no chance for recovery, so be +sure you really want to do it. + + +File: gawkworkflow.info, Node: Updating, Next: Submitting Changes, Prev: Undoing a change, Up: Development without commit access + +4.5 Updating and Merging +======================== + +As you work on your branch, you will occasionally want to bring it up to +date with respect to 'master'. This minor node dicusses updating locale +branches and handling merge conflicts. + +* Menu: + +* Rebasing:: Rebasing A Local Branch. +* Merge Conflicts:: Dealing With Merge Conflicts. + + +File: gawkworkflow.info, Node: Rebasing, Next: Merge Conflicts, Up: Updating + +4.5.1 Rebasing A Local Branch +----------------------------- + +For purely local branches, bringing your branch up to date is called +"rebasing", which causes the branch to look _as if_ you had started from +the latest version of 'master'. The steps are as follows: + + $ git checkout master Checkout master + $ git pull Update it + $ git checkout feature/python Move back to new, purely local branch + $ git rebase master "Start over" from current master + + +File: gawkworkflow.info, Node: Merge Conflicts, Prev: Rebasing, Up: Updating + +4.5.2 Dealing With Merge Conflicts +---------------------------------- + +Sometimes, when merging from 'master' into your branch, or from a branch +into 'master', there will be "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, '<<<', '===' and +'>>>'. + + Your mission is then to edit the file and "resolve" the conflict by +fixing the order of additions (such as in a '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 'git +add' and 'git commit': + + $ git checkout feature/python Move back to new, purely local branch + $ git rebase master "Start over" from current master + -| ... Kaboom! Conflict. FIXME: Show real output here + $ gvim main.c Edit the file and fix the problem + $ git add main.c Tell Git everything is OK now ... + $ git commit ... and it's settled + $ git rebase --continue Continue the rebase + + The 'git rebase --continue' then continues the process of rebasing +the current branch that we started in *note Rebasing::. It's not +necessary if you are using 'git merge' (*note Points to remember::). + + +File: gawkworkflow.info, Node: Submitting Changes, Next: Removing Branches, Prev: Updating, Up: Development without commit access + +4.6 Submitting Your Changes +=========================== + +So now your feature is complete. You've added test cases for it to the +test suite(1), you have 'ChangeLog' entries that describe all the +changes(2), you have documented the new feature(3), and everything works +great. You're ready to submit the changes for review, and with any +luck, inclusion into 'gawk'. + + There are two ways to submit your changes for review. + +_Generate a single large patch_ + To do this, simply compare your branch to the branch off which it + is based: + + $ git checkout feature/python + $ git diff master > /tmp/python.diff + + Mail the 'python.diff' file to the appropriate mailing list along + with a description of what you've changed and why. + +_Generate a set of patches that in toto comprise your changes_ + To do this, use 'git format-patch': + + $ git checkout feature/python + $ git format-patch + + 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. + + Either way you choose to submit your changes, the 'gawk' maintainer +and development team will review your changes and provide feedback. If +you have signed paperwork with the FSF for '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 <bug-gawk@gnu.org>. After making enough contributions, +you may be invited to join the private '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. *Note Doing paperwork::, for more +information. + + ---------- Footnotes ---------- + + (1) You did do this, didn't you? + + (2) You remembered this, right? + + (3) You wouldn't neglect this, would you? + + +File: gawkworkflow.info, Node: Removing Branches, Next: Points to remember, Prev: Submitting Changes, Up: Development without commit access + +4.7 Removing Branches +===================== + +Once the maintainer has integrated your changes, you can get rid of your +local branch: + + $ git checkout master Move to upstream branch + $ git pull Update + $ gvim ChangeLog ... Verify your changes are in + $ git branch -d feature/python Remove your local branch + + +File: gawkworkflow.info, Node: Points to remember, Prev: Removing Branches, Up: Development without commit access + +4.8 Points to Remember +====================== + +There are some important points to remember: + + * Always do a 'make distclean' before switching between branches. + Things will get really confused if you don't. + + * For upstream branches, _always_ work with tracking branches. + _Never_ use 'git checkout origin/WHATEVER'. Git will happily let + you do something like that, but it's just plain asking for trouble. + + * 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: + + $ git checkout master Get to local copy + $ git pull Bring it up to date + $ git checkout feature/python Go back to your branch + + You can then do the actual rebase: + + $ git rebase master Now rebase your feature off of master + + * Git always treats the currently checked-out branch as the object of + operations. For example, when comparing files with the regular + 'diff' command, the usage is 'diff OLDFILE NEWFILE'. For 'git + diff', the current branch takes the place of NEWFILE, thus: + + $ git checkout feature/python + $ git diff master Compare master to current branch + + or if merging: + + $ git checkout master Checkout master + $ git pull Update tracking branch + $ git merge feature/python Merge changes into master + + +File: gawkworkflow.info, Node: Development with commit access, Next: General practices, Prev: Development without commit access, Up: Top + +5 Development With Commit Access +******************************** + +This major node describes how to do development when you _do_ have +commit access to the 'gawk' repo on Savannah. + +* Menu: + +* Initial setup:: Getting started with commit access. +* ssh clone:: Cloning using an 'ssh://' URL. +* Developing patches:: Developing patches. +* Developing new features:: Developing new features. +* Developing fixes:: Developing fixes. + + +File: gawkworkflow.info, Node: Initial setup, Next: ssh clone, Up: Development with commit access + +5.1 Initial Setup +================= + +Congratulations! After becoming a quality contributor to 'gawk' +development, you've been invited to join the private development list +and to accept having commit access to the repo. + + The first thing to do is to create an account on Savannah, choosing a +unique user name. To do so, go to the Savannah home page +(http://savannah.gnu.org) and click on the "New User" link. The setup +will include uploading of your '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. + + +File: gawkworkflow.info, Node: ssh clone, Next: Developing patches, Prev: Initial setup, Up: Development with commit access + +5.2 Cloning The Repo With An 'ssh' URL +====================================== + +In order to be able to commit changes to the repo, you must clone it +using an 'ssh://' URL. Cloning the repo with 'ssh' is similar to cloning +with the Git protocol or with HTTP, but the URL is different: + + $ git clone ssh://yourname@git.sv.gnu.org/srv/git/gawk.git + -| ... + + Here, you should replace 'yourname' in the command with the user name +you chose for use on Savannah. + + +File: gawkworkflow.info, Node: Developing patches, Next: Developing new features, Prev: ssh clone, Up: Development with commit access + +5.3 Developing Patches +====================== + +The first part of developing a patch is the same as for developers +without commit access: + + 1. Develop the code and test it. + + 2. Update the 'ChangeLog'. + + 3. If necessary, update the documentation: 'doc/gawktexi.in' and/or + 'doc/gawk.1'. + + 4. Use 'git diff > mychange.diff' to create a patch file. + + 5. Send it to the mailing list for discussion. + + 6. Iterate until the patch is ready to be committed. + + 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 'master'. Here's how to commit your changes: + + $ git diff Review the patch one more time + $ git add ... Add any files for committing + $ git commit Commit the files. Include a commit message. + $ git push Push the files up to the repo. Ta da! + + The first three steps are the same described earlier (*note Starting +A New Branch::). The '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. + + +File: gawkworkflow.info, Node: Developing new features, Next: Developing fixes, Prev: Developing patches, Up: Development with commit access + +5.4 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: + + $ git checkout master Start from master + $ git pull Be sure to be up to date + $ git checkout -b feature/python Create and switch to a new branch + + Now, you can develop as normal, adding new files if necessary (such +as new tests), modifying code, updating the '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: + + $ git diff Review your changes + $ git add ... Add any files for committing + $ git commit Commit the files. Include a commit message + $ git push -u origin feature/python Push the branch up to the repo + + When you use '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. + + _You only need to do 'git push -u origin' once._ As you continue to +work on your branch, the workflow simplifies into this: + + $ git diff Review your changes + $ git add ... Add any files for committing + $ git commit Commit the files + $ git push Push your changes to the branch upstream + + +File: gawkworkflow.info, Node: Developing fixes, Prev: Developing new features, Up: Development with commit access + +5.5 Developing Fixes +==================== + +If you want to make a fix on '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: + + $ git checkout master Move to master + $ git pull Make sure we're up to date with the maintainer + $ gvim ... Make any fixes, compile, test + $ git diff Review your changes + $ git add ... Add any files for committing + $ git commit Commit the files. Include a commit message. + + When you're ready to push your changes: + + $ git pull Download latest version; Git will merge + $ gvim ... Resolve any merge conflicts with git add and git commit + $ git push Now you can push your changes upstream + + *Note Merge Conflicts:: for instructions on dealing with merge +conflicts. + + +File: gawkworkflow.info, Node: General practices, Next: Repo Maintenance, Prev: Development with commit access, Up: Top + +6 General Development Practices +******************************* + +This major node discusses general practices for 'gawk' development. The +discussion here is mainly for developers with commit access to the +Savannah repo. + +"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 'master' and from there to any other branches. + However, you are welcome to save him the time and do this yourself. + +"Directory ownership" + Some developers "own" certain parts of the tree, such as the 'pc' + and '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. + +"New feature development" + Unless you can convince the maintainer (and the other developers!) + otherwise, you should _always_ start branches for new features from + 'master', and not from the current "stable" branch. + + Use 'checkout -b feature/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." + + 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 '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. + +"As long as your branch is purely local" + You should use 'git rebase' to the keep the branch synchronized + with the original branch from which it was forked: + + $ git checkout master Move to master + $ git pull Bring it up to date + $ git checkout feature/python Move to your new feature branch + $ git rebase master Rebase from master + + The rebasing operation may require that you resolve conflicts + (*note Merge Conflicts::). Edit any conflicted files and resolve + the problem(s). Compile and test your changes, then use 'git add' + and 'git commit' to indicate resolution, and then use 'git rebase + --continue' to continue the rebasing. Git is very good about + providing short instructions on how to continue when such conflicts + occur. + +"Once the branch has been pushed up to Savannah" + You _must_ use 'git merge' to bring your feature branch up to date. + That flow looks like this: + + $ git checkout master Move to master + $ git pull Bring it up to date + $ git checkout feature/python Move to your new feature branch + $ git merge master Merge from master + + Here too, you may have to resolve any merge conflicts (*note 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 'master'. But there's really no + magic involved, the merge is simply done in the other direction: + + $ git checkout feature/python Checkout feature branch + $ git pull Bring it up to date + $ git checkout master Checkout master + $ git pull Bring it up to date + $ git merge feature/python Merge from feature/python into master + + If you've been keeping 'feature/python' in sync with 'master', then + there should be no merge conflicts to resolve, and you can push the + result to Savannah: + + $ git push Push up to Savannah + + Since 'feature/python' is no longer needed, it can be gotten rid + of: + + $ git branch -d feature/python Still on master, delete feature branch + $ git push -u origin -d feature/python Delete the branch on Savannah + + The 'git push' command deletes the 'feature/python' branch from the + Savannah repo. + + 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 'git fetch --prune' (*note Repo Maintenance::). + + To update the other remaining development branches with the latest + changes on 'master', use the 'helpers/update-branches.sh' script in + the repo. + + +File: gawkworkflow.info, Node: Repo Maintenance, Next: Development Stuff, Prev: General practices, Up: Top + +7 Keeping Your Repo Organized +***************************** + +There are a few commands you should know about to help keep your local +repo clean. + +_Removing old branches_ + Developers add branches to the Savannah repo and when development + on them is done, they get merged into 'master'. Then the branches + on Savannah are deleted (as shown in *note General practices::). + + However, your local copies of those branches (labelled with the + '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: + + $ git pull Get up to date + $ git branch -d feature/merged-feature Remove tracking branch + + Then, ask Git to clean things up for you: + + $ git fetch --prune Remove unneeded branches + +_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 'git gc' + (short for "garbage collect"). For example: + + $ du -s . Check disk usage + -| 99188 . Almost 10 megabytes + $ git gc Collect garbage + -| Counting objects: 32114, done. + -| Delta compression using up to 4 threads. + -| Compressing objects: 100% (6370/6370), done. + -| Writing objects: 100% (32114/32114), done. + -| Total 32114 (delta 25655), reused 31525 (delta 25231) + $ du -s . Check disk usage again + -| 75168 . Down to 7 megabytes + +_Renaming branches_ + Occasionally you may want to rename a branch.(1) If your branch is + local and you are on it, us: + + $ git branch -m feature/NEW-NAME + + Otherwise, use: + + $ git branch -m feature/OLD-NAME feature/NEW-NAME + + 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: + + $ git push origin :feature/OLD-NAME feature/NEW-NAME + + NOTE: It is the leading ':' in the first branch name that + causes Git to delete the old name in the upstream repo. Don't + omit it! + + Finally, reset the upstream branch for the local branch with the + new name: + + $ git push -u origin feature/NEW-NAME + + ---------- Footnotes ---------- + + (1) This discussion adopted from here +(https://multiplestates.wordpress.com/2015/02/05/rename-a-local-and-remote-branch-in-git). + + +File: gawkworkflow.info, Node: Development Stuff, Next: Cheat Sheet, Prev: Repo Maintenance, Up: Top + +8 Development Stuff +******************* + +This major node discusses other things you need to know and/or do if +you're going to participate seriously in '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. + + +File: gawkworkflow.info, Node: Coding style, Next: Doing paperwork, Up: Development Stuff + +8.1 Coding Style +================ + +You should read the discussion about adding code in the 'gawk' +documentation. *Note Additions: (gawk)Additions, for a discussion of +the general procedure. In particular, pay attention to the coding style +guidelines in *note Adding Code: (gawk)Adding Code.(1) These two +sections may also be found online, at +<https://www.gnu.org/software/gawk/manual/html_node/Additions.html#Additions>, +and +<https://www.gnu.org/software/gawk/manual/html_node/Adding-Code.html#Adding-Code>, +respectively. + + ---------- Footnotes ---------- + + (1) Changes that don't follow the coding style guidelines won't be +accepted. Period. + + +File: gawkworkflow.info, Node: Doing paperwork, Next: Tools, Prev: Coding style, Up: Development Stuff + +8.2 Assigning Copyrights to the FSF +=================================== + +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 _and future_ changes to '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. + + +File: gawkworkflow.info, Node: Tools, Next: Debugging, Prev: Doing paperwork, Up: Development Stuff + +8.3 Software Tools You Will Need +================================ + +This minor node discusses additional tools that you may need to install +on your system in order to be in sync with what the 'gawk' maintainer +uses. It also discusses different C compiler options for use during +code development, and how to compile 'gawk' for debugging. + +* Menu: + +* GNU Tools:: The GNU Autotools. +* Compilers:: A discussion of compilers that can be used. + + +File: gawkworkflow.info, Node: GNU Tools, Next: Compilers, Up: Tools + +8.3.1 GNU Tools +--------------- + +If you expect to work with the configuration files and/or the '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: + +'autoconf' + GNU Autoconf processes the 'configure.ac' files in order to + generate the 'configure' shell script and 'config.h.in' input file. + See the Autoconf home page + (https://www.gnu.org/software/autoconf/autoconf.html) for more + information. + +'automake' + GNU Automake processes the 'configure.ac' and 'Makefile.am' files + to produce 'Makefile.in' files. See the Automake home page + (https://www.gnu.org/software/automake) for more information. + +'gettext' + GNU Gettext processes the 'gawk' source code to produce the + original 'po/gawk.pot' message template file. Normally you should + not need need to do this; the maintainer usually manages this task. + See the Gettext home page (https://www.gnu.org/software/gettext) + for more information. + +'libtool' + GNU Libtool works with Autoconf and Automake to produce portable + shared libraries. It is used for the extensions that ship with + 'gawk', whose code is in the 'extensions' directory. See the + Libtool home page (https://www.gnu.org/software/libtool) for more + information. + +'makeinfo' + The '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. + 'makeinfo' is part of GNU Texinfo. See the Texinfo home page + (https://www.gnu.org/software/texinfo) for more information. + + +File: gawkworkflow.info, Node: Compilers, Prev: GNU Tools, Up: Tools + +8.3.2 Compilers +--------------- + +The default compiler for 'gawk' development is GCC, the GNU Compiler +Collection (https://gcc.gnu.org). 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 'gawk' with it. + + He also attempts to test occasionally with 'clang' +(https://clang.llvm.org/). However, he uses whatever is the default for +his GNU/Linux system, and does _not_ make an effort to build the current +version for testing. + + Both GCC and '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. + +_The Tiny C Compiler, 'tcc'_ + This compiler is _very_ fast, but it produces only mediocre code. + It is capable of compiling 'gawk', and it does so well enough that + '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 'tcc' has missed + something.(1) + + See the project's home page (http://www.tinycc.org) for some + information. More information can be found in the project's Git + repository (http://repo.or.cz/tinycc.git). The maintainer builds + from the 'mob' branch for his work, but after updating it you + should check that this branch still works to compile 'gawk' before + installing it. + +_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 'tcc' but is + slower, although still much faster than GCC and 'clang'. + + See the project's home page (http://pcc.ludd.ltu.se) for more + information. See <http://pcc.ludd.ltu.se/supported-platforms> for + instructions about obtaining the code using CVS and building it. + + An alternative location for the source is the 'gawk' maintainer's + Git mirror (https://github.com/arnoldrobbins/pcc-revived) of the + code. + + ---------- Footnotes ---------- + + (1) This bit the maintainer once. + + +File: gawkworkflow.info, Node: Debugging, Prev: Tools, Up: Development Stuff + +8.4 Compiling For Debugging +=========================== + +If you wish to compile for debugging, you should use GCC. After running +'configure' but before running 'make', edit the 'Makefile' and remove +the '-O2' flag from the definition of 'CFLAGS'. Optionally, do the same +for 'extensions/Makefile'. Then run 'make'. + + You can enable additional debugging code by creating a file named +'.developing' in the 'gawk' source code directory _before_ running +'configure'. Doing so enables additional conditionally-compiled +debugging code within 'gawk', and adds additional warning and debugging +options if compiling with GCC. + + +File: gawkworkflow.info, Node: Cheat Sheet, Next: Resources, Prev: Development Stuff, Up: Top + +Appendix A Git Command Cheat Sheet +********************************** + +This major node provides an alphabetical list of the Git commands cited +in this Info file, along with brief descriptions of what the commands +do. + + Note that you may always use either 'git help COMMAND' or 'git +COMMAND --help' to get short, man-page style help on how to use any +given Git command. + +'git add' + Add a file to the list of files to be committed. + +'git branch' + View existing branches, or delete a branch. Most useful options: + '-a' and '-d'. + +'git checkout' + Checkout an existing branch, create a new branch, or checkout a + file to reset it. Use the '-b' option to create and checkout a new + branch in one operation. + +'git clone' + Clone (make a new copy of) an existing repository. You generally + only need to do this once. + +'git commit' + Commit changes to files which have been staged for committing with + 'git add'. This makes your changes permanent, _in your local + repository only_. To publish your changes to an upstream repo, you + must use 'git push'. + +'git config' + Display and/or change global and/or local configuration settings. + +'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 (*note Configuring + git::). + +'git difftool' + Use a "tool" (usually a GUI-based program) to view differences, + instead of the standard textual diff as you'd get from 'git diff'. + +'git fetch' + Update your local copy of the upstream's branches. That is, update + the various 'origin/' branches. This leaves your local tracking + branches unchanged. With the '--prune' option, this removes any + copies of stale 'origin/' branches. + +'git format-patch' + Create a series of patch files, one per commit not on the original + branch from which you started. + +'git gc' + Run a "garbage collection" pass in the current repository. This + can often reduce the space used in a large repo. For 'gawk' it + does not make that much difference. + +'git help' + Print a man-page-style usage summary for a command. + +'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. + +'git merge' + Merge changes from the named branch into the current one. + +'git pull' + When in your local tracking branch 'XXX', run 'git fetch', and then + merge from 'origin/XXX' into 'XXX'. + +'git push' + Push commits from your local tracking branch 'XXX' through + 'origin/XXX' and on to branch 'XXX' in the upstream repo. Use 'git + push -u origin -d XXX' to delete an upstream branch. (Do so + carefully!) + +'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 '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. + +'git reset' + Restore the original state of the repo, especially with the + '--hard' option. Read up on this command, and use it carefully. + +'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 'git add' to schedule a file for committing. This command also + lists untracked files. + + +File: gawkworkflow.info, Node: Resources, Next: TODO, Prev: Cheat Sheet, Up: Top + +Appendix B Git Resources +************************ + +There are many Git resources available on the Internet. Start at the +Git Project home page (http://git-scm.org). In particular, the 'Pro +Git' book (https://git-scm.com/book/en/v2) is available online. + + See also the Savannah quick introduction to Git +(http://savannah.gnu.org/maintenance/UsingGit). + + +File: gawkworkflow.info, Node: TODO, Next: Index, Prev: Resources, Up: Top + +Appendix C Stuff Still To Do In This Document +********************************************* + + * Fill out all examples with full output + + +File: gawkworkflow.info, Node: Index, Prev: TODO, Up: Top + +Index +***** + + +* Menu: + +* --help option for git: Cheat Sheet. (line 10) +* .developing file: Debugging. (line 11) +* .gitconfig file: Configuring git. (line 27) +* account, Savannah, creation of: Initial setup. (line 10) +* assigning copyright: Doing paperwork. (line 6) +* autoconf: GNU Tools. (line 15) +* automake: GNU Tools. (line 22) +* autotools: GNU Tools. (line 6) +* Bernat, Yehezkel: Acknowledgments. (line 10) +* bootstrap.sh script: Cloning. (line 41) +* branch, main: Repo State. (line 27) +* branch, master: Repo State. (line 27) +* branches, dead: Repo State. (line 8) +* branches, feature: Repo State. (line 35) +* branches, local: Local Branches. (line 6) +* branches, origin/: Repo Copies. (line 68) +* branches, purely local: Local State. (line 6) +* branches, removing: Removing Branches. (line 6) +* branches, removing <1>: Repo Maintenance. (line 9) +* branches, renaming: Repo Maintenance. (line 44) +* branches, stable: Repo State. (line 15) +* branches, tracking: Local Branches. (line 11) +* ChangeLog file: Starting A New Branch. + (line 19) +* ChangeLog file <1>: Developing patches. (line 11) +* changes, submitting for review: Submitting Changes. (line 12) +* clang compiler: Compilers. (line 12) +* coding style: Coding style. (line 6) +* committing changes: Starting A New Branch. + (line 19) +* compilers: Compilers. (line 6) +* compiling for debugging: Debugging. (line 6) +* configuration setting, pager.status: Configuring git. (line 24) +* configuration setting, push.default: Configuring git. (line 24) +* configuration setting, user.email: Configuring git. (line 16) +* configuration setting, user.name: Configuring git. (line 16) +* configuration settings: Configuring git. (line 6) +* configuration settings, global: Configuring git. (line 6) +* configure.ac file: GNU Tools. (line 15) +* conflicts, from merging: Merge Conflicts. (line 6) +* copyright, assignment: Doing paperwork. (line 6) +* cruft, removing: Repo Maintenance. (line 27) +* dead branches: Repo State. (line 8) +* debugging, compiling for: Debugging. (line 6) +* directory ownership: General practices. (line 17) +* documentation files: Developing patches. (line 13) +* email address: Configuring git. (line 14) +* extensions, gawk: GNU Tools. (line 34) +* feature branches: Repo State. (line 35) +* fixes, propagating to other branches: General practices. (line 10) +* gawk.1 manual page: Developing patches. (line 13) +* gawk.pot file: GNU Tools. (line 27) +* gawktexi.in documentation: Developing patches. (line 13) +* GCC, the GNU Compiler Collection: Compilers. (line 6) +* generating a single patch: Submitting Changes. (line 14) +* generating multiple patches: Submitting Changes. (line 24) +* gettext: GNU Tools. (line 27) +* git add: Starting A New Branch. + (line 36) +* git add <1>: Developing patches. (line 26) +* git add <2>: Developing new features. + (line 24) +* git add <3>: Developing new features. + (line 36) +* git add <4>: Developing fixes. (line 10) +* git branch: Repo Copies. (line 38) +* git branch <1>: Removing Branches. (line 9) +* git branch <2>: General practices. (line 88) +* git branch <3>: Repo Maintenance. (line 20) +* git branch command, -a option: Remotes. (line 6) +* git checkout: Local Branches. (line 11) +* git checkout <1>: Switching Branches. (line 9) +* git checkout <2>: Starting A New Branch. + (line 10) +* git checkout <3>: Undoing a change. (line 10) +* git checkout <4>: Rebasing. (line 10) +* git checkout <5>: Submitting Changes. (line 18) +* git checkout <6>: Submitting Changes. (line 27) +* git checkout <7>: Removing Branches. (line 9) +* git checkout <8>: Points to remember. (line 19) +* git checkout <9>: Points to remember. (line 32) +* git checkout <10>: Points to remember. (line 37) +* git checkout <11>: Developing new features. + (line 9) +* git checkout <12>: Developing fixes. (line 10) +* git checkout <13>: General practices. (line 43) +* git checkout <14>: General practices. (line 60) +* git checkout <15>: General practices. (line 73) +* git clone: Repo Copies. (line 42) +* git clone <1>: Cloning. (line 6) +* git clone <2>: ssh clone. (line 10) +* git command, --help option: Cheat Sheet. (line 10) +* git commit: Starting A New Branch. + (line 49) +* git commit <1>: Developing patches. (line 26) +* git commit <2>: Developing new features. + (line 24) +* git commit <3>: Developing new features. + (line 36) +* git commit <4>: Developing fixes. (line 10) +* git config: Configuring git. (line 11) +* git diff: Starting A New Branch. + (line 29) +* git diff <1>: Submitting Changes. (line 18) +* git diff <2>: Points to remember. (line 32) +* git diff <3>: Developing patches. (line 16) +* git diff <4>: Developing patches. (line 26) +* git diff <5>: Developing new features. + (line 24) +* git diff <6>: Developing new features. + (line 36) +* git diff <7>: Developing fixes. (line 10) +* git difftool: Starting A New Branch. + (line 29) +* git fetch: General practices. (line 94) +* git fetch <1>: Repo Maintenance. (line 25) +* git format-patch: Submitting Changes. (line 24) +* git gc: Repo Maintenance. (line 33) +* git help: Cheat Sheet. (line 10) +* git log: Starting A New Branch. + (line 51) +* git merge: Points to remember. (line 37) +* git merge <1>: General practices. (line 60) +* git merge <2>: General practices. (line 73) +* Git Project: Preface. (line 10) +* git pull: Cloning. (line 32) +* git pull <1>: Switching Branches. (line 9) +* git pull <2>: Rebasing. (line 10) +* git pull <3>: Removing Branches. (line 9) +* git pull <4>: Points to remember. (line 19) +* git pull <5>: Points to remember. (line 37) +* git pull <6>: Developing new features. + (line 9) +* git pull <7>: Developing fixes. (line 10) +* git pull <8>: Developing fixes. (line 19) +* git pull <9>: General practices. (line 43) +* git pull <10>: General practices. (line 60) +* git pull <11>: General practices. (line 73) +* git pull <12>: Repo Maintenance. (line 20) +* git push: Local Branches. (line 16) +* git push <1>: Developing patches. (line 26) +* git push <2>: Developing new features. + (line 24) +* git push <3>: Developing new features. + (line 36) +* git push <4>: Developing fixes. (line 19) +* git push <5>: General practices. (line 83) +* git push <6>: General practices. (line 88) +* git rebase: Rebasing. (line 10) +* git rebase <1>: Points to remember. (line 25) +* git rebase <2>: General practices. (line 43) +* git reset: Undoing a change. (line 12) +* git reset, --hard option: Cheat Sheet. (line 93) +* git status: Starting A New Branch. + (line 23) +* git status <1>: Starting A New Branch. + (line 41) +* GitHub: Contributing. (line 57) +* global configuration settings: Configuring git. (line 6) +* GNU autoconf: GNU Tools. (line 15) +* GNU automake: GNU Tools. (line 22) +* GNU gettext: GNU Tools. (line 27) +* GNU libtool: GNU Tools. (line 34) +* GNU makeinfo: GNU Tools. (line 41) +* GNU software tools: GNU Tools. (line 6) +* GNU Texinfo: GNU Tools. (line 41) +* Kahrs, Ju"rgen: Acknowledgments. (line 6) +* libtool: GNU Tools. (line 34) +* local branches: Local Branches. (line 6) +* main branch: Repo State. (line 27) +* Makefile.am file: GNU Tools. (line 22) +* makeinfo: GNU Tools. (line 41) +* master branch: Repo State. (line 27) +* meld utility: Starting A New Branch. + (line 29) +* merge conflicts: Merge Conflicts. (line 6) +* old branches, removing: Repo Maintenance. (line 9) +* origin/ branches: Repo Copies. (line 68) +* ownership of directories: General practices. (line 17) +* pager.status configuration setting: Configuring git. (line 24) +* patch, single, generation of: Submitting Changes. (line 14) +* patches, multiple, generation of: Submitting Changes. (line 24) +* pcc compiler: Compilers. (line 40) +* pcc compiler, Git mirror: Compilers. (line 50) +* Portable C compiler: Compilers. (line 40) +* Pro Git book: Resources. (line 6) +* propagating fixes to other branches: General practices. (line 10) +* purely local branches: Local State. (line 6) +* push.default configuration setting: Configuring git. (line 24) +* rebasing: Rebasing. (line 6) +* removing branches: Removing Branches. (line 6) +* removing cruft: Repo Maintenance. (line 27) +* removing old branches: Repo Maintenance. (line 9) +* renaming branches: Repo Maintenance. (line 44) +* Repository, gawk, URL for: Cloning. (line 13) +* Repository, gawk, URL for <1>: ssh clone. (line 10) +* review, changes you made: Submitting Changes. (line 12) +* Savannah, creating an account: Initial setup. (line 10) +* Savannah, using Git guide: Resources. (line 10) +* settings, configuration: Configuring git. (line 6) +* software tools: Tools. (line 6) +* ssh key: Initial setup. (line 10) +* stable branches: Repo State. (line 15) +* tcc compiler: Compilers. (line 22) +* Texinfo: Conventions. (line 6) +* Texinfo <1>: GNU Tools. (line 41) +* Tiny C compiler: Compilers. (line 22) +* tracking branches: Local Branches. (line 11) +* URL, for cloning repositories: Cloning. (line 10) +* URL, for gawk repository: Cloning. (line 13) +* URL, for gawk repository <1>: ssh clone. (line 10) +* user.email configuration setting: Configuring git. (line 16) +* user.name configuration setting: Configuring git. (line 16) + + + +Tag Table: +Node: Top1102 +Node: Preface5174 +Node: This Manual6070 +Node: Conventions7559 +Node: Acknowledgments9028 +Node: Reviewers9465 +Node: Contributing9786 +Ref: Contributing-Footnote-113141 +Node: Using Git13173 +Node: Push Pull13929 +Node: Repo Copies15344 +Ref: savannah-repo16327 +Ref: your-repo17360 +Ref: Repo Copies-Footnote-119054 +Node: Local Branches19111 +Ref: your-repo-220889 +Ref: Local Branches-Footnote-121970 +Node: Branches are state22028 +Node: Repo State22751 +Node: Local State24871 +Node: Remotes25535 +Node: Configuring git26850 +Ref: Configuring git-Footnote-129203 +Node: Development without commit access29372 +Node: Cloning30374 +Node: Switching Branches32233 +Node: Starting A New Branch32886 +Ref: Starting A New Branch-Footnote-134774 +Ref: Starting A New Branch-Footnote-234832 +Node: Undoing a change34908 +Node: Updating35509 +Node: Rebasing36011 +Node: Merge Conflicts36623 +Node: Submitting Changes38123 +Ref: Submitting Changes-Footnote-140267 +Ref: Submitting Changes-Footnote-240304 +Ref: Submitting Changes-Footnote-340340 +Node: Removing Branches40386 +Node: Points to remember40922 +Node: Development with commit access42599 +Node: Initial setup43244 +Node: ssh clone44032 +Node: Developing patches44629 +Node: Developing new features45965 +Node: Developing fixes47869 +Node: General practices48956 +Node: Repo Maintenance53686 +Ref: Repo Maintenance-Footnote-156455 +Node: Development Stuff56588 +Node: Coding style57151 +Ref: Coding style-Footnote-157809 +Node: Doing paperwork57899 +Node: Tools58694 +Node: GNU Tools59276 +Node: Compilers61437 +Ref: Compilers-Footnote-163931 +Node: Debugging63969 +Node: Cheat Sheet64675 +Node: Resources68356 +Node: TODO68799 +Node: Index69019 + +End Tag Table 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 © 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 diff --git a/doc/using-git.texi b/doc/using-git.texi deleted file mode 100644 index 1812c153..00000000 --- a/doc/using-git.texi +++ /dev/null @@ -1,1179 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header (This is for running Texinfo on a region.) -@setfilename using-git.info -@settitle Workflow in the @command{gawk} project -@c %**end of header (This is for running Texinfo on a region.) - -@dircategory Network applications -@direntry -* Gawkworkflow: (using-git). Workflow in the `gawk' project. -@end direntry - -@iftex -@set DOCUMENT book -@set CHAPTER chapter -@set SECTION section -@set DARKCORNER @inmargin{@image{lflashlight,1cm}, @image{rflashlight,1cm}} -@end iftex -@ifinfo -@set DOCUMENT Info file -@set CHAPTER major node -@set SECTION node -@set DARKCORNER (d.c.) -@end ifinfo -@ifhtml -@set DOCUMENT web page -@set CHAPTER chapter -@set SECTION section -@set DARKCORNER (d.c.) -@end ifhtml - -@set FN file name -@set FFN File Name - -@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 - -@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 - -@smallbook - -@set TITLE Workflow in the @command{gawk} project -@set EDITION 0.0 -@set UPDATE-MONTH August, 2014 -@c gawk versions: -@set VERSION 4.1 -@set PATCHLEVEL 0 - -@copying -This is Edition @value{EDITION} of @cite{@value{TITLE}}, -for the @value{VERSION}.@value{PATCHLEVEL} (or later) version of the GNU -implementation of AWK. -@sp 2 -Copyright (C) 2014, 2015 Free Software Foundation, Inc. -@sp 2 -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'', the Front-Cover -texts being (a) (see below), and with the Back-Cover Texts being (b) -(see 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 - -@ifinfo -This file documents the workflow of the developers in the GNU -@command{awk} project. - -@insertcopying -@end ifinfo - -@setchapternewpage odd - -@titlepage -@title @value{TITLE} -@subtitle Edition @value{EDITION} -@subtitle @value{UPDATE-MONTH} -@author J@"urgen Kahrs -@author with Arnold D. Robbins - -@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 -@sp 2 -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/} @* - -ISBN 1-882114-93-0 @* - -@insertcopying - -@c @sp 2 -@c Cover art by ?????. -@end titlepage - -@iftex -@headings off -@evenheading @thispage@ @ @ @strong{@value{TITLE}} @| @| -@oddheading @| @| @strong{@thischapter}@ @ @ @thispage -@end iftex - -@ifnottex -@node Top -@top Introduction -@comment node-name, next, previous, up - -This file documents the workflow of the developers in the GNU Awk (@command{gawk}) -version 4.1 and later. - -@insertcopying -@end ifnottex - -@menu -* Introduction:: About networking. -* Basics of GIT repositories:: The fundamental environment of - the developer. -* Conventions used in the repository:: How to behave. -* Tutorial for a first-time-gawk-contributor:: How to get started with least - pain. -* FAQs and HOWTOs:: General recipes for daily work. -* Links:: Where to find the stuff - mentioned in this document. -* GNU Free Documentation License:: The license for this document. -* Index:: The index. - -@detailmenu -* Quick Start:: -* Setting up a proper @command{git} repository:: -* Pulling the latest changes from the remote repository:: -* Checking out a feature branch from the remote repository:: -* Semantics of Cloning:: What to - consider - before you - clone. -* Local versus Remote:: Where my - source code - really is. -* Tracking and Merging:: What the - others are - doing. -* master:: -* stable:: -* feature:: -* who does what:: -* step-by-step instructions for a first-time-gawk-contributor:: -* step-by-step instructions for a first-time-gawk-administrator:: -* general recipes for daily work:: -* references and URLs to books and other texts:: -@end detailmenu -@end menu - -@contents - -@node Introduction -@chapter Introduction - -This @value{DOCUMENT} is meant to be a description of the working habits -that were established for collaboration in the GNU Awk project. -Such stuff tends to become rather dry, and to prevent you from getting -bored at this early stage, we will begin this @value{CHAPTER} with a -brief introduction that shows you how to get the -source code of the GNU Awk project compiled on your machine. - -We do this in order to get you motivated to follow us through the later -steps that consist mainly of conceptual considerations. -We hope that (in later, more abstract steps) you will always remember -this down-to-earth introduction, should you ever wonder what all the -later bizarre trickery is good for. - -@menu -* Quick Start:: -* Setting up a proper @command{git} repository:: -* Pulling the latest changes from the remote repository:: -* Checking out a feature branch from the remote repository:: -@end menu - -@node Quick Start -@section Quick Start: Compiling @command{gawk} in 5 Minutes - -The following steps will look familiar to you; they are not that much -different from the steps you used in the old days when you downloaded -a tar ball, extracted it and compiled the source code. It is mainly -the very first step that looks different; instead of downloading the -tar ball you need the tool @command{git}.@footnote{If the command -@command{git} does not exist on your machine, -you need adminstrator privileges to install it. By convention, the -command is usually part of an installation package by the same name.} - -@example -git clone git://git.savannah.gnu.org/gawk.git -cd gawk -git checkout gawk-4.1-stable -./bootstrap.sh -./configure -make -./gawk --version -@end example - -There are two differences to your working habits. In the third step,, -you have to extract (or @dfn{check out}) the @code{gawk-4.1-stable} branch of the current source -code (there are other branches available, that's the point where -things get interesting). - -In the fourth step, you must run the @command{bootstrap.sh} script in -order to set correctly timestamps on various files. Doing this is essential; -it allows you to avoid having to install the correct versions of the -various autotools as used by the @command{gawk} maintainer. - -Isn't this simple? No, it's not that simple. -If you plan to go any further (for example compile the source -code again next week, including next week's latest update), you will -need to know what's going on when you use this seemingly simple -@command{git} command (and that's the point where things get bizarre). - -In the next @value{CHAPTER} you will find a more thorough conceptual -explanation, here we are satisfied with getting to know the practical -steps necessary to get a working environment going that you can use -in your daily work in a reliable way. - -@node Setting up a proper @command{git} repository -@section Setting up a proper @command{git} repository - -After the initial @emph{checkout} you have access to all the source code -files that the maintainers have pushed through the official release procedure. - -You may not have noticed, but each change is well documented and traceable. -This process of tracing the change history is so precise, reproducable and -fine-grained that any dubious change may be kicked out later and the author -of dubious stuff identified by name and change date. - -Some bookkeeping is -necessary for this and that's why you need @command{git}. @command{git} -does all this for you. Developers who have used @command{svn} or -@command{cvs} in the past will not be surprised to hear that each change -is traceable precisely (they know that @command{svn} and @command{cvs} -can do this, too). - -But the first-time user of @command{git} (as well as the @command{svn} user) -may still have failed to notice what he actually did earlier in this @value{CHAPTER}. -It is not just a mere copy of the source code that you created, -it is a full copy of the entire @dfn{upstream} repository server that you created -(or @dfn{cloned}). This means that others could make their own copy of -@emph{your} repository and treat it as @emph{their upstream} repository. - -This is the essential difference between working with @command{svn} and -working with @command{git}: by @emph{cloning} you become a repository -administrator, whether you like it or not. As such you have some duties that -go beyond the duties of an @command{svn} user. For example, you have to -identify yourself properly as the owner of the repository by setting -some global variables identifying you. The global settings will be used -every time you connect again to the upstream repository. - -@smallexample -git config --global user.name "@var{First-Name Last-Name}" -git config --global user.email @var{email@@address.site} -git config --global color.ui auto -@end smallexample - -You may leave these variables unset, but then you are reduced to an -anonymous consumer-only behaviour whenever you connect to the upstream -repository. Later you will learn that there are many other variables -to be set, most of them serving as defaults that can be overridden if -you like. Choosing to work with defaults makes work quick and easy for the most frequent -use cases, but that comes at a cost: With so many helpful defaults -you may be overwhelmed by the detail and complexity of the real inner working. -Here is an example of one of the author's configuration variables: - -@smallexample -$ @kbd{git config --list} -@print{} user.name=First-Name Last-Name -@print{} user.email=email@@address.site -@print{} color.diff=auto -@print{} color.status=auto -@print{} color.branch=auto -@print{} gui.spellingdictionary=en_US -@print{} core.repositoryformatversion=0 -@print{} core.filemode=true -@print{} core.logallrefupdaIsn't this simple? No, it's not that simple. tes=true -@print{} remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* -@print{} remote.origin.url=ssh://jkahrs@@git.sv.gnu.org/srv/git/gawk.git -@print{} branch.master.remote=origin -@print{} branch.master.merge=refs/heads/master -@print{} branch.xgawk_load.remote=origin -@print{} branch.xgawk_load.merge=refs/heads/xgawk_load -@end smallexample - -Changing these variables with specialized variants of the @command{git} command -may seem awkward to you and perhaps you prefer to use your favourite text editor -to overview and change the variables. That's easy: edit the file @file{.git/config}. - -@smallexample -$ @kbd{cat .git/config} -@print{} [core] -@print{} repositoryformatversion = 0 -@print{} filemode = true -@print{} bare = false -@print{} logallrefupdates = true -@print{} [remote "origin"] -@print{} fetch = +refs/heads/*:refs/remotes/origin/* -@print{} url = ssh://jkahrs@@git.sv.gnu.org/srv/git/gawk.git -@print{} [branch "master"] -@print{} remote = origin -@print{} merge = refs/heads/master -@print{} [branch "cmake"] -@print{} remote = origin -@print{} merge = refs/heads/cmake -@end smallexample - -Now you can see how variables are structured group-wise. -But wait, where is the e-mail address in this list of variables? -It is missing in the file @file{.git/config} because that file -contains only the local settings of this one repository -(while there may be others on your machine). -The e-mail address is a variable of a more general kind that -should be stored above all the repositories. -These are referred to as the @dfn{global} variables: - -@smallexample -$ @kbd{git config --list --global} -@print{} user.name=First-Name Last-Name -@print{} user.email=email@@address.site -@print{} color.diff=auto -@print{} color.status=auto -@print{} color.branch=auto -@print{} gui.spellingdictionary=en_US -@end smallexample - -If you wonder whether there is a parameter @command{--local} to list -the local variables, then you should look into the well-structured -man pages of @command{git}. The level of detail may overwhelm you, -but one day you might appreciate it. - -@smallexample -git help config -@end smallexample - -@node Pulling the latest changes from the remote repository -@section Pulling the latest changes from the remote repository - -Whether you set any of these variables or not, sooner or later you will want -to catch up with the changes that happened in the upstream repository. -So, how can you update your copy of the repository and re-build the source code? -The easiest way is to rely on defaults and use the @emph{pull} command to request -updates from the upstream repository: - -@smallexample -git pull -./bootstrap.sh -./configure -make -@end smallexample - -When using the @emph{pull} command, all the changes available in all branches of -the upstream repository will be copied (and merged) into your local repository. -We assume here that we still have the @emph{gawk-4.1-stable} branch checked out (as described earlier) -and we are not interested in changes to other existing branches. -The merging of changes will be done inside the branches only, so that changes in one -branch are kept inside this branch and don't mix up other branches. - -@c ======================================== - -But @emph{what is a branch?} you may wonder. It is the name given to a sequence of changes -that were made to the master branch outside the master branch. -It is easy to look up all the available branches -(the names of the change sequences) in the remote upstream repository. - -@smallexample -$ @kbd{git branch -a} -@print{} * master -@print{} remotes/origin/cmake -@end smallexample - -The asterisk in front of the branch name assures you of the fact that you see -the source files as they are in the @emph{master} branch. - -@node Checking out a feature branch from the remote repository -@section Checking out a feature branch from the remote repository - -It is also easy to -have a look at other branches, for example when you are interested in what is -going on in a certain @emph{feature branch} that the maintainer set up recently -for a new feature to be developed separately (so that others can go on undisturbed). - -@smallexample -$ @kbd{git checkout origin/cmake} -$ @kbd{git branch -a} -@print{} master -@print{} * remotes/origin/cmake -$ @kbd{./bootstrap.sh} -$ @kbd{./configure} -$ @kbd{make} -@end smallexample - -When you try this, take care that you have not changed anything in any source file. -@command{git} would notice changes and refuse to checkout the other branch. -This is meant to protect you from losing any local changes that you forgot to save. -Any source file that is part of the repository and gets generated during the build -in a slightly different way than the original would cause such a problem. - -@smallexample -$ @kbd{git status} -@print{} # On branch master -@print{} # Changes not staged for commit: -@print{} # awkgram.c -@end smallexample - -Here we have @file{awkgram.c} that was generated from @file{awkgram.y}. -But what was generated differently in the file? - -@smallexample -git diff awkgram.c -@end smallexample - -Ok, you are not interested in textual changes to the copyright notice -that are only due to a new calendar year. You are also not interested -in the internals of the generated parser and only wonder -@emph{How do we get back the original file from the repository?} - -@smallexample -$ @kbd{git checkout awkgram.c} -$ @kbd{git diff awkgram.c | wc -l} -@print{} 0 -@end smallexample - -After checking the file out once more, there is obviously no difference -to the copy saved in the repository. But let's not get distracted, we -wanted to find out what was going on in this feature branch. We can -find out by asking @command{git} what has changed in the file @file{ChangeLog} -of this feature branch relative to the master branch. - -@smallexample -git diff origin/master ChangeLog -@end smallexample - -@noindent -This produces: - -@smallexample -diff --git a/ChangeLog b/ChangeLog -index eab657c..a499ec5 100644 ---- a/ChangeLog -+++ b/ChangeLog -@@ -1,81 +1,3 @@ --2014-09-07 Arnold D. Robbins <arnold@@skeeve.com> -- -- * awk.h: Move libsigsegv stuff to ... -- * main.c: here. Thanks to Yehezkel Bernat for motivating -- the cleanup. -- * symbol.c (make_symbol, install, install_symbol): Add const to -- first parameter. Adjust decls and fix up uses. -@end smallexample - -Looks like a minor cleanup operation in the master branch that has not -yet been merged into the feature branch. We still don't know what is new -in this feature branch, how can we know? By looking at all changes that exist. - -@smallexample -$ @kbd{git diff origin/master --numstat} -@print{} 0 78 ChangeLog -@print{} 8 3 README_d/README.cmake -@end smallexample - -On your screen you see a list of all differences between the currently -checked-out branch and the master branch. It tells you the names of the -files that have changed, along with the number of added and deleted lines. -Now we can have a closer look at who changed what. -Let's single out one particular file that looks interesting. -As usual there is a @command{diff} sub-command to list all the changed -lines, but there is also a @command{blame} sub-command that tells you -who made the last change to any of the lines. - -@smallexample -git blame README_d/README.cmake -@end smallexample - -@noindent -This produces (in part): - -@smallexample -2092a35f (Juergen Kahrs 2014-08-12 17:11:20 +0200 1) CMake is a build automation system -2092a35f (Juergen Kahrs 2014-08-12 17:11:20 +0200 2) http://en.wikipedia.org/wiki/Cmake -2092a35f (Juergen Kahrs 2014-08-12 17:11:20 +0200 3) -2092a35f (Juergen Kahrs 2014-08-12 17:11:20 +0200 4) We try to use it as a replacement for the established GNU build system. -2092a35f (Juergen Kahrs 2014-08-12 17:11:20 +0200 5) This attempt is currently only experimental. If you wonder why anyone -2092a35f (Juergen Kahrs 2014-08-12 17:11:20 +0200 6) should do this, read -@end smallexample - -The strange number on the left margin is the short form of a numerical -identifier of the change set. At the moment you can safely ignore it, -but this number is the key you need in case you should ever want to -cherry-pick some change sets. But cherry-picking is still far away, -before you can do this, you have to learn how to make changes to your -local repository and @command{push} them to the upstream repository. -Some conceptual basics are needed for understanding this essential part -of the workflow. - -@node Basics of GIT repositories -@chapter Basics of GIT repositories - -@menu -* Semantics of Cloning:: What to consider before you clone. -* Local versus Remote:: Where my source code really is. -* Tracking and Merging:: What the others are doing. -@end menu - -@c http://iverilog.wikia.com/wiki/Installation_Guide -@c http://www.linuxjournal.com/article/2840 -@c http://git-scm.com/book/en/Git-Branching-Branching-Workflows -@c https://www.atlassian.com/en/git/workflows -@c https://help.github.com/articles/what-is-a-good-git-workflow -@c https://guides.github.com/introduction/flow/index.html -@c http://supercollider.sourceforge.net/wiki/index.php/Developer_cheatsheet_for_git -@c http://savannah.gnu.org/maintenance/UsingGit/ -@c http://www.emacswiki.org/emacs/GitForEmacsDevs - -What is tracking ? - -@display -- How can I use git to contribute source code ? -You need an account at Savannah. Read this to understand the first steps: - http://savannah.gnu.org/maintenance/UsingGit - README.git -Use your account there to register your public ssh key at Savannah. -Then you are ready to checkout. Remember that (when cloning) you are -setting up your own local repository and make sure you configure it -properly. - git clone ssh://my_account_name@@git.sv.gnu.org/srv/git/gawk.git -@end display - -@node Semantics of Cloning -@section Semantics of Cloning - -@node Local versus Remote -@section Local versus Remote - -@node Tracking and Merging -@section Tracking and Merging - -@node Conventions used in the repository -@chapter Conventions used in the repository - -@menu -* master:: -* stable:: -* feature:: -* who does what:: -@end menu - -@node master -@section master - -@node stable -@section stable - -@node feature -@section feature - -@node who does what -@section who does what - -@node Tutorial for a first-time-gawk-contributor -@chapter Tutorial for a first-time-gawk-contributor - -@menu -* step-by-step instructions for a first-time-gawk-contributor:: -* step-by-step instructions for a first-time-gawk-administrator:: -@end menu - -@node step-by-step instructions for a first-time-gawk-contributor -@section step-by-step instructions for a first-time-gawk-contributor - -@node step-by-step instructions for a first-time-gawk-administrator -@section step-by-step instructions for a first-time-gawk-administrator - -@c e-mail from Arnold 2014-08.24 -@c Thanks to Michal for pointing us in the right direction! -@c I see this: -@c -@c bash-4.2$ git config --get push.default -@c simple -@c -@c What does yours say? -@c -@c It appears that "simple" will be the default in version 2.0: -@c -@c From: -@c http://blog.nicoschuele.com/posts/git-2-0-changes-push-default-to-simple -@c -@c Matching -@c -@c The 'matching' option is the default behavior in Git 1.x. It means that if you do a git push without specifying a branch, it will push all your local branches to their matching ones on your remote repository. -@c -@c Simple -@c -@c The new default in Git 2.x is 'simple'. It means that when doing a git push without specifying a branch, only your current branch will be pushed to the one git pull would normally get your code from." -@c -@c So this must explain it. I'll bet yours is set to "matching". I have no -@c idea how mine got set to "simple", since I don't recall doing that. -@c -@c In the future, I will simply make sure to push before switching branches. -@c I think I actually prefer that behavior, since it's more intuitive to me. - - -@node FAQs and HOWTOs -@chapter FAQs and HOWTOs - -@menu -* general recipes for daily work:: -@end menu - -@node general recipes for daily work -@section general recipes for daily work - -@node Links -@chapter Links - -@menu -* references and URLs to books and other texts:: -@end menu - -@node references and URLs to books and other texts -@section references and URLs to books and other texts - -@c The GNU Free Documentation License. -@node GNU Free Documentation License -@unnumbered GNU Free Documentation License -@cindex FDL (Free Documentation License) -@cindex Free Documentation License (FDL) -@cindex GNU Free Documentation License -@center Version 1.3, 3 November 2008 - -@c This file is intended to be included within another document, -@c hence no sectioning command or @node. - -@display -Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. -@uref{http://fsf.org/} - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. -@end display - -@enumerate 0 -@item -PREAMBLE - -The purpose of this License is to make a manual, textbook, or other -functional and useful document @dfn{free} in the sense of freedom: to -assure everyone the effective freedom to copy and redistribute it, -with or without modifying it, either commercially or noncommercially. -Secondarily, this License preserves for the author and publisher a way -to get credit for their work, while not being considered responsible -for modifications made by others. - -This License is a kind of ``copyleft'', which means that derivative -works of the document must themselves be free in the same sense. It -complements the GNU General Public License, which is a copyleft -license designed for free software. - -We have designed this License in order to use it for manuals for free -software, because free software needs free documentation: a free -program should come with manuals providing the same freedoms that the -software does. But this License is not limited to software manuals; -it can be used for any textual work, regardless of subject matter or -whether it is published as a printed book. We recommend this License -principally for works whose purpose is instruction or reference. - -@item -APPLICABILITY AND DEFINITIONS - -This License applies to any manual or other work, in any medium, that -contains a notice placed by the copyright holder saying it can be -distributed under the terms of this License. Such a notice grants a -world-wide, royalty-free license, unlimited in duration, to use that -work under the conditions stated herein. The ``Document'', below, -refers to any such manual or work. Any member of the public is a -licensee, and is addressed as ``you''. You accept the license if you -copy, modify or distribute the work in a way requiring permission -under copyright law. - -A ``Modified Version'' of the Document means any work containing the -Document or a portion of it, either copied verbatim, or with -modifications and/or translated into another language. - -A ``Secondary Section'' is a named appendix or a front-matter section -of the Document that deals exclusively with the relationship of the -publishers or authors of the Document to the Document's overall -subject (or to related matters) and contains nothing that could fall -directly within that overall subject. (Thus, if the Document is in -part a textbook of mathematics, a Secondary Section may not explain -any mathematics.) The relationship could be a matter of historical -connection with the subject or with related matters, or of legal, -commercial, philosophical, ethical or political position regarding -them. - -The ``Invariant Sections'' are certain Secondary Sections whose titles -are designated, as being those of Invariant Sections, in the notice -that says that the Document is released under this License. If a -section does not fit the above definition of Secondary then it is not -allowed to be designated as Invariant. The Document may contain zero -Invariant Sections. If the Document does not identify any Invariant -Sections then there are none. - -The ``Cover Texts'' are certain short passages of text that are listed, -as Front-Cover Texts or Back-Cover Texts, in the notice that says that -the Document is released under this License. A Front-Cover Text may -be at most 5 words, and a Back-Cover Text may be at most 25 words. - -A ``Transparent'' copy of the Document means a machine-readable copy, -represented in a format whose specification is available to the -general public, that is suitable for revising the document -straightforwardly with generic text editors or (for images composed of -pixels) generic paint programs or (for drawings) some widely available -drawing editor, and that is suitable for input to text formatters or -for automatic translation to a variety of formats suitable for input -to text formatters. A copy made in an otherwise Transparent file -format whose markup, or absence of markup, has been arranged to thwart -or discourage subsequent modification by readers is not Transparent. -An image format is not Transparent if used for any substantial amount -of text. A copy that is not ``Transparent'' is called ``Opaque''. - -Examples of suitable formats for Transparent copies include plain -@sc{ascii} without markup, Texinfo input format, La@TeX{} input -format, @acronym{SGML} or @acronym{XML} using a publicly available -@acronym{DTD}, and standard-conforming simple @acronym{HTML}, -PostScript or @acronym{PDF} designed for human modification. Examples -of transparent image formats include @acronym{PNG}, @acronym{XCF} and -@acronym{JPG}. Opaque formats include proprietary formats that can be -read and edited only by proprietary word processors, @acronym{SGML} or -@acronym{XML} for which the @acronym{DTD} and/or processing tools are -not generally available, and the machine-generated @acronym{HTML}, -PostScript or @acronym{PDF} produced by some word processors for -output purposes only. - -The ``Title Page'' means, for a printed book, the title page itself, -plus such following pages as are needed to hold, legibly, the material -this License requires to appear in the title page. For works in -formats which do not have any title page as such, ``Title Page'' means -the text near the most prominent appearance of the work's title, -preceding the beginning of the body of the text. - -The ``publisher'' means any person or entity that distributes copies -of the Document to the public. - -A section ``Entitled XYZ'' means a named subunit of the Document whose -title either is precisely XYZ or contains XYZ in parentheses following -text that translates XYZ in another language. (Here XYZ stands for a -specific section name mentioned below, such as ``Acknowledgements'', -``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' -of such a section when you modify the Document means that it remains a -section ``Entitled XYZ'' according to this definition. - -The Document may include Warranty Disclaimers next to the notice which -states that this License applies to the Document. These Warranty -Disclaimers are considered to be included by reference in this -License, but only as regards disclaiming warranties: any other -implication that these Warranty Disclaimers may have is void and has -no effect on the meaning of this License. - -@item -VERBATIM COPYING - -You may copy and distribute the Document in any medium, either -commercially or noncommercially, provided that this License, the -copyright notices, and the license notice saying this License applies -to the Document are reproduced in all copies, and that you add no other -conditions whatsoever to those of this License. You may not use -technical measures to obstruct or control the reading or further -copying of the copies you make or distribute. However, you may accept -compensation in exchange for copies. If you distribute a large enough -number of copies you must also follow the conditions in section 3. - -You may also lend copies, under the same conditions stated above, and -you may publicly display copies. - -@item -COPYING IN QUANTITY - -If you publish printed copies (or copies in media that commonly have -printed covers) of the Document, numbering more than 100, and the -Document's license notice requires Cover Texts, you must enclose the -copies in covers that carry, clearly and legibly, all these Cover -Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on -the back cover. Both covers must also clearly and legibly identify -you as the publisher of these copies. The front cover must present -the full title with all words of the title equally prominent and -visible. You may add other material on the covers in addition. -Copying with changes limited to the covers, as long as they preserve -the title of the Document and satisfy these conditions, can be treated -as verbatim copying in other respects. - -If the required texts for either cover are too voluminous to fit -legibly, you should put the first ones listed (as many as fit -reasonably) on the actual cover, and continue the rest onto adjacent -pages. - -If you publish or distribute Opaque copies of the Document numbering -more than 100, you must either include a machine-readable Transparent -copy along with each Opaque copy, or state in or with each Opaque copy -a computer-network location from which the general network-using -public has access to download using public-standard network protocols -a complete Transparent copy of the Document, free of added material. -If you use the latter option, you must take reasonably prudent steps, -when you begin distribution of Opaque copies in quantity, to ensure -that this Transparent copy will remain thus accessible at the stated -location until at least one year after the last time you distribute an -Opaque copy (directly or through your agents or retailers) of that -edition to the public. - -It is requested, but not required, that you contact the authors of the -Document well before redistributing any large number of copies, to give -them a chance to provide you with an updated version of the Document. - -@item -MODIFICATIONS - -You may copy and distribute a Modified Version of the Document under -the conditions of sections 2 and 3 above, provided that you release -the Modified Version under precisely this License, with the Modified -Version filling the role of the Document, thus licensing distribution -and modification of the Modified Version to whoever possesses a copy -of it. In addition, you must do these things in the Modified Version: - -@enumerate A -@item -Use in the Title Page (and on the covers, if any) a title distinct -from that of the Document, and from those of previous versions -(which should, if there were any, be listed in the History section -of the Document). You may use the same title as a previous version -if the original publisher of that version gives permission. - -@item -List on the Title Page, as authors, one or more persons or entities -responsible for authorship of the modifications in the Modified -Version, together with at least five of the principal authors of the -Document (all of its principal authors, if it has fewer than five), -unless they release you from this requirement. - -@item -State on the Title page the name of the publisher of the -Modified Version, as the publisher. - -@item -Preserve all the copyright notices of the Document. - -@item -Add an appropriate copyright notice for your modifications -adjacent to the other copyright notices. - -@item -Include, immediately after the copyright notices, a license notice -giving the public permission to use the Modified Version under the -terms of this License, in the form shown in the Addendum below. - -@item -Preserve in that license notice the full lists of Invariant Sections -and required Cover Texts given in the Document's license notice. - -@item -Include an unaltered copy of this License. - -@item -Preserve the section Entitled ``History'', Preserve its Title, and add -to it an item stating at least the title, year, new authors, and -publisher of the Modified Version as given on the Title Page. If -there is no section Entitled ``History'' in the Document, create one -stating the title, year, authors, and publisher of the Document as -given on its Title Page, then add an item describing the Modified -Version as stated in the previous sentence. - -@item -Preserve the network location, if any, given in the Document for -public access to a Transparent copy of the Document, and likewise -the network locations given in the Document for previous versions -it was based on. These may be placed in the ``History'' section. -You may omit a network location for a work that was published at -least four years before the Document itself, or if the original -publisher of the version it refers to gives permission. - -@item -For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve -the Title of the section, and preserve in the section all the -substance and tone of each of the contributor acknowledgements and/or -dedications given therein. - -@item -Preserve all the Invariant Sections of the Document, -unaltered in their text and in their titles. Section numbers -or the equivalent are not considered part of the section titles. - -@item -Delete any section Entitled ``Endorsements''. Such a section -may not be included in the Modified Version. - -@item -Do not retitle any existing section to be Entitled ``Endorsements'' or -to conflict in title with any Invariant Section. - -@item -Preserve any Warranty Disclaimers. -@end enumerate - -If the Modified Version includes new front-matter sections or -appendices that qualify as Secondary Sections and contain no material -copied from the Document, you may at your option designate some or all -of these sections as invariant. To do this, add their titles to the -list of Invariant Sections in the Modified Version's license notice. -These titles must be distinct from any other section titles. - -You may add a section Entitled ``Endorsements'', provided it contains -nothing but endorsements of your Modified Version by various -parties---for example, statements of peer review or that the text has -been approved by an organization as the authoritative definition of a -standard. - -You may add a passage of up to five words as a Front-Cover Text, and a -passage of up to 25 words as a Back-Cover Text, to the end of the list -of Cover Texts in the Modified Version. Only one passage of -Front-Cover Text and one of Back-Cover Text may be added by (or -through arrangements made by) any one entity. If the Document already -includes a cover text for the same cover, previously added by you or -by arrangement made by the same entity you are acting on behalf of, -you may not add another; but you may replace the old one, on explicit -permission from the previous publisher that added the old one. - -The author(s) and publisher(s) of the Document do not by this License -give permission to use their names for publicity for or to assert or -imply endorsement of any Modified Version. - -@item -COMBINING DOCUMENTS - -You may combine the Document with other documents released under this -License, under the terms defined in section 4 above for modified -versions, provided that you include in the combination all of the -Invariant Sections of all of the original documents, unmodified, and -list them all as Invariant Sections of your combined work in its -license notice, and that you preserve all their Warranty Disclaimers. - -The combined work need only contain one copy of this License, and -multiple identical Invariant Sections may be replaced with a single -copy. If there are multiple Invariant Sections with the same name but -different contents, make the title of each such section unique by -adding at the end of it, in parentheses, the name of the original -author or publisher of that section if known, or else a unique number. -Make the same adjustment to the section titles in the list of -Invariant Sections in the license notice of the combined work. - -In the combination, you must combine any sections Entitled ``History'' -in the various original documents, forming one section Entitled -``History''; likewise combine any sections Entitled ``Acknowledgements'', -and any sections Entitled ``Dedications''. You must delete all -sections Entitled ``Endorsements.'' - -@item -COLLECTIONS OF DOCUMENTS - -You may make a collection consisting of the Document and other documents -released under this License, and replace the individual copies of this -License in the various documents with a single copy that is included in -the collection, provided that you follow the rules of this License for -verbatim copying of each of the documents in all other respects. - -You may extract a single document from such a collection, and distribute -it individually under this License, provided you insert a copy of this -License into the extracted document, and follow this License in all -other respects regarding verbatim copying of that document. - -@item -AGGREGATION WITH INDEPENDENT WORKS - -A compilation of the Document or its derivatives with other separate -and independent documents or works, in or on a volume of a storage or -distribution medium, is called an ``aggregate'' if the copyright -resulting from the compilation is not used to limit the legal rights -of the compilation's users beyond what the individual works permit. -When the Document is included in an aggregate, this License does not -apply to the other works in the aggregate which are not themselves -derivative works of the Document. - -If the Cover Text requirement of section 3 is applicable to these -copies of the Document, then if the Document is less than one half of -the entire aggregate, the Document's Cover Texts may be placed on -covers that bracket the Document within the aggregate, or the -electronic equivalent of covers if the Document is in electronic form. -Otherwise they must appear on printed covers that bracket the whole -aggregate. - -@item -TRANSLATION - -Translation is considered a kind of modification, so you may -distribute translations of the Document under the terms of section 4. -Replacing Invariant Sections with translations requires special -permission from their copyright holders, but you may include -translations of some or all Invariant Sections in addition to the -original versions of these Invariant Sections. You may include a -translation of this License, and all the license notices in the -Document, and any Warranty Disclaimers, provided that you also include -the original English version of this License and the original versions -of those notices and disclaimers. In case of a disagreement between -the translation and the original version of this License or a notice -or disclaimer, the original version will prevail. - -If a section in the Document is Entitled ``Acknowledgements'', -``Dedications'', or ``History'', the requirement (section 4) to Preserve -its Title (section 1) will typically require changing the actual -title. - -@item -TERMINATION - -You may not copy, modify, sublicense, or distribute the Document -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense, or distribute it is void, and -will automatically terminate your rights under this License. - -However, if you cease all violation of this License, then your license -from a particular copyright holder is reinstated (a) provisionally, -unless and until the copyright holder explicitly and finally -terminates your license, and (b) permanently, if the copyright holder -fails to notify you of the violation by some reasonable means prior to -60 days after the cessation. - -Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - -Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, receipt of a copy of some or all of the same material does -not give you any rights to use it. - -@item -FUTURE REVISIONS OF THIS LICENSE - -The Free Software Foundation may publish new, revised versions -of the GNU Free Documentation 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. See -@uref{http://www.gnu.org/copyleft/}. - -Each version of the License is given a distinguishing version number. -If the Document specifies that a particular numbered version of this -License ``or any later version'' applies to it, you have the option of -following the terms and conditions either of that specified version or -of any later version that has been published (not as a draft) by the -Free Software Foundation. If the Document does not specify a version -number of this License, you may choose any version ever published (not -as a draft) by the Free Software Foundation. If the Document -specifies that a proxy can decide which future versions of this -License can be used, that proxy's public statement of acceptance of a -version permanently authorizes you to choose that version for the -Document. - -@item -RELICENSING - -``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any -World Wide Web server that publishes copyrightable works and also -provides prominent facilities for anybody to edit those works. A -public wiki that anybody can edit is an example of such a server. A -``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the -site means any set of copyrightable works thus published on the MMC -site. - -``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0 -license published by Creative Commons Corporation, a not-for-profit -corporation with a principal place of business in San Francisco, -California, as well as future copyleft versions of that license -published by that same organization. - -``Incorporate'' means to publish or republish a Document, in whole or -in part, as part of another Document. - -An MMC is ``eligible for relicensing'' if it is licensed under this -License, and if all works that were first published under this License -somewhere other than this MMC, and subsequently incorporated in whole -or in part into the MMC, (1) had no cover texts or invariant sections, -and (2) were thus incorporated prior to November 1, 2008. - -The operator of an MMC Site may republish an MMC contained in the site -under CC-BY-SA on the same site at any time before August 1, 2009, -provided the MMC is eligible for relicensing. - -@end enumerate - -@c fakenode --- for prepinfo -@unnumberedsec ADDENDUM: How to use this License for your documents - -To use this License in a document you have written, include a copy of -the License in the document and put the following copyright and -license notices just after the title page: - -@smallexample -@group - Copyright (C) @var{year} @var{your name}. - 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 no Invariant Sections, no Front-Cover Texts, and no Back-Cover - Texts. A copy of the license is included in the section entitled ``GNU - Free Documentation License''. -@end group -@end smallexample - -If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, -replace the ``with@dots{}Texts.'' line with this: - -@smallexample -@group - with the Invariant Sections being @var{list their titles}, with - the Front-Cover Texts being @var{list}, and with the Back-Cover Texts - being @var{list}. -@end group -@end smallexample - -If you have Invariant Sections without Cover Texts, or some other -combination of the three, merge those two alternatives to suit the -situation. - -If your document contains nontrivial examples of program code, we -recommend releasing these examples in parallel under your choice of -free software license, such as the GNU General Public License, -to permit their use in free software. - -@c Local Variables: -@c ispell-local-pdict: "ispell-dict" -@c End: - - -@node Index -@comment node-name, next, previous, up - -@unnumbered Index -@printindex cp -@bye - -Conventions: -1. Functions, built-in or otherwise, do NOT have () after them. -2. Gawk built-in vars and functions are in @code. Also program vars and - functions. -3. HTTP method names are in @code. -4. Protocols such as echo, ftp, etc are in @samp. -5. URLs are in @url. -6. All RFCs in the index. Put a space between `RFC' and the number. diff --git a/doc/wordlist2 b/doc/wordlist2 new file mode 100644 index 00000000..5d91c81b --- /dev/null +++ b/doc/wordlist2 @@ -0,0 +1,176 @@ +Autoconf +Automake +Awk +Bernat +CFLAGS +ChangeLog +Ctrl +FIXME +FSF +FSF's +Gettext +GitHub +ISBN +Kahrs +Libtool +PCC +PDF +Rebase +Repo +SVN +TODO +Texinfo +UsingGit +Workflow +Yehezkel +ac +api +arnold +arnoldrobbins +async +autoconf +autocrlf +automake +autotools +awk +awkgram +builtin +cd +cindex +com +config +const +cp +cvs +cz +da +detailmenu +dfn +diff +diffs +difftool +dircategory +direntry +distclean +docbook +du +dvi +emph +en +env +evenheading +expandtab +filetype +filll +finalout +fn +gawktexi +gawkworkflow +gc +gcc +gdef +gettext +gitconfig +github +gvim +html +http +https +iface +ifdocbook +ifhtml +ifinfo +ifnotdocbook +ifnothtml +ifnotinfo +ifnottex +ifnotxml +ifplaintext +iftex +ifxml +inlineraw +insertcopying +jpdev +kbd +libtool +lineannotation +linkcolor +listinfo +literallayout +llvm +ltu +ludd +makeinfo +mpfr +multiplestates +mychange +newfile +noindent +nongnu +oddheading +oldfile +org +ourfile +overfulls +para +pc +pcc +po +printindex +pt +pxref +rebase +rebasing +regexp +repo +repo's +samp +scm +se +setchapternewpage +setfilename +settitle +shiftwidth +shorttitlepage +smallbook +smallexample +sp +srv +ssh +stderr +stdout +summarycontents +sv +syncodeindex +synindex +tabstop +tcc +tex +texi +texinfo +thischapter +thispage +titlepage +tmp +toto +ui +ulink +unnumberedsec +upstream's +uref +urefurlonlylinktrue +urgen +url +urlcolor +var +vms +vr +vskip +wordpress +workflow +worthwile +www +xref +xxx +xxxxxx +yourname |