Gnus Coding Style and Maintainance Guide
****************************************

This manual describes ...

Copyright © 2004, 2005, 2007, 2008, 2009  Free Software Foundation, Inc.

     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, 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'' in the Gnus manual.

     (a) The FSF's Back-Cover Text is: ``You have the freedom to copy and modify this GNU manual.  Buying copies from the FSF supports it in developing GNU and promoting software freedom.''

     This document is part of a collection distributed under the GNU Free Documentation License.  If you want to distribute this document separately from the collection, you can do so by adding a copy of the license to the document, as described in section 6 of the license.

Gnus Coding Style
*****************

Dependencies
============

The Gnus distribution contains a lot of libraries that have been written for Gnus and used intensively for Gnus.  But many of those libraries are useful on their own.  E.g. other Emacs Lisp packages might use the MIME library see The Emacs MIME Manual.

General purpose libraries
-------------------------

netrc.el
     .netrc parsing functionality. There are no Gnus dependencies in this file.

format-spec.el
     Functions for formatting arbitrary formatting strings. There are no Gnus dependencies in this file.

hex-util.el
     Functions to encode/decode hexadecimal string. There are no Gnus dependencies in these files.

Encryption and security
-----------------------

encrypt.el
     File encryption routines There are no Gnus dependencies in this file.

password.el
     Read passwords from user, possibly using a password cache. There are no Gnus dependencies in this file.

tls.el
     TLS/SSL support via wrapper around GnuTLS There are no Gnus dependencies in this file.

pgg*.el
     Glue for the various PGP implementations. There are no Gnus dependencies in these files.

sha1.el
     SHA1 Secure Hash Algorithm. There are no Gnus dependencies in these files.

Networking
----------

dig.el
     Domain Name System dig interface. There are no serious Gnus dependencies in this file.  Uses gnus-run-mode-hooks (a wrapper function).

dns.el, dns-mode.el
     Domain Name Service lookups. There are no Gnus dependencies in these files.

Mail and News related RFCs
--------------------------

pop3.el
     Post Office Protocol (RFC 1460) interface. There are no Gnus dependencies in this file.

imap.el
     IMAP library. There are no Gnus dependencies in this file.

ietf-drums.el
     Functions for parsing RFC822bis headers. There are no Gnus dependencies in this file.

rfc1843.el
     HZ (rfc1843) decoding.  HZ is a data format for exchanging files of arbitrarily mixed Chinese and ASCII characters. rfc1843-gnus-setup seem to be useful only for Gnus.  Maybe this function should be relocated to remove dependencies on Gnus.  Other minor dependencies: gnus-newsgroup-name could be eliminated by using an optional argument to rfc1843-decode-article-body.

rfc2045.el
     Functions for decoding rfc2045 headers There are no Gnus dependencies in these files.

rfc2047.el
     Functions for encoding and decoding rfc2047 messages There are no Gnus dependencies in these files. Only a couple of tests for gnusy symbols.

rfc2104.el
     RFC2104 Hashed Message Authentication Codes There are no Gnus dependencies in these files.

rfc2231.el
     Functions for decoding rfc2231 headers There are no Gnus dependencies in these files.

flow-fill.el
     Interpret RFC2646 "flowed" text. There are no Gnus dependencies in this file.

uudecode.el
     Elisp native uudecode. There are no Gnus dependencies in this file.

canlock.el
     Functions for Cancel-Lock feature There are no Gnus dependencies in these files.

message
-------

All message composition from Gnus (both mail and news) takes place in Message mode buffers.  Message mode is intended to be a replacement for Emacs mail mode.  There should be no Gnus dependencies in message.el.  Alas it is not anymore.  Patches and suggestions to remove the dependencies are welcome.

Emacs MIME
----------

The files mml*.el and mm-*.el provide MIME functionality for Emacs.

MML (MIME Meta Language) is supposed to be independent from Gnus.  Alas it is not anymore.  Patches and suggestions to remove the dependencies are welcome.

Gnus backends
-------------

The files nn*.el provide functionality for accessing NNTP (nntp.el), IMAP (nnimap.el) and several other Mail back ends (probably nnml.el, nnfolder.el and nnmaildir.el are the most widely used mail back ends).

Compatibility
=============

No Gnus and Gnus 5.10.10 and up should work on:

  * Emacs 21.1 and up.

  * XEmacs 21.4 and up.

Gnus 5.10.8 and below should work on:

  * Emacs 20.7 and up.

  * XEmacs 21.1 and up.

Gnus Maintainance Guide
***********************

Stable and development versions
===============================

The development of Gnus normally is done on the CVS trunk, i.e. there are no separate branches to develop and test new features.  Most of the time, the trunk is developed quite actively with more or less daily changes.  Only after a new major release, e.g. 5.10.1, there's usually a feature period of several months.  After the release of Gnus 5.10.6 the development of new features started again on the trunk while the 5.10 series is continued on the stable branch (v5-10) from which more stable releases will be done when needed (5.10.8, ...). Gnus Development (The Gnus Newsreader)

Stable releases of Gnus finally become part of Emacs.  E.g. Gnus 5.8 became a part of Emacs 21 (relabeled to Gnus 5.9).  The 5.10 series became part of Emacs 22 as Gnus 5.11.

Syncing
=======

In the past, the inclusion of Gnus into Emacs was quite cumbersome.  For each change made to Gnus in Emacs repository, it had to be checked that it was applied to the new Gnus version, too.  Else, bug fixes done in Emacs repository might have been lost.

With the inclusion of Gnus 5.10, Miles Bader has set up an Emacs-Gnus gateway to ensure the bug fixes from Emacs CVS are propagated to Gnus CVS semi-automatically.  These bug fixes are installed on the stable branch and on the trunk.  Basically the idea is that the gateway will cause all common files in Emacs and Gnus v5-10 to be identical except when there's a very good reason (e.g., the Gnus version string in Emacs says 5.11, but the v5-10 version string remains 5.10.x). Furthermore, all changes in these files in either Emacs or the v5-10 branch will be installed into the Gnus CVS trunk, again except where there's a good reason. Because of this, when the next major version of Gnus will be included in Emacs, it should be very easy -- just plonk in the files from the Gnus trunk without worrying about lost changes from the Emacs tree.

The effect of this is that as hacker, you should generally only have to make changes in one place:

  * If it's a file which is thought of as being outside of Gnus (e.g., the new encrypt.el), you should probably make the change in the Emacs tree, and it will show up in the Gnus tree a few days later.

     If you don't have Emacs CVS access (or it's inconvenient), you can change such a file in the v5-10 branch, and it should propagate to Emacs CVS -- however, it will get some extra scrutiny (by Miles) to see if the changes are possibly controversial and need discussion on the mailing list.  Many changes are obvious bug-fixes however, so often there won't be any problem.

  * If it's to a Gnus file, and it's important enough that it should be part of Emacs and the v5-10 branch, then you can make the change on the v5-10 branch, and it will go into Emacs CVS and the Gnus CVS trunk (a few days later).  The most prominent examples for such changes are bug-fixed including improvements on the documentation.

     If you know that there will be conflicts (perhaps because the affected source code is different in v5-10 and the Gnus CVS trunk), then you can install your change in both places, and when I try to sync them, there will be a conflict -- however, since in most such cases there would be a conflict anyway, it's often easier for me to resolve it simply if I see two identical changes, and can just choose the proper one, rather than having to actually fix the code.

  * For general Gnus development changes, of course you just make the change on the Gnus CVS trunk and it goes into Emacs a few years later... :-)

Of course in any case, if you just can't wait for me to sync your change, you can commit it in more than one place and probably there will be no problem; usually the changes are textually identical anyway, so can be easily resolved automatically (sometimes I notice silly things in such multiple commits, like whitespace differences, and unify those ;-).

Miscellanea
===========

GNUS-NEWS
=========

Starting from No Gnus, the GNUS-NEWS is created from texi/gnus-news.texi.  Don't edit GNUS-NEWS.  Edit texi/gnus-news.texi, type make GNUS-NEWS in the texi directory and commit GNUS-NEWS and texi/gnus-news.texi.

Conventions for version information in defcustoms
=================================================

For new customizable variables introduced in Oort Gnus (including the v5-10 branch) use :version "22.1" ;; Oort Gnus (including the comment) or e.g. :version "22.2" ;; Gnus 5.10.10 if the feature was added for Emacs 22.2 and Gnus 5.10.10. If the variable is new in No Gnus use :version "23.1" ;; No Gnus.

The same applies for customizable variables when its default value was changed.