spam checks done on mx1. While here emphasise SSHv2 is now the only way to connect to project hosts, SSHv1 got turned off.
3110 lines
115 KiB
Text
3110 lines
115 KiB
Text
<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
|
|
<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
|
|
%man;
|
|
|
|
<!ENTITY % freebsd PUBLIC "-//FreeBSD//ENTITIES DocBook Miscellaneous FreeBSD Entities//EN">
|
|
%freebsd;
|
|
|
|
<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN">
|
|
%authors;
|
|
|
|
<!ENTITY % teams PUBLIC "-//FreeBSD//ENTITIES DocBook Team Entities//EN">
|
|
%teams;
|
|
|
|
<!ENTITY % mailing-lists PUBLIC "-//FreeBSD//ENTITIES DocBook Mailing List Entities//EN">
|
|
%mailing-lists;
|
|
|
|
<!ENTITY % trademarks PUBLIC "-//FreeBSD//ENTITIES DocBook Trademark Entities//EN">
|
|
%trademarks;
|
|
]>
|
|
|
|
<article>
|
|
<articleinfo>
|
|
<title>Committer's Guide</title>
|
|
|
|
<authorgroup>
|
|
<author>
|
|
<surname>The FreeBSD Documentation Project</surname>
|
|
</author>
|
|
</authorgroup>
|
|
|
|
<pubdate>$FreeBSD$</pubdate>
|
|
|
|
<copyright>
|
|
<year>1999</year>
|
|
<year>2000</year>
|
|
<year>2001</year>
|
|
<year>2002</year>
|
|
<year>2003</year>
|
|
<year>2004</year>
|
|
<holder>The FreeBSD Documentation Project</holder>
|
|
</copyright>
|
|
|
|
<legalnotice id="trademarks" role="trademarks">
|
|
&tm-attrib.freebsd;
|
|
&tm-attrib.cvsup;
|
|
&tm-attrib.ibm;
|
|
&tm-attrib.intel;
|
|
&tm-attrib.sparc;
|
|
&tm-attrib.general;
|
|
</legalnotice>
|
|
|
|
<abstract>
|
|
<para>This document provides information for the FreeBSD committer
|
|
community. All new committers should read this document before they
|
|
start, and existing committers are strongly encouraged to review it
|
|
from time to time.</para>
|
|
</abstract>
|
|
</articleinfo>
|
|
|
|
<sect1 id="admin">
|
|
<title>Administrative Details</title>
|
|
|
|
<informaltable frame="none" orient="port">
|
|
<tgroup cols="2">
|
|
<tbody>
|
|
<row>
|
|
<entry><emphasis>Main Repository Host</emphasis></entry>
|
|
<entry><hostid role="fqdn">ncvs.FreeBSD.org</hostid></entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><emphasis>Login Methods</emphasis></entry>
|
|
<entry>&man.ssh.1;, protocol 2 only</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><emphasis>Main CVSROOT</emphasis></entry>
|
|
<entry>
|
|
<hostid role="fqdn">ncvs.FreeBSD.org</hostid><literal>:</literal><filename>/home/ncvs</filename> (although also see <xref linkend="cvs.operations">).
|
|
</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><emphasis>Main &a.cvs;</emphasis></entry>
|
|
<entry>&a.peter; and &a.markm;, as well as &a.joe; for
|
|
<filename>ports/</filename></entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><emphasis>Mailing Lists</emphasis></entry>
|
|
<entry>&a.developers;, &a.committers;
|
|
(Both of these are private lists; archives can be found
|
|
in <filename>/home/mail/developers-archive</filename>
|
|
and <filename>/home/mail/committers-archive</filename>
|
|
on the <hostid role="domainname">FreeBSD.org</hostid>
|
|
cluster.)
|
|
</entry>
|
|
</row>
|
|
|
|
|
|
<row>
|
|
<entry><emphasis>Core Team monthly reports</emphasis></entry>
|
|
<entry><filename>/home/core/public/monthly-report</filename>
|
|
on the <hostid role="domainname">FreeBSD.org</hostid> cluster.
|
|
</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><emphasis>Noteworthy CVS Tags</emphasis></entry>
|
|
<entry><literal>RELENG_4</literal> (4.X-STABLE), <literal>HEAD</literal> (-CURRENT)</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
<para>It is required that you use &man.ssh.1; or &man.telnet.1;
|
|
with Kerberos 5 to connect to the project hosts. For
|
|
&man.ssh.1; only protocol 2 is allowed.
|
|
These are generally more secure than plain &man.telnet.1; or
|
|
&man.rlogin.1; since credential negotiation will always be
|
|
encrypted. All traffic is encrypted by default with &man.ssh.1;.
|
|
With utilities like &man.ssh-agent.1; and &man.scp.1; also
|
|
available, &man.ssh.1; is also far more convenient. If you do
|
|
not know anything about &man.ssh.1;, please see
|
|
<xref linkend="ssh.guide">.</para>
|
|
</sect1>
|
|
|
|
<sect1 id="committer.types">
|
|
<title>Commit Bit Types</title>
|
|
|
|
<para>The FreeBSD CVS repository has a number of components which,
|
|
when combined, support the basic operating system source,
|
|
documentation, third party application ports infrastructure, and
|
|
various maintained utilities. When FreeBSD commit bits are
|
|
allocated, the areas of the tree where the bit may be used are
|
|
specified. Generally, the areas associated with a bit reflect who
|
|
authorized the allocation of the commit bit. Additional areas of
|
|
authority may be added at a later date: when this occurs, the
|
|
committer should follow normal commit bit allocation procedures for
|
|
that area of the tree, seeking approval from the appropriate entity
|
|
and possibly getting a mentor for that area for some period of time.
|
|
</para>
|
|
|
|
<informaltable frame="none">
|
|
<tgroup cols="3">
|
|
<tbody>
|
|
<row>
|
|
<entry><emphasis>Committer Type</emphasis></entry>
|
|
<entry><emphasis>Responsible</emphasis></entry>
|
|
<entry><emphasis>Tree Components</emphasis></entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>src</entry>
|
|
<entry>core@</entry>
|
|
<entry>src/, doc/ subject to appropriate review</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>doc</entry>
|
|
<entry>doceng@</entry>
|
|
<entry>doc/, www/, src/ documentation</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>ports</entry>
|
|
<entry>portmgr@</entry>
|
|
<entry>ports/</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
<para>Commit bits allocated prior to the development of the notion of
|
|
areas of authority may be appropriate for use in many parts of the
|
|
tree. However, common sense dictates that a committer who has not
|
|
previously worked in an area of the tree seek review prior to
|
|
committing, seek approval from the appropriate responsible party,
|
|
and/or work with a mentor. Since the rules regarding code
|
|
maintenance differ by area of the tree, this is as much for the
|
|
benefit of the committer working in an area of less familiarity as
|
|
it is for others working on the tree.</para>
|
|
|
|
<para>Committers are encouraged to seek review for their work as part
|
|
of the normal development process, regardless of the area of the
|
|
tree where the work is occurring.</para>
|
|
</sect1>
|
|
|
|
<sect1 id="cvs.operations">
|
|
<title>CVS Operations</title>
|
|
|
|
<para>It is assumed that you are already familiar with the basic operation
|
|
of CVS.</para>
|
|
|
|
<para>The &a.cvs; are the <quote>owners</quote> of the CVS repository and
|
|
are responsible for direct modification of it for the purposes of
|
|
cleanup or fixing some grievous abuse of CVS by a committer.
|
|
Should you cause some repository accident, say a bad <command>cvs
|
|
import</command> or <command>cvs tag</command> operation, mail the &a.cvs;
|
|
(or call one of them) and report the problem to one of them. The only
|
|
ones able to directly fiddle the repository bits on the repository hosts
|
|
are the repomeisters. To enforce this, there are no login shells
|
|
available on the repository machines, except to the repomeisters.</para>
|
|
|
|
<para>The CVS tree is currently split into four distinct repositories,
|
|
namely <literal>doc</literal>, <literal>ports</literal>,
|
|
<literal>projects</literal> and <literal>src</literal>. These are
|
|
combined under a single <literal>CVSROOT</literal> when distributed
|
|
via <application>CVSup</application> for the convenience of our users.</para>
|
|
|
|
<note><para>Note that the <literal>www</literal> module containing sources
|
|
for the <ulink url="http://www.FreeBSD.org">FreeBSD website</ulink> is
|
|
contained within the <literal>doc</literal> repository.</para></note>
|
|
|
|
<para>The CVS repositories are hosted on the repository machines.
|
|
Currently, each of the repositories above reside on the same physical
|
|
machine, <hostid role="hostname">ncvs.FreeBSD.org</hostid>, but to allow for
|
|
the possibility of placing each on a separate machine in the future,
|
|
there is a separate hostname for each that committers should use.
|
|
Additionally, each repository is stored in a separate directory. The
|
|
following table summarises the situation.</para>
|
|
|
|
<table frame="none" id="cvs-repositories-and-hosts">
|
|
<title>&os; CVS Repositories, Hosts and Directories</title>
|
|
|
|
<tgroup cols="3">
|
|
<thead>
|
|
<row>
|
|
<entry>Repository</entry>
|
|
<entry>Host</entry>
|
|
<entry>Directory</entry>
|
|
</row>
|
|
</thead>
|
|
|
|
<tbody>
|
|
<row>
|
|
<entry>doc</entry>
|
|
<entry>dcvs.FreeBSD.org</entry>
|
|
<entry>/home/dcvs</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>ports</entry>
|
|
<entry>pcvs.FreeBSD.org</entry>
|
|
<entry>/home/pcvs</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>projects</entry>
|
|
<entry>projcvs.FreeBSD.org</entry>
|
|
<entry>/home/projcvs</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>src</entry>
|
|
<entry>ncvs.FreeBSD.org</entry>
|
|
<entry>/home/ncvs</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
|
|
<para>CVS operations are done remotely by setting the
|
|
<envar>CVSROOT</envar> environment variable to the appropriate host
|
|
and top-level directory (for example,
|
|
<hostid role="fqdn">ncvs.FreeBSD.org</hostid><literal>:</literal><filename>/home/ncvs</filename>),
|
|
the <envar>CVS_RSH</envar> variable to <command>ssh</command>, and then
|
|
doing the appropriate check-out/check-in operations. Many committers
|
|
define aliases which expand to the correct <application>cvs</application>
|
|
invocation for the appropriate repository. For example, a &man.tcsh.1;
|
|
user may add the following to their <filename>.cshrc</filename> for this
|
|
purpose:</para>
|
|
|
|
<programlisting>alias dcvs env CVS_RSH=ssh cvs -d <replaceable>user</replaceable>@dcvs.FreeBSD.org:/home/dcvs
|
|
alias pcvs env CVS_RSH=ssh cvs -d <replaceable>user</replaceable>@pcvs.FreeBSD.org:/home/pcvs
|
|
alias projcvs env CVS_RSH=ssh cvs -d <replaceable>user</replaceable>@projcvs.FreeBSD.org:/home/projcvs
|
|
alias scvs env CVS_RSH=ssh cvs -d <replaceable>user</replaceable>@ncvs.FreeBSD.org:/home/ncvs</programlisting>
|
|
|
|
<para>This way they can do all CVS operations
|
|
locally and use <command><replaceable>X</replaceable>cvs commit</command> for committing
|
|
to the official CVS tree. If you wish to add
|
|
something which is wholly new (like contrib-ified
|
|
sources, etc), <command>cvs import</command> should be used.
|
|
Refer to the &man.cvs.1; manual page for usage.</para>
|
|
|
|
<note>
|
|
<para>Please do <emphasis>not</emphasis> use
|
|
<command>cvs checkout</command> or
|
|
<command>update</command> with the official repository machine set
|
|
as the CVS Root for keeping your source tree up to date.
|
|
Remote CVS is not optimized for network distribution
|
|
and requires a big work/administrative overhead on the server side.
|
|
Please use our advanced <command>cvsup</command> distribution
|
|
method for obtaining the repository bits, and only do the actual
|
|
<command>commit</command> operation on the repository host.
|
|
We provide an extensive cvsup replication network for this purpose,
|
|
as well as give access to <hostid>cvsup-master</hostid> if you
|
|
really need to stay current to the latest changes.
|
|
<hostid>cvsup-master</hostid> has got the horsepower to deal with
|
|
this, the repository master server does not. &a.kuriyama; is in
|
|
charge of <hostid>cvsup-master</hostid>.
|
|
</para>
|
|
</note>
|
|
|
|
<para>If you need to use CVS <command>add</command> and
|
|
<command>delete</command> operations in a manner that is
|
|
effectively a &man.mv.1; operation, then a repository
|
|
copy is in order rather than using CVS <command>add</command> and
|
|
<command>delete</command>. In a repository copy, a <link
|
|
linkend="conventions">CVS Meister</link> will copy the file(s)
|
|
to their new name and/or location and let you know when it is
|
|
done. The purpose of a repository copy is to preserve file
|
|
change history, or logs. We in the FreeBSD Project greatly
|
|
value the change history that CVS gives to the project.</para>
|
|
|
|
<para>CVS reference information, tutorials, and FAQs can be found at:
|
|
<ulink url="http://www.cvshome.org/docs/"></ulink>.
|
|
The information in <ulink url="http://cvsbook.red-bean.com/cvsbook.html">Karl Fogel's
|
|
chapters from <quote>Open Source Development with CVS</quote></ulink> is also very
|
|
useful.</para>
|
|
|
|
<para>&a.des; also supplied the following <quote>mini primer</quote> for
|
|
CVS.</para>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para>Check out a module with the <command>co</command> or
|
|
<command>checkout</command> command.</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs checkout shazam</userinput></screen>
|
|
|
|
<para>This checks out a copy of the <filename>shazam</filename> module. If
|
|
there is no <filename>shazam</filename> module in the modules file, it looks for a
|
|
top-level directory named <filename>shazam</filename> instead.</para>
|
|
|
|
<table frame="none">
|
|
<title>Useful <command>cvs checkout</command> options</title>
|
|
|
|
<tgroup cols=2>
|
|
<tbody>
|
|
<row>
|
|
<entry><option>-P</option></entry>
|
|
<entry>Do not create empty directories</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><option>-l</option></entry>
|
|
<entry>Check out a single level, no subdirectories</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><option>-r<replaceable>rev</replaceable></option></entry>
|
|
<entry>Check out revision, branch or tag
|
|
<replaceable>rev</replaceable></entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><option>-D<replaceable>date</replaceable></option></entry>
|
|
<entry>Check out the sources as they were on date
|
|
<replaceable>date</replaceable></entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
|
|
<para>Practical FreeBSD examples:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>Check out the <filename>miscfs</filename> module,
|
|
which corresponds to <filename>src/sys/miscfs</filename>:</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs co miscfs</userinput></screen>
|
|
|
|
<para>You now have a directory named <filename>miscfs</filename>
|
|
with subdirectories <filename>CVS</filename>,
|
|
<filename>deadfs</filename>, <filename>devfs</filename>, and so
|
|
on. One of these (<filename>linprocfs</filename>) is
|
|
empty.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Check out the same files, but with full path:</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs co src/sys/miscfs</userinput></screen>
|
|
|
|
<para>You now have a directory named <filename>src</filename>,
|
|
with subdirectories <filename>CVS</filename> and
|
|
<filename>sys</filename>. The <filename>src/sys</filename> directory has
|
|
subdirectories <filename>CVS</filename> and
|
|
<filename>miscfs</filename>, etc.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Check out the same files, but prunes empty
|
|
directories:</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs co -P miscfs</userinput></screen>
|
|
|
|
<para>You now have a directory named
|
|
<filename>miscfs</filename> with subdirectories
|
|
<filename>CVS</filename>, <filename>deadfs</filename>,
|
|
<filename>devfs</filename>... but note that there is no
|
|
<filename>linprocfs</filename> subdirectory, because there
|
|
are no files in it.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Check out the directory <filename>miscfs</filename>, but
|
|
none of the subdirectories:</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs co -l miscfs</userinput></screen>
|
|
|
|
<para>You now have a directory named <filename>miscfs</filename>
|
|
with just one subdirectory named
|
|
<filename>CVS</filename>.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Check out the <filename>miscfs</filename> module as
|
|
it is in the 4.X branch:</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs co -rRELENG_4 miscfs</userinput></screen>
|
|
|
|
<para>You can modify the sources and commit along this
|
|
branch.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Check out the <filename>miscfs</filename> module as
|
|
it was in 3.4-RELEASE.</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs co -rRELENG_3_4_0_RELEASE miscfs</userinput></screen>
|
|
|
|
<para>You will not be able to commit modifications, since
|
|
<literal>RELENG_3_4_0_RELEASE</literal> is a point in time, not a branch.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Check out the <filename>miscfs</filename> module as it was
|
|
on Jan 15 2000.</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs co -D'01/15/2000' miscfs</userinput></screen>
|
|
|
|
<para>You will not be able to commit modifications.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Check out the <filename>miscfs</filename> module as it was
|
|
one week ago.</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs co -D'last week' miscfs</userinput></screen>
|
|
|
|
<para>You will not be able to commit modifications.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>Note that cvs stores metadata in subdirectories named
|
|
<filename>CVS</filename>.</para>
|
|
|
|
<para>Arguments to <option>-D</option> and <option>-r</option>
|
|
are sticky, which means cvs will remember them later, e.g.
|
|
when you do a <command>cvs update</command>.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Check the status of checked-out files with the
|
|
<command>status</command> command.</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs status shazam</userinput></screen>
|
|
|
|
<para>This displays the status of the
|
|
file <filename>shazam</filename> or of every file in the
|
|
<filename>shazam</filename> directory. For every file, the
|
|
status is given as one of:</para>
|
|
|
|
<informaltable frame="none">
|
|
<tgroup cols=2>
|
|
<tbody>
|
|
<row>
|
|
<entry>Up-to-date</entry>
|
|
<entry>File is up-to-date and unmodified.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>Needs Patch</entry>
|
|
<entry>File is unmodified, but there is a newer revision in
|
|
the repository.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>Locally Modified</entry>
|
|
<entry>File is up-to-date, but modified.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>Needs Merge</entry>
|
|
<entry>File is modified, and there is a newer revision in the
|
|
repository.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry>File had conflicts on merge</entry>
|
|
<entry>There were conflicts the last time this file was
|
|
updated, and they have not been resolved yet.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
<para>You will also see the local revision and date,
|
|
the revision number of the newest applicable version
|
|
(<quote>newest applicable</quote> because if you have a
|
|
sticky date, tag or branch, it may not be the actual newest
|
|
revision), and any sticky tags, dates or options.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Once you have checked something out, you can update it with the
|
|
<command>update</command> command.</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs update shazam</userinput></screen>
|
|
|
|
<para>This updates the file <filename>shazam</filename> or the
|
|
contents of the <filename>shazam</filename> directory to the
|
|
latest version along the branch you checked out. If you
|
|
checked out a <quote>point in time</quote>, does nothing
|
|
unless the tags have moved in the repository or some other weird
|
|
stuff is going on.</para>
|
|
|
|
<para>Useful options, in addition to those listed above for
|
|
<command>checkout</command>:</para>
|
|
|
|
<informaltable frame="none">
|
|
<tgroup cols=2>
|
|
<tbody>
|
|
<row>
|
|
<entry><option>-d</option></entry>
|
|
<entry>Check out any additional missing directories.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><option>-A</option></entry>
|
|
<entry>Update to head of main branch.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><option>-j<replaceable>rev</replaceable></option></entry>
|
|
<entry>More magic (see below).</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
<para>If you checked out a module with <option>-r</option> or
|
|
<option>-D</option>, running <command>cvs update</command>
|
|
with a different <option>-r</option> or <option>-D</option>
|
|
argument or with <option>-A</option> will select a new branch,
|
|
revision or date. The <option>-A</option> option clears all
|
|
sticky tags, dates or revisions whereas <option>-r</option>
|
|
and <option>-D</option> set new ones.</para>
|
|
|
|
<para>Theoretically, specifying <literal>HEAD</literal> as the
|
|
argument to <option>-r</option> will give you the same result
|
|
as <option>-A</option>, but that is just theory.</para>
|
|
|
|
<para>The <option>-d</option> option is useful if:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>somebody has added subdirectories to the module
|
|
you have checked out after you checked it out.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>you checked out with <option>-l</option>, and later
|
|
change your mind and want to check out the subdirectories
|
|
as well.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>you deleted some subdirectories and want to check
|
|
them all back out.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para><emphasis>Watch the output of the <command>cvs
|
|
update</command> with care.</emphasis> The letter in front of
|
|
each filename indicates what was done with it:</para>
|
|
|
|
<informaltable frame="none">
|
|
<tgroup cols=2>
|
|
<tbody>
|
|
<row>
|
|
<entry><literal>U</literal></entry>
|
|
<entry>The file was updated without trouble.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>P</literal></entry>
|
|
<entry>The file was updated without trouble (you will only see
|
|
this when working against a remote repository).</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>M</literal></entry>
|
|
<entry>The file had been modified, and was merged without
|
|
conflicts.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>C</literal></entry>
|
|
<entry>The file had been modified, and was merged with
|
|
conflicts.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
<para>Merging is what happens if you check out a copy of
|
|
some source code, modify it, then someone else commits a
|
|
change, and you run <command>cvs update</command>. CVS notices
|
|
that you have made local changes, and tries to merge your
|
|
changes with the changes between the version you originally
|
|
checked out and the one you updated to. If the changes are to
|
|
separate portions of the file, it will almost always work fine
|
|
(though the result might not be syntactically or semantically
|
|
correct).</para>
|
|
|
|
<para>CVS will print an <literal>M</literal> in front of every locally modified
|
|
file even if there is no newer version in the repository, so
|
|
<command>cvs update</command> is handy for getting a summary
|
|
of what you have changed locally.</para>
|
|
|
|
<para>If you get a <literal>C</literal>, then your changes
|
|
conflicted with the changes in the repository (the changes
|
|
were to the same lines, or neighboring lines, or you changed
|
|
the local file so much that <command>cvs</command> can not
|
|
figure out how to apply the repository's changes). You will have
|
|
to go through the file manually and resolve the conflicts;
|
|
they will be marked with rows of <literal><</literal>,
|
|
<literal>=</literal> and <literal>></literal> signs. For
|
|
every conflict, there will be a marker line with seven
|
|
<literal><</literal> signs and the name of the file,
|
|
followed by a chunk of what your local file contained,
|
|
followed by a separator line with seven <literal>=</literal>
|
|
signs, followed by the corresponding chunk in the
|
|
repository version, followed by a marker line with seven
|
|
<literal>></literal> signs and the revision number you
|
|
updated to.</para>
|
|
|
|
<para>The <option>-j</option> option is slightly voodoo. It
|
|
updates the local file to the specified revision as if you
|
|
used <option>-r</option>, but it does not change the recorded
|
|
revision number or branch of the local file. It is not really
|
|
useful except when used twice, in which case it will merge the
|
|
changes between the two specified versions into the working
|
|
copy.</para>
|
|
|
|
<para>For instance, say you commit a change to
|
|
<filename>shazam/shazam.c</filename> in &os.current; and later
|
|
want to MFC it. The change you want to MFC was revision
|
|
1.15:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>Check out the &os.stable; version of the
|
|
<filename>shazam</filename> module:</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs co -rRELENG_4 shazam</userinput></screen>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Apply the changes between rev 1.14 and 1.15:</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs update -j1.14 -j1.15 shazam/shazam.c</userinput></screen>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>You will almost certainly get a conflict because
|
|
of the <literal>$Id: article.sgml,v 1.186 2004-04-05 14:57:08 kensmith Exp $</literal> (or in FreeBSD's case,
|
|
<literal>$<!-- stop expansion -->FreeBSD<!-- stop expansion -->$</literal>)
|
|
lines, so you will have to edit the file to resolve the conflict
|
|
(remove the marker lines and the second <literal>$Id: article.sgml,v 1.186 2004-04-05 14:57:08 kensmith Exp $</literal> line,
|
|
leaving the original <literal>$Id: article.sgml,v 1.186 2004-04-05 14:57:08 kensmith Exp $</literal> line intact).</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>View differences between the local version and the
|
|
repository version with the <command>diff</command>
|
|
command.</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs diff shazam</userinput></screen>
|
|
|
|
<para>shows you every modification you have made to the
|
|
<filename>shazam</filename> file or module.</para>
|
|
|
|
<table frame="none">
|
|
<title>Useful <command>cvs diff</command> options</title>
|
|
|
|
<tgroup cols=2>
|
|
<tbody>
|
|
<row>
|
|
<entry><option>-u</option></entry>
|
|
<entry>Uses the unified diff format.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><option>-c</option></entry>
|
|
<entry>Uses the context diff format.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><option>-N</option></entry>
|
|
<entry>Shows missing or added files.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
|
|
<para>You always want to use <option>-u</option>, since
|
|
unified diffs are much easier to read than almost any other
|
|
diff format (in some circumstances, context diffs generated with
|
|
the <option>-c</option> option may be
|
|
better, but they are much bulkier). A unified diff consists of
|
|
a series of hunks. Each hunk begins with a line that starts
|
|
with two <literal>@</literal> signs and specifies where in the
|
|
file the differences are and how many lines they span. This
|
|
is followed by a number of lines; some (preceded by a blank)
|
|
are context; some (preceded by a <literal>-</literal> sign)
|
|
are outtakes and some (preceded by a <literal>+</literal>) are
|
|
additions.</para>
|
|
|
|
<para>You can also diff against a different version
|
|
than the one you checked out by specifying a version
|
|
with <option>-r</option> or <option>-D</option> as in
|
|
<command>checkout</command> or <command>update</command>,
|
|
or even view the diffs between two arbitrary versions
|
|
(without regard for what you have locally) by specifying
|
|
<emphasis>two</emphasis> versions with <option>-r</option> or
|
|
<option>-D</option>.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>View log entries with the <command>log</command>
|
|
command.</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs log shazam</userinput></screen>
|
|
|
|
<para>If <filename>shazam</filename> is a file, this will print a
|
|
<emphasis>header</emphasis> with information about this file, such
|
|
as where in the repository this file is stored, which revision is
|
|
the <literal>HEAD</literal> for this file, what branches this file
|
|
is in, and any tags that are valid for this file. Then, for each
|
|
revision of this file, a log message is printed. This includes
|
|
the date and time of the commit, who did the commit, how many lines
|
|
were added and/or deleted, and finally the log message that the
|
|
committer who did the change wrote.</para>
|
|
|
|
<para>If <filename>shazam</filename> is a directory, then the log
|
|
information described above is printed for each file in the
|
|
directory in turn. Unless you give the <option>-l</option> to
|
|
<command>log</command>, the log for all subdirectories of
|
|
<filename>shazam</filename> is printed too, in a recursive
|
|
manner.</para>
|
|
|
|
<para>Use the <command>log</command> command to view the history of
|
|
one or more files, as it is stored in the CVS repository. You can
|
|
even use it to view the log message of a specific revision, if you
|
|
add the <option>-r<replaceable>rev</replaceable></option> to the
|
|
<command>log</command> command:</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs log -r1.2 shazam</userinput></screen>
|
|
|
|
<para>This will print only the log message for revision
|
|
<literal>1.2</literal> of file <filename>shazam</filename> if it is
|
|
a file, or the log message for revision <literal>1.2</literal> of
|
|
each file under <filename>shazam</filename> if it is a
|
|
directory.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>See who did what with the <command>annotate</command> command.
|
|
This command shows you each line of the specified file or
|
|
files, along with which user most recently changed that
|
|
line.</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs annotate shazam</userinput></screen>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Add new files with the <command>add</command> command.</para>
|
|
|
|
<para>Create the file, <command>cvs add</command> it, then
|
|
<command>cvs commit</command> it.</para>
|
|
|
|
<para>Similarly, you can add new directories by creating them
|
|
and then <command>cvs add</command>ing them. Note that you
|
|
do not need to commit directories.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Remove obsolete files with the <command>remove</command> command.</para>
|
|
|
|
<para>Remove the file, then <command>cvs rm</command> it, then
|
|
<command>cvs commit</command> it.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Commit with the <command>commit</command> or
|
|
<command>checkin</command> command.</para>
|
|
|
|
<table frame="none">
|
|
<title>Useful <command>cvs commit</command> options</title>
|
|
|
|
<tgroup cols=2>
|
|
<tbody>
|
|
<row>
|
|
<entry><option>-f</option></entry>
|
|
<entry>Force a commit of an unmodified file.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><option>-m<replaceable>msg</replaceable></option></entry>
|
|
<entry>Specify a commit message on the command line rather
|
|
than invoking an editor.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</table>
|
|
|
|
<para>Use the <option>-f</option> option if you realize that
|
|
you left out important information from the commit message.</para>
|
|
|
|
<para>Good commit messages are important. They tell others
|
|
why you did the changes you did, not just right here and now,
|
|
but months or years from now when someone wonders why some
|
|
seemingly illogical or inefficient piece of code snuck into
|
|
your source file. It is also an invaluable aid to deciding
|
|
which changes to MFC and which not to MFC.</para>
|
|
|
|
<para>Commit messages should be clear, concise and provide
|
|
a reasonable summary to give an indication of what was
|
|
changed and why.</para>
|
|
|
|
<para>Commit messages should provide enough information to
|
|
enable a third party to decide if the change is relevant to
|
|
them and if they need to read the change itself.</para>
|
|
|
|
<para>Avoid committing several unrelated changes in one go. It
|
|
makes merging difficult, and also makes it harder to determine
|
|
which change is the culprit if a bug crops up.</para>
|
|
|
|
<para>Avoid committing style or whitespace fixes and
|
|
functionality fixes in one go. It makes merging difficult,
|
|
and also makes it harder to understand just what functional
|
|
changes were made. In the case of documentation files, it
|
|
can make the job of the translation teams more complicated,
|
|
as it becomes difficult for them to determine exactly what
|
|
content changes need to be translated.</para>
|
|
|
|
<para>Avoid committing changes to multiple files in one go
|
|
with a generic, vague message. Instead, commit each file (or
|
|
small, related groups of files) with tailored commit messages.</para>
|
|
|
|
<para>Before committing, <emphasis>always</emphasis>:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>verify which branch you are committing to, using
|
|
<command>cvs status</command>.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>review your diffs, using
|
|
<command>cvs diff</command></para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>Also, ALWAYS specify which files to commit explicitly on
|
|
the command line, so you do not accidentally commit other files
|
|
than the ones you intended - <command>cvs commit</command>
|
|
without any arguments will commit every modification in your
|
|
current working directory and every subdirectory.</para>
|
|
</listitem>
|
|
</orderedlist>
|
|
|
|
<para>Additional tips and tricks:</para>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
|
|
<para>You can place commonly used options in your
|
|
<filename>~/.cvsrc</filename>, like this:</para>
|
|
|
|
<programlisting>cvs -z3
|
|
diff -Nu
|
|
update -Pd
|
|
checkout -P</programlisting>
|
|
|
|
<para>This example says:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>always use compression level 3 when talking to a
|
|
remote server. This is a life-saver when working over a
|
|
slow connection.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>always use the <option>-N</option> (show added or
|
|
removed files) and <option>-u</option> (unified diff
|
|
format) options to &man.diff.1;.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>always use the <option>-P</option> (prune empty
|
|
directories) and <option>-d</option> (check out new
|
|
directories) options when updating.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>always use the <option>-P</option> (prune empty
|
|
directories) option when checking out.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Use Eivind Eklund's <command>cdiff</command> script to
|
|
view unidiffs. It is a wrapper for &man.less.1; that adds ANSI
|
|
color codes to make hunk headers, outtakes and additions stand
|
|
out; context and garbage are unmodified. It also expands tabs
|
|
properly (tabs often look wrong in diffs because of the extra
|
|
character in front of each line).</para>
|
|
|
|
<para><ulink url="http://people.FreeBSD.org/~eivind/cdiff"></ulink></para>
|
|
|
|
<para>Simply use it instead of &man.more.1; or &man.less.1;:</para>
|
|
|
|
<screen>&prompt.user; <userinput>cvs diff -Nu shazam | cdiff</userinput></screen>
|
|
|
|
<para>Alternatively some editors like &man.vim.1;
|
|
(<filename role="package">editors/vim5</filename>) have color support and when used as
|
|
a pager with color syntax highlighting switched on will
|
|
highlight many types of file, including diffs, patches,
|
|
and CVS/RCS logs. </para>
|
|
|
|
<screen>&prompt.user; <userinput>echo "syn on" >> ~/.vimrc </userinput>
|
|
&prompt.user; <userinput>cvs diff -Nu shazam | vim -</userinput>
|
|
&prompt.user; <userinput>cvs log shazam | vim -</userinput> </screen>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>CVS is old, arcane, crufty and buggy, and sometimes
|
|
exhibits non-deterministic behavior which some claim as proof
|
|
that it is actually merely the Newtonian manifestation of a
|
|
sentient transdimensional entity. It is not humanly possible
|
|
to know its every quirk inside out, so do not be afraid to ask
|
|
the resident AI (&a.cvs;) for help.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Do not leave the <command>cvs commit</command> command in commit
|
|
message editing mode for too long (more than 2–3 minutes). It
|
|
locks the directory you are working with and will prevent other
|
|
developers from committing into the same directory. If you have
|
|
to type a long commit message, type it before executing
|
|
<command>cvs commit</command>, and insert it into the commit
|
|
message.</para>
|
|
</listitem>
|
|
</orderedlist>
|
|
|
|
</sect1>
|
|
|
|
<sect1 id="conventions">
|
|
<title>Conventions and Traditions</title>
|
|
|
|
<para>As a new committer there are a number of things you should do
|
|
first.</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>Add yourself to the <quote>Developers</quote> section of
|
|
the <ulink url="../contributors/index.html">Contributors List</ulink>
|
|
and remove yourself from the <quote>Additional
|
|
Contributors</quote> section. Once you have done that, do not
|
|
forget to add your author entity to
|
|
<filename>doc/en_US.ISO8859-1/share/sgml/authors.ent</filename>;
|
|
use the other entries as example.</para>
|
|
|
|
<para>This is a relatively easy task, but remains a good first test of
|
|
your CVS skills.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Add an entry for yourself to
|
|
<filename>www/en/news/news.xml</filename>. Look for the other
|
|
entries that look like <quote>A new committer</quote> and follow the
|
|
format.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>You should add your PGP or GnuPG key to
|
|
<filename>doc/share/pgpkeys</filename> (and if you do not
|
|
have a key, you should create one).</para>
|
|
|
|
<para>&a.des; has
|
|
written a shell script to make this extremely simple. See the
|
|
<ulink
|
|
url="http://cvsweb.FreeBSD.org/doc/share/pgpkeys/README">README</ulink>
|
|
file for more information.</para>
|
|
|
|
<note>
|
|
<para>It is important to have an up-to-date PGP/GnuPG key in
|
|
the Handbook, since the key may be required for positive
|
|
identification of a committer, e.g. by the &a.admins; for
|
|
account recovery.</para>
|
|
</note>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Some people add an entry for themselves to
|
|
<filename>ports/astro/xearth/files/freebsd.committers.markers</filename>.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Some people add an entry for themselves to
|
|
<filename>src/usr.bin/calendar/calendars/calendar.freebsd</filename>.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Introduce yourself to the other committers, otherwise no one
|
|
will have any idea who you are or what you are working on. You do
|
|
not have to write a comprehensive biography, just write a paragraph
|
|
or two about who you are and what you plan to be working on as a
|
|
committer in FreeBSD. Email this to the &a.developers; and you will
|
|
be on your way!</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Log into <hostid>hub.FreeBSD.org</hostid> and create a
|
|
<filename>/var/forward/<replaceable>user</replaceable></filename>
|
|
(where <replaceable>user</replaceable> is your username) file
|
|
containing the e-mail address where you want mail addressed to
|
|
<replaceable>yourusername</replaceable>@FreeBSD.org to be forwarded.
|
|
This includes all of the commit messages as well as any other mail
|
|
addressed to the &a.committers; and the &a.developers;. Really
|
|
large mailboxes which have taken up permanent residence on
|
|
<hostid>hub</hostid> often get <quote>accidentally</quote> truncated
|
|
without warning, so forward it or read it and you will not lose
|
|
it.</para>
|
|
|
|
<para>Due to the severe load dealing with SPAM places on
|
|
the central mail servers that do the mailing list processing
|
|
the front-end server does do some basic checks and will
|
|
drop some messages based on these checks. At the moment
|
|
proper DNS information for the connecting host is the only
|
|
check in place but that may change. Some people blame these
|
|
checks for bouncing valid email. If you want these checks
|
|
turned off for your email you can place a file named
|
|
<filename>~/.spam_lover</filename> in your home directory
|
|
on <hostid role="fqdn">freefall.FreeBSD.org</hostid> to
|
|
disable the checks for your email.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>If you are subscribed to the &a.cvsall;, you will
|
|
probably want to unsubscribe to avoid receiving duplicate
|
|
copies of commit messages and their followups.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>All new committers also have a mentor assigned to them for
|
|
the first few months. Your mentor is responsible for teaching
|
|
you the rules and conventions of the project and guiding your
|
|
first steps in the committer community. He or she is also
|
|
personally responsible for your actions during this initial
|
|
period. Until your mentor decides (and announces with a forced
|
|
commit to <filename>access</filename>) that you have learned the
|
|
ropes and are ready to commit on your own, you should not commit
|
|
anything without first getting your mentor's review and
|
|
approval, and you should document that approval with an
|
|
<literal>Approved by:</literal> line in the commit
|
|
message.</para>
|
|
|
|
<para>All <filename>src</filename> commits should go to
|
|
&os.current; first before being merged to &os.stable;. No major
|
|
new features or high-risk modifications should be made to the
|
|
&os.stable; branch.</para>
|
|
</sect1>
|
|
|
|
<sect1 id="developer.relations">
|
|
<title>Developer Relations</title>
|
|
|
|
<para>If you are working directly on your own code or on code
|
|
which is already well established as your responsibility, then
|
|
there is probably little need to check with other committers
|
|
before jumping in with a commit. If you see a bug in an area of
|
|
the system which is clearly orphaned (and there are a few such
|
|
areas, to our shame), the same applies. If, however, you are
|
|
about to modify something which is clearly being actively
|
|
maintained by someone else (and it is only by watching the
|
|
<literal>cvs-committers</literal> mailing list that you can
|
|
really get a feel for just what is and is not) then consider
|
|
sending the change to them instead, just as you would have
|
|
before becoming a committer. For ports, you should contact the
|
|
listed <makevar>MAINTAINER</makevar> in the
|
|
<filename>Makefile</filename>. For other parts of the
|
|
repository, if you are unsure who the active maintainer might
|
|
be, it may help to scan the output of <command>cvs log</command>
|
|
to see who has committed changes in the past. &a.fenner; has
|
|
written a nice shell script that can help determine who the
|
|
active maintainer might be. It lists each person who has
|
|
committed to a given file along with the number of commits each
|
|
person has made. It can be found on <hostid>freefall</hostid>
|
|
at <filename>~fenner/bin/whodid</filename>. If your queries go
|
|
unanswered or the committer otherwise indicates a lack of
|
|
proprietary interest in the area affected, go ahead and commit
|
|
it.</para>
|
|
|
|
<para>If you are unsure about a commit for any reason at
|
|
all, have it reviewed by <literal>-hackers</literal>
|
|
before committing. Better to have it flamed then and there
|
|
rather than when it is part of the CVS repository. If you do
|
|
happen to commit something which results in controversy
|
|
erupting, you may also wish to consider backing the change out
|
|
again until the matter is settled. Remember – with CVS we
|
|
can always change it back.</para>
|
|
|
|
<para>Do not impugn the intentions of someone you disagree with.
|
|
If they see a different solution to a problem than you, or even
|
|
a different problem, it is not because they are stupid, because
|
|
they have questionable parentage, or because they are trying to
|
|
destroy your hard work, personal image, or FreeBSD, but simply
|
|
because they have a different outlook on the world. Different
|
|
is good.</para>
|
|
|
|
<para>Disagree honestly. Argue your position from its merits,
|
|
be honest about any shortcomings it may have, and be open to
|
|
seeing their solution, or even their vision of the problem,
|
|
with an open mind.</para>
|
|
|
|
<para>Accept correction. We are all fallible. When you have made
|
|
a mistake, apologize and get on with life. Do not beat up
|
|
yourself, and certainly do not beat up others for your mistake.
|
|
Do not waste time on embarrassment or recrimination, just fix
|
|
the problem and move on.</para>
|
|
|
|
<para>Ask for help. Seek out (and give) peer reviews. One of
|
|
the ways open source software is supposed to excel is in the
|
|
number of eyeballs applied to it; this does not apply if nobody
|
|
will review code.</para>
|
|
</sect1>
|
|
|
|
<sect1 id="gnats">
|
|
<title>GNATS</title>
|
|
|
|
<para>The FreeBSD Project utilizes
|
|
<application>GNATS</application> for tracking bugs and change
|
|
requests. Be sure that if you commit a fix or suggestion found
|
|
in a <application>GNATS</application> PR, you use
|
|
<command>edit-pr <replaceable>pr-number</replaceable></command>
|
|
on <hostid>freefall</hostid> to close it. It is also considered
|
|
nice if you take time to close any PRs associated with your
|
|
commits, if appropriate. You can also make use of
|
|
&man.send-pr.1; yourself for proposing any change which you feel
|
|
should probably be made, pending a more extensive peer-review
|
|
first.</para>
|
|
|
|
<para>You can find out more about <application>GNATS</application>
|
|
at:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para><ulink url="http://www.cs.utah.edu/csinfo/texinfo/gnats/gnats.html"></ulink></para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para><ulink url="../../../../support.html">http://www.FreeBSD.org/support.html</ulink></para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>&man.send-pr.1;</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>You can run a local copy of GNATS, and then integrate the FreeBSD
|
|
GNATS tree in to it using CVSup. Then you can run GNATS commands
|
|
locally, or use other interfaces, such as <command>tkgnats</command>.
|
|
This lets you query the PR database without needing to be connected to
|
|
the Internet.</para>
|
|
|
|
<procedure>
|
|
<title>Using a local GNATS tree</title>
|
|
|
|
<step>
|
|
<para>If you are not already downloading the GNATS tree, add this line
|
|
to your <filename>supfile</filename>, and re-sup. Note that since
|
|
GNATS is not under CVS control it has no tag, so if you are adding
|
|
it to your existing <filename>supfile</filename> it should appear
|
|
before any <quote>tag=</quote> entry as these remain active once set.
|
|
</para>
|
|
|
|
<programlisting>gnats release=current prefix=/usr</programlisting>
|
|
|
|
<para>This will place the FreeBSD GNATS tree in
|
|
<filename>/usr/gnats</filename>. You can use a
|
|
<emphasis>refuse</emphasis> file to control which categories to
|
|
receive. For example, to only receive <literal>docs</literal> PRs,
|
|
put this line in
|
|
<filename>/usr/local/etc/cvsup/sup/refuse</filename><footnote>
|
|
<para>The precise path depends on the <literal>*default
|
|
base</literal> setting in your
|
|
<filename>supfile</filename>.</para>
|
|
</footnote>.</para>
|
|
|
|
<programlisting>gnats/[a-ce-z]*</programlisting>
|
|
|
|
<para>The rest of these examples assume you have only supped the
|
|
<literal>docs</literal> category. Adjust them as necessary,
|
|
depending on the categories you are syncing.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Install the GNATS port from
|
|
<filename>ports/databases/gnats</filename>. This will place the
|
|
various GNATS directories under
|
|
<filename>$PREFIX/share/gnats</filename>.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Symlink the GNATS directories you are supping under the version
|
|
of GNATS you have installed.</para>
|
|
|
|
<screen>&prompt.root; <userinput>cd /usr/local/share/gnats/gnats-db</userinput>
|
|
&prompt.root; <userinput>ln -s /usr/gnats/docs</userinput></screen>
|
|
|
|
<para>Repeat as necessary, depending on how many GNATS categories you
|
|
are syncing.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Update the GNATS <filename>categories</filename> file with these
|
|
categories. The file is
|
|
<filename>$PREFIX/share/gnats/gnats-db/gnats-adm/categories</filename>.</para>
|
|
|
|
<programlisting># This category is mandatory
|
|
pending:Category for faulty PRs:gnats-admin:
|
|
#
|
|
# FreeBSD categories
|
|
#
|
|
docs:Documentation Bug:freebsd-doc:</programlisting>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Run <filename>$PREFIX/libexec/gnats/gen-index</filename> to
|
|
recreate the GNATS index. The output has to be redirected to
|
|
<filename>$PREFIX/share/gnats/gnats-db/gnats-adm/index</filename>.
|
|
You can do this periodically from &man.cron.8;, or run &man.cvsup.1;
|
|
from a shell script that does this as well.</para>
|
|
|
|
<screen>&prompt.root; <userinput>/usr/local/libexec/gnats/gen-index \
|
|
> /usr/local/share/gnats/gnats-db/gnats-adm/index</userinput></screen>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Test the configuration by querying the PR database. This
|
|
command shows open <literal>docs</literal> PRs.</para>
|
|
|
|
<screen>&prompt.root; <userinput>query-pr -c docs -s open</userinput></screen>
|
|
|
|
<para>Other interfaces, such as that provided by the
|
|
<filename role="package">databases/tkgnats</filename> port should also work
|
|
nicely.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Pick a PR and close it.</para>
|
|
</step>
|
|
</procedure>
|
|
|
|
<note>
|
|
<para>This procedure only works to allow you to view and query the PRs
|
|
locally. To edit or close them you will still have to log in to
|
|
<hostid>freefall</hostid> and do it from there.</para>
|
|
</note>
|
|
</sect1>
|
|
|
|
<sect1 id="people">
|
|
<title>Who's Who</title>
|
|
|
|
<para>Besides the repository
|
|
meisters, there are other FreeBSD project members and teams whom you will
|
|
probably get to know in your role as a committer. Briefly,
|
|
and by no means all-inclusively, these are:</para>
|
|
|
|
<!-- XXX The TRB are missing -->
|
|
|
|
<variablelist>
|
|
|
|
<varlistentry>
|
|
<term>&a.jhb;</term>
|
|
|
|
<listitem>
|
|
<para>John is the manager of the SMPng Project, and has
|
|
authority over the architectural design and implementation
|
|
of the move to fine-grained kernel threading and locking.
|
|
He's also the editor of the SMPng Architecture Document.
|
|
If you are working on fine-grained SMP and locking, please
|
|
coordinate with John. You can learn more about the
|
|
SMPng Project on its home page:
|
|
<ulink url="http://www.FreeBSD.org/smp/"></ulink></para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.jake;, &a.tmm;</term>
|
|
|
|
<listitem>
|
|
<para>Jake and Thomas are the maintainers of the &sparc64; hardware
|
|
port.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.doceng;</term>
|
|
|
|
<listitem>
|
|
<para>doceng is the group responsible for the documentation build
|
|
infrastructure, approving new documentation committers, and
|
|
ensuring that the FreeBSD website and documentation on the FTP
|
|
site is up to date with respect to the CVS tree. It is not a
|
|
conflict resolution body. The vast majority of documentation
|
|
related discussion takes place on the &a.doc;. Committers
|
|
interested in contributing to the documentation should familiarize
|
|
themselves with the <ulink
|
|
url="../../books/fdp-primer/index.html">Documentation Project
|
|
Primer</ulink>.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.ru;</term>
|
|
|
|
<listitem>
|
|
<para>Ruslan is Mister &man.mdoc.7;. If you are writing a
|
|
manual page and need
|
|
some advice on the structure, or the markup, ask Ruslan.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.bde;</term>
|
|
|
|
<listitem>
|
|
<para>Bruce is the Style Police-Meister.
|
|
When you do a commit that could have been done better,
|
|
Bruce will be there to tell you. Be thankful that someone
|
|
is. Bruce is also very knowledgeable on the various
|
|
standards applicable to FreeBSD.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.gallatin;</term>
|
|
<term>&a.mjacob;</term>
|
|
<term>&a.dfr;</term>
|
|
<term>&a.obrien;</term>
|
|
|
|
<listitem>
|
|
<para>These are the primary developers and overseers of the
|
|
DEC Alpha AXP platform.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.dg;</term>
|
|
|
|
<listitem>
|
|
<para>David is the overseer of the
|
|
VM system. If you have a VM system change in mind,
|
|
coordinate it with David.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.dfr;</term>
|
|
<term>&a.marcel;</term>
|
|
<term>&a.peter;</term>
|
|
<term>&a.ps;</term>
|
|
|
|
<listitem>
|
|
<para>These are the primary developers and overseers of the
|
|
Intel IA-64 platform, officially known as the &itanium; Processor
|
|
Family (IPF).</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.murray;</term>
|
|
<term>&a.steve;</term>
|
|
<term>&a.rwatson;</term>
|
|
<term>&a.jhb;</term>
|
|
<term>&a.bmah;</term>
|
|
<term>&a.scottl;</term>
|
|
<term>&a.kensmith;</term>
|
|
<term>&a.hrs;</term>
|
|
|
|
<listitem>
|
|
<para>These are the members of the &a.re;. This team is
|
|
responsible for setting release deadlines and controlling
|
|
the release process. During code freezes, the release
|
|
engineers have final authority on all changes to the
|
|
system for whichever branch is pending release status. If
|
|
there is something you want merged from &os.current; to
|
|
&os.stable; (whatever values those may have at any given
|
|
time), these are the people to talk to about it.</para>
|
|
|
|
<para>Bruce is also the keeper of the release documentation
|
|
(<filename>src/release/doc/*</filename>). If you commit a
|
|
change that you think is worthy of mention in the release notes,
|
|
please make sure Bruce knows about it. Better still, send him
|
|
a patch with your suggested commentary.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.benno;</term>
|
|
|
|
<listitem>
|
|
<para>Benno is the official maintainer of the &powerpc; port.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.brian;</term>
|
|
|
|
<listitem>
|
|
<para>Official maintainer of
|
|
<filename>/usr/sbin/ppp</filename>.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.nectar;</term>
|
|
|
|
<listitem>
|
|
<para>Jacques is the
|
|
<ulink url="../../../../security/">FreeBSD Security
|
|
Officer</ulink>
|
|
and oversees the &a.security-officer;.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.wollman;</term>
|
|
|
|
<listitem>
|
|
<para>If you need advice on obscure network internals or
|
|
are not sure of some potential change to the networking
|
|
subsystem you have in mind, Garrett is someone to talk
|
|
to. Garrett is also very knowledgeable on the various
|
|
standards applicable to FreeBSD.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.committers;</term>
|
|
|
|
<listitem>
|
|
<para>cvs-committers is the entity that CVS uses to send you all your
|
|
commit messages. You should <emphasis>never</emphasis> send email
|
|
directly to this list. You should only send replies to this list
|
|
when they are short and are directly related to a commit.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>&a.developers;</term>
|
|
|
|
<listitem>
|
|
<para>All committers are subscribed to -developers. This list was created to be a
|
|
forum for the committers <quote>community</quote> issues.
|
|
Examples are Core
|
|
voting, announcements, etc. This list is
|
|
<emphasis>not</emphasis> intended as a place for code reviews or a
|
|
replacement for the &a.arch; or the &a.audit;. In fact
|
|
using it as such hurts the FreeBSD Project as it gives a sense of a
|
|
closed list where general decisions affecting all of the FreeBSD
|
|
using community are made without being <quote>open</quote>.
|
|
Last, but not least <emphasis>never, never ever, email
|
|
the &a.developers; and CC:/BCC: another FreeBSD list</emphasis>.
|
|
Never, ever email another FreeBSD email list and CC:/BCC:
|
|
the &a.developers;. Doing so can greatly diminish the benefits
|
|
of this list. Also, never publicly post or forward emails sent
|
|
to the &a.developers;. The act of sending to
|
|
the &a.developers; vs. a public list means the information in
|
|
the email is not for public consumption.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</sect1>
|
|
|
|
<sect1 id="ssh.guide">
|
|
<title>SSH Quick-Start Guide</title>
|
|
|
|
<procedure>
|
|
<step>
|
|
<para>If you are using FreeBSD 4.0 or later,
|
|
OpenSSH is included in the base system.
|
|
If you are using an earlier release,
|
|
update and install one of the SSH ports. In general,
|
|
you will probably want to get OpenSSH from the
|
|
<filename role="package">security/openssh</filename> port. You
|
|
may also wish to check out the original ssh1 in the
|
|
<filename role="package">security/ssh</filename> port, but make
|
|
certain you pay attention to its license. Note that both
|
|
of these ports cannot be installed at the same time.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>If you do not wish to type your password in every
|
|
time you use &man.ssh.1;, and you use RSA or DSA keys to
|
|
authenticate, &man.ssh-agent.1; is there for your
|
|
convenience. If you want to use &man.ssh-agent.1;, make
|
|
sure that you run it before running other applications. X
|
|
users, for example, usually do this from their
|
|
<filename>.xsession</filename> or
|
|
<filename>.xinitrc</filename> file. See &man.ssh-agent.1;
|
|
for details.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Generate a key pair using &man.ssh-keygen.1;. The key
|
|
pair will wind up in your
|
|
<filename><envar>$HOME</envar>/.ssh/</filename>
|
|
directory.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Send your public key
|
|
(<filename><envar>$HOME</envar>/.ssh/id_dsa.pub</filename>
|
|
or <filename><envar>$HOME</envar>/.ssh/id_rsa.pub</filename>)
|
|
to the person setting you up as a committer so it can be put
|
|
into <filename><replaceable>yourlogin</replaceable></filename> file in
|
|
<filename class="directory">/c/ssh-keys/</filename> on
|
|
<hostid>freefall</hostid>.
|
|
</para>
|
|
</step>
|
|
</procedure>
|
|
|
|
<para>Now you should be able to use &man.ssh-add.1; for
|
|
authentication once per session. This will prompt you for
|
|
your private key's pass phrase, and then store it in your
|
|
authentication agent (&man.ssh-agent.1;). If you no longer
|
|
wish to have your key stored in the agent, issuing
|
|
<command>ssh-add -d</command> will remove it.</para>
|
|
|
|
<para>Test by doing something such as <command>ssh
|
|
freefall.FreeBSD.org ls /usr</command>.</para>
|
|
|
|
<para>For more information, see
|
|
<filename role="package">security/openssh</filename>, &man.ssh.1;,
|
|
&man.ssh-add.1;, &man.ssh-agent.1;, &man.ssh-keygen.1;, and
|
|
&man.scp.1;.</para>
|
|
</sect1>
|
|
|
|
<sect1 id="rules">
|
|
<title>The FreeBSD Committers' Big List of Rules</title>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para>Respect other committers.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Respect other contributors.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Discuss any significant change
|
|
<emphasis>before</emphasis> committing.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Respect existing maintainers (if listed in the
|
|
<makevar>MAINTAINER</makevar> field in
|
|
<filename>Makefile</filename> or in the
|
|
<filename>MAINTAINER</filename> file in the top-level
|
|
directory).</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Any disputed change must be backed out pending
|
|
resolution of the dispute if requested by a maintainer.
|
|
Security related changes may
|
|
override a maintainer's wishes at the Security Officer's
|
|
discretion.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Changes go to &os.current; before
|
|
&os.stable; unless specifically permitted by
|
|
the release engineer or unless they are not applicable to
|
|
&os.current;. Any non-trivial or non-urgent
|
|
change which is applicable should also be allowed to sit in
|
|
&os.current; for at least 3 days before
|
|
merging so that it can be given sufficient testing. The
|
|
release engineer has the same authority over the
|
|
&os.stable; branch as outlined for the
|
|
maintainer in rule #5.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Do not fight in public with other committers; it looks
|
|
bad. If you must <quote>strongly disagree</quote> about
|
|
something, do so only in private.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Respect all code freezes and read the
|
|
<literal>committers</literal> and <literal>developers</literal>
|
|
mailing lists in a timely manner so you know when a code freeze is
|
|
in effect.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>When in doubt on any procedure, ask first!</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Test your changes before committing them.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Do not commit to anything under the
|
|
<filename>src/contrib</filename>,
|
|
<filename>src/crypto</filename>, and
|
|
<filename>src/sys/contrib</filename> trees without
|
|
<emphasis>explicit</emphasis> approval from the respective
|
|
maintainer(s).</para>
|
|
</listitem>
|
|
</orderedlist>
|
|
|
|
<para>As noted, breaking some of these rules can be grounds for
|
|
suspension or, upon repeated offense, permanent removal of
|
|
commit privileges. Individual members of core
|
|
have the power to temporarily suspend commit privileges until
|
|
core as a whole has the chance to review the
|
|
issue. In case of an <quote>emergency</quote> (a committer
|
|
doing damage to the repository), a temporary suspension may also
|
|
be done by the repository meisters.
|
|
Only a 2/3 majority of core
|
|
has the authority to suspend commit privileges for longer
|
|
than a week or to remove them permanently.
|
|
This rule does not exist to set core up as a bunch
|
|
of cruel dictators who can dispose of committers as casually as
|
|
empty soda cans, but to give the project a kind of safety fuse.
|
|
If someone is out of control, it is important to be
|
|
able to deal with this immediately rather than be paralyzed by
|
|
debate. In all cases, a committer whose privileges are
|
|
suspended or revoked is entitled to a <quote>hearing</quote> by core,
|
|
the total duration of the suspension being determined at that
|
|
time. A committer whose privileges are suspended may also
|
|
request a review of the decision after 30 days and every 30 days
|
|
thereafter (unless the total suspension period is less than 30
|
|
days). A committer whose privileges have been revoked entirely
|
|
may request a review after a period of 6 months has elapsed.
|
|
This review policy is <emphasis>strictly informal</emphasis>
|
|
and, in all cases, core reserves the right to either act on or
|
|
disregard requests for review if they feel their original
|
|
decision to be the right one.</para>
|
|
|
|
<para>In all other aspects of project operation, core is a subset
|
|
of committers and is bound by the <emphasis>same
|
|
rules</emphasis>. Just because someone is in core this does not mean
|
|
that they have special dispensation to step outside any of
|
|
the lines painted here; core's <quote>special powers</quote>
|
|
only kick in when it acts as a group, not on an individual
|
|
basis. As individuals, the core team members are all committers
|
|
first and core second.</para>
|
|
|
|
<sect2>
|
|
<title>Details</title>
|
|
|
|
<orderedlist>
|
|
<listitem id="respect">
|
|
<para>Respect other committers.</para>
|
|
|
|
<para>This means that you need to treat other committers as
|
|
the peer-group developers that they are. Despite our
|
|
occasional attempts to prove the contrary, one does not get
|
|
to be a committer by being stupid and nothing rankles more
|
|
than being treated that way by one of your peers. Whether
|
|
we always feel respect for one another or not (and
|
|
everyone has off days), we still have to
|
|
<emphasis>treat</emphasis> other committers with respect
|
|
at all times, on public forums and in private email.</para>
|
|
|
|
<para>Being able to work together long term is this project's
|
|
greatest asset, one far more important than any set of
|
|
changes to the code, and turning arguments about code into
|
|
issues that affect our long-term ability to work
|
|
harmoniously together is just not worth the trade-off by
|
|
any conceivable stretch of the imagination.</para>
|
|
|
|
<para>To comply with this rule, do not send email when you are
|
|
angry or otherwise behave in a manner which is likely to
|
|
strike others as needlessly confrontational. First calm
|
|
down, then think about how to communicate in the most
|
|
effective fashion for convincing the other person(s) that
|
|
your side of the argument is correct, do not just blow off
|
|
some steam so you can feel better in the short term at the
|
|
cost of a long-term flame war. Not only is this very bad
|
|
<quote>energy economics</quote>, but repeated displays of
|
|
public aggression which impair our ability to work well
|
|
together will be dealt with severely by the project
|
|
leadership and may result in suspension or termination of
|
|
your commit privileges. The project leadership will
|
|
take into account both public and private communications
|
|
brought before it. It will not seek the disclosure of
|
|
private communications, but it will take it into account
|
|
if it is volunteered by the committers involved in the
|
|
complaint.</para>
|
|
|
|
<para>All of this is never an option which the
|
|
project's leadership enjoys in the slightest, but unity
|
|
comes first. No amount of code or good advice is worth
|
|
trading that away.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Respect other contributors.</para>
|
|
|
|
<para>You were not always a committer. At one time you were
|
|
a contributor. Remember that at all times. Remember what
|
|
it was like trying to get help and attention. Do not forget
|
|
that your work as a contributor was very important to
|
|
you. Remember what it was like. Do not discourage, belittle,
|
|
or demean contributors. Treat them with respect. They are
|
|
our committers in waiting. They are every bit as important
|
|
to the project as committers. Their contributions are as
|
|
valid and as important as your own. After all, you made
|
|
many contributions before you became a committer. Always
|
|
remember that. </para>
|
|
|
|
<para>Consider the points raised under <xref linkend="respect">
|
|
and apply them also to contributors.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Discuss any significant change
|
|
<emphasis>before</emphasis> committing.</para>
|
|
|
|
<para>The CVS repository is not where changes should be
|
|
initially submitted for correctness or argued over, that
|
|
should happen first in the mailing lists and the commit should
|
|
only happen once something resembling consensus has
|
|
been reached. This does not mean that you have to ask
|
|
permission before correcting every obvious syntax error or
|
|
manual page misspelling, simply that you should try to
|
|
develop a feel for when a proposed change is not quite such
|
|
a no-brainer and requires some feedback first. People
|
|
really do not mind sweeping changes if the result is
|
|
something clearly better than what they had before, they
|
|
just do not like being <emphasis>surprised</emphasis> by
|
|
those changes. The very best way of making sure that
|
|
you are on the right track is to have your code reviewed by
|
|
one or more other committers.</para>
|
|
|
|
<para>When in doubt, ask for review!</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Respect existing maintainers if listed.</para>
|
|
|
|
<para>Many parts of FreeBSD are not <quote>owned</quote> in
|
|
the sense that any specific individual will jump up and
|
|
yell if you commit a change to <quote>their</quote> area,
|
|
but it still pays to check first. One convention we use
|
|
is to put a maintainer line in the
|
|
<filename>Makefile</filename> for any package or subtree
|
|
which is being actively maintained by one or more people;
|
|
see <ulink
|
|
url="../../books/developers-handbook/policies.html"></ulink>
|
|
for documentation on this. Where sections of code have
|
|
several maintainers, commits to affected areas by one
|
|
maintainer need to be reviewed by at least one other
|
|
maintainer. In cases where the
|
|
<quote>maintainer-ship</quote> of something is not clear,
|
|
you can also look at the CVS logs for the file(s) in
|
|
question and see if someone has been working recently or
|
|
predominantly in that area.</para>
|
|
|
|
<para>Other areas of FreeBSD fall under the control of
|
|
someone who manages an overall category of FreeBSD
|
|
evolution, such as internationalization or networking.
|
|
See <ulink
|
|
url="../contributors/staff-who.html">
|
|
http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/contributors/staff-who.html</ulink>
|
|
for more information on this.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Any disputed change must be backed out pending
|
|
resolution of the dispute if requested by a maintainer.
|
|
Security related changes may
|
|
override a maintainer's wishes at the Security Officer's
|
|
discretion.</para>
|
|
|
|
<para>This may be hard to swallow in times of conflict (when
|
|
each side is convinced that they are in the right, of
|
|
course) but CVS makes it unnecessary to have an ongoing
|
|
dispute raging when it is far easier to simply reverse the
|
|
disputed change, get everyone calmed down again and then
|
|
try to figure out what is the best way to proceed. If the change
|
|
turns out to be the best thing after all, it can be easily
|
|
brought back. If it turns out not to be, then the users
|
|
did not have to live with the bogus change in the tree
|
|
while everyone was busily debating its merits. People
|
|
very very rarely call for back-outs in the repository
|
|
since discussion generally exposes bad or controversial
|
|
changes before the commit even happens, but on such rare
|
|
occasions the back-out should be done without argument so
|
|
that we can get immediately on to the topic of figuring
|
|
out whether it was bogus or not.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Changes go to &os.current; before
|
|
&os.stable; unless specifically permitted
|
|
by the release engineer or unless they are not applicable
|
|
to &os.current;. Any non-trivial or
|
|
non-urgent change which is applicable should also be
|
|
allowed to sit in &os.current; for at least
|
|
3 days before merging so that it can be given sufficient
|
|
testing. The release engineer has the same authority over
|
|
the &os.stable; branch as outlined in rule
|
|
#5.</para>
|
|
|
|
<para>This is another <quote>do not argue about it</quote>
|
|
issue since it is the release engineer who is ultimately
|
|
responsible (and gets beaten up) if a change turns out to
|
|
be bad. Please respect this and give the release engineer
|
|
your full cooperation when it comes to the
|
|
&os.stable; branch. The management of
|
|
&os.stable; may frequently seem to be
|
|
overly conservative to the casual observer, but also bear
|
|
in mind the fact that conservatism is supposed to be the
|
|
hallmark of &os.stable; and different rules
|
|
apply there than in &os.current;. There is
|
|
also really no point in having &os.current;
|
|
be a testing ground if changes are merged over to
|
|
&os.stable; immediately. Changes need a
|
|
chance to be tested by the &os.current;
|
|
developers, so allow some time to elapse before merging
|
|
unless the &os.stable; fix is critical,
|
|
time sensitive or so obvious as to make further testing
|
|
unnecessary (spelling fixes to manual pages, obvious bug/typo
|
|
fixes, etc.) In other words, apply common sense.</para>
|
|
|
|
<para>Changes to the security branches
|
|
(for example, <literal>RELENG_4_5</literal>) must be
|
|
approved by a member of the &a.security-officer;, or in
|
|
some cases, by a member of the &a.re;.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Do not fight in public with other committers; it looks
|
|
bad. If you must <quote>strongly disagree</quote> about
|
|
something, do so only in private.</para>
|
|
|
|
<para>This project has a public image to uphold and that
|
|
image is very important to all of us, especially if we are
|
|
to continue to attract new members. There will be
|
|
occasions when, despite everyone's very best attempts at
|
|
self-control, tempers are lost and angry words are
|
|
exchanged. The best thing that can be done in such cases is to minimize
|
|
the effects of this until everyone has cooled back down. That
|
|
means that you should not air your angry words in public
|
|
and you should not forward private correspondence to
|
|
public mailing lists or aliases. What people say
|
|
one-to-one is often much less sugar-coated than what they
|
|
would say in public, and such communications therefore
|
|
have no place there - they only serve to inflame an
|
|
already bad situation. If the person sending you a
|
|
flame-o-gram at least had the grace to send it privately,
|
|
then have the grace to keep it private yourself. If you
|
|
feel you are being unfairly treated by another developer,
|
|
and it is causing you anguish, bring the matter up with
|
|
core rather than taking it public. Core will do its best to
|
|
play peace makers and get things back to sanity. In cases
|
|
where the dispute involves a change to the codebase and
|
|
the participants do not appear to be reaching an amicable
|
|
agreement, core may appoint a mutually-agreeable 3rd party
|
|
to resolve the dispute. All parties involved must then
|
|
agree to be bound by the decision reached by this 3rd
|
|
party.</para>
|
|
<!-- XXX Mention TRB here too -->
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Respect all code freezes and read the
|
|
<literal>committers</literal> and <literal>developers</literal>
|
|
mailing list on a timely basis so you know when a code freeze is
|
|
in effect.</para>
|
|
|
|
<para>Committing unapproved changes during a code freeze is a really
|
|
big mistake and committers are expected to keep up-to-date
|
|
on what is going on before jumping in after a long absence
|
|
and committing 10 megabytes worth of accumulated stuff.
|
|
People who abuse this on a regular basis will have their
|
|
commit privileges suspended until they get back from the
|
|
FreeBSD Happy Reeducation Camp we run in Greenland.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>When in doubt on any procedure, ask first!</para>
|
|
|
|
<para>Many mistakes are made because someone is in a hurry
|
|
and just assumes they know the right way of doing
|
|
something. If you have not done it before, chances are
|
|
good that you do not actually know the way we do things
|
|
and really need to ask first or you are going to
|
|
completely embarrass yourself in public. There is no shame
|
|
in asking <quote>how in the heck do I do this?</quote> We
|
|
already know you are an intelligent person; otherwise, you
|
|
would not be a committer.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Test your changes before committing them.</para>
|
|
|
|
<!-- XXX Needs update re sparc64 + pc98
|
|
Also, needs more details on which machines are available for testing
|
|
-->
|
|
<para>This may sound obvious, but if it really were so
|
|
obvious then we probably would not see so many cases of
|
|
people clearly not doing this. If your changes are to the
|
|
kernel, make sure you can still compile both GENERIC and
|
|
LINT. If your changes are anywhere else, make sure you
|
|
can still make world. If your changes are to a branch,
|
|
make sure your testing occurs with a machine which is
|
|
running that code. If you have a change which also may
|
|
break another architecture, be sure and test on all
|
|
supported architectures. Currently, this is only the x86
|
|
and the Alpha so it is pretty easy to do. If you need to
|
|
test on the AXP, your account on <hostid
|
|
role="fqdn">beast.FreeBSD.org</hostid> will let you
|
|
compile and test Alpha binaries/kernels/etc. As other
|
|
architectures are added to the FreeBSD supported platforms
|
|
list, the appropriate shared testing resources will be
|
|
made available.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>Do not commit to anything under the
|
|
<filename>src/contrib</filename>,
|
|
<filename>src/crypto</filename>, and
|
|
<filename>src/sys/contrib</filename> trees without
|
|
<emphasis>explicit</emphasis> approval from the respective
|
|
maintainer(s).</para>
|
|
|
|
<para>The trees mentioned above are for contributed software
|
|
usually imported onto a vendor branch. Committing something
|
|
there, even if it does not take the file off the vendor branch,
|
|
may cause unnecessary headaches for those responsible for
|
|
maintaining that particular piece of software. Thus, unless
|
|
you have <emphasis>explicit</emphasis> approval from the
|
|
maintainer (or you are the maintainer), do
|
|
<emphasis>not</emphasis> commit there!</para>
|
|
|
|
<para>Please note that this does not mean you should not try to
|
|
improve the software in question; you are still more than
|
|
welcome to do so. Ideally, you should submit your patches to
|
|
the vendor. If your changes are FreeBSD-specific, talk to the
|
|
maintainer; they may be willing to apply them locally. But
|
|
whatever you do, do <emphasis>not</emphasis> commit there by
|
|
yourself!</para>
|
|
|
|
<para>Contact the &a.core; if you wish to take up maintainership
|
|
of an unmaintained part of the tree.</para>
|
|
</listitem>
|
|
</orderedlist>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Policy on Multiple Architectures</title>
|
|
|
|
<para>FreeBSD has added several new arch ports during the 5.0
|
|
release cycle and is truly no longer an &i386; centric operating
|
|
system. In an effort to make it easier to keep FreeBSD portable
|
|
across the platforms we support, core has developed the following
|
|
mandate:</para>
|
|
|
|
<blockquote>
|
|
<para>Our 32 bit reference platform is i386, and our 64 bit
|
|
reference platform is Sparc64. Major design work (including
|
|
major API and ABI changes) must prove itself on at least one
|
|
32 bit and at least one 64 bit platform, preferably the
|
|
primary reference platforms, before it may be committed
|
|
to the source tree.</para>
|
|
</blockquote>
|
|
|
|
<para>The i386 and Sparc64 platforms were chosen due to being more
|
|
readily available to developers and as representatives of more
|
|
diverse processor and system designs - big vs little endian,
|
|
register file vs register stack, different DMA and cache
|
|
implementations, hardware page tables vs software TLB management
|
|
etc.</para>
|
|
|
|
<para>While the Alpha is a 64 bit processor, it is a more
|
|
traditional processor design and does not provide as good a testbed
|
|
for many of the challenges that the other 64 bit platform ports
|
|
face. The ia64 platform has many of the same complications that
|
|
Sparc64 has, but is still limited in availability to
|
|
developers.</para>
|
|
|
|
<para>We will continue to re-evaluate this policy as cost and
|
|
availability of the 64 bit platforms change.</para>
|
|
|
|
<para>Developers should also be aware of our Tier Policy for
|
|
the long term support of hardware architectures. The rules
|
|
here are intended to provide guidance during the development
|
|
process, and are distinct from the requirements for features
|
|
and architectures listed in that section. The Tier rules for
|
|
feature support on architectures at release-time are more
|
|
strict than the rules for changes during the development
|
|
process.</para>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Other Suggestions</title>
|
|
|
|
<para>When committing documentation changes, use a spell checker
|
|
before committing. For all SGML docs, you should also
|
|
verify that your formatting directives are correct by running
|
|
<command>make lint</command>.</para>
|
|
|
|
<para>For all on-line manual pages, run <command>manck</command>
|
|
(from ports) over the manual page to verify all of the cross
|
|
references and file references are correct and that the man
|
|
page has all of the appropriate <makevar>MLINK</makevar>s
|
|
installed.</para>
|
|
|
|
<para>Do not mix style fixes with new functionality. A style
|
|
fix is any change which does not modify the functionality of
|
|
the code. Mixing the changes obfuscates the functionality
|
|
change when using <command>cvs diff</command>, which can hide
|
|
any new bugs. Do not include whitespace changes with content
|
|
changes in commits to <filename>doc/</filename> or
|
|
<filename>www/</filename>. The extra clutter in the diffs
|
|
makes the translators' job much more difficult. Instead, make
|
|
any style or whitespace changes in separate commits that are
|
|
clearly labeled as such in the commit message.</para>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Deprecating Features</title>
|
|
|
|
<para>When it is necessary to remove functionality from software
|
|
in the base system the following guidelines should be followed
|
|
whenever possible:</para>
|
|
|
|
<orderedlist>
|
|
<listitem>
|
|
<para>Mention is made in the manual page and possibly the
|
|
release notes that the option, utility, or interface is
|
|
deprecated. Use of the deprecated feature generates a
|
|
warning.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>The option, utility, or interface is preserved until
|
|
the next major (point zero) release.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>The option, utility, or interface is removed and no
|
|
longer documented. It is now obsolete. It is also
|
|
generally a good idea to note its removal in the release
|
|
notes.</para>
|
|
</listitem>
|
|
</orderedlist>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="archs">
|
|
<title>Support for Multiple Architectures</title>
|
|
|
|
<para>FreeBSD is a highly portable operating system intended to
|
|
function on many different types of hardware architectures.
|
|
Maintaining clean separation of Machine Dependent (MD) and Machine
|
|
Independent (MI) code, as well as minimizing MD code, is an important
|
|
part of our strategy to remain agile with regards to current
|
|
hardware trends. Each new hardware architecture supported by
|
|
FreeBSD adds substantially to the cost of code maintenance,
|
|
toolchain support, and release engineering. It also dramatically
|
|
increases the cost of effective testing of kernel changes. As such,
|
|
there is strong motivation to differentiate between classes of
|
|
support for various architectures while remaining strong in a few
|
|
key architectures that are seen as the FreeBSD "target audience".
|
|
</para>
|
|
|
|
<sect2>
|
|
<title>Statement of General Intent</title>
|
|
|
|
<para>The FreeBSD Project targets "production quality commercial
|
|
off-the-shelf (COTS) workstation, server, and high-end embedded
|
|
systems". By retaining a focus on a narrow set of architectures
|
|
of interest in these environments, the FreeBSD Project is able
|
|
to maintain high levels of quality, stability, and performance,
|
|
as well as minimize the load on various support teams on the
|
|
project, such as the ports team, documentation team,
|
|
security officer, and release engineering teams. Diversity in
|
|
hardware support broadens the options for FreeBSD consumers by
|
|
offering new features and usage opportunities (such as support
|
|
for 64-bit CPUs, use in embedded environments, etc.), but these
|
|
benefits must always be carefully considered in terms of the real-world
|
|
maintenance cost associated with additional platform support.
|
|
</para>
|
|
|
|
<para>The FreeBSD Project differentiates platform targets into
|
|
four tiers. Each tier includes a specification of the
|
|
requirements for an architecture to be in that tier,
|
|
as well as specifying the obligations of developers with
|
|
regards to the platform. In addition, a policy is defined
|
|
regarding the circumstances required to change the tier
|
|
of an architecture.</para>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Tier 1: Fully Supported Architectures</title>
|
|
|
|
<para>Tier 1 platforms are fully supported by the security
|
|
officer, release engineering, and toolchain maintenance staff.
|
|
New features added to the operating system must be fully
|
|
functional across all Tier 1 architectures for every release
|
|
(features which are inherently architecture-specific, such as
|
|
support for hardware device drivers, may be exempt from this
|
|
requirement). In general, all Tier 1 platforms must have build
|
|
and tinderbox support either in the FreeBSD.org cluster, or
|
|
easily available for all developers.</para>
|
|
|
|
<para>Tier 1 architectures are expected to be Production Quality
|
|
with respects to all aspects of the FreeBSD operating system,
|
|
including installation and development environments.</para>
|
|
|
|
<para>Current Tier 1 platforms are i386, Sparc64, AMD64, PC98,
|
|
and Alpha.</para>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Tier 2: Developmental Architectures</title>
|
|
|
|
<para>Tier 2 platforms are not supported by the security officer
|
|
and release engineering teams. At the discretion of the
|
|
toolchain maintainer, they may be supported in the toolchain. New
|
|
features added to FreeBSD should be feasible to implement on these
|
|
platforms, but an implementation is not required before the
|
|
feature may be added to the FreeBSD source tree. The
|
|
implementation of a Tier 2 architecture may be committed to the
|
|
main FreeBSD tree as long as it does not interfere with
|
|
production work on Tier 1 platforms, or substantially with other
|
|
Tier 2 platforms. Before a Tier 2 platform can be added to the
|
|
FreeBSD base source tree, the platform must be able to boot to at
|
|
least single-user mode on real world commodity hardware. Some
|
|
exceptions to these rules may be made for new hardware that is
|
|
under development by hardware vendors, but not yet available to
|
|
the project.</para>
|
|
|
|
<para>Tier 2 architectures are usually systems targeted at Tier 1
|
|
support, but that are still under development. Architectures
|
|
reaching end of life may also be moved from Tier 1 status to Tier
|
|
2 status as the availability of resources to continue to maintain
|
|
the system in a Production Quality state diminishes.</para>
|
|
|
|
<para>Current Tier 2 platforms are PowerPC and ia64.</para>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Tier 3: Experimental Architectures</title>
|
|
|
|
<para>Tier 3 platforms are not supported by the security officer
|
|
and release engineering teams. At the discretion of the toolchain
|
|
maintainer, they may be supported in the toolchain. Tier 3
|
|
platforms are architectures for which hardware is not or will not
|
|
be available to the project in the foreseeable future, for which
|
|
there are two or fewer active developers, that can not boot to at
|
|
least single-user mode on real hardware (or a simulator for new
|
|
hardware platforms), or which are considered legacy systems
|
|
unlikely to see broad future use. Tier 3 systems will not be
|
|
committed to the base source tree, although support for Tier 3
|
|
systems may be worked on in the FreeBSD Perforce Repository,
|
|
providing source control and easier change integration from the
|
|
main FreeBSD tree.</para>
|
|
|
|
<para>Current Tier 3 platforms are &s390;.</para>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Tier 4: Unsupported Architectures</title>
|
|
|
|
<para>Tier 4 systems are not supported in any form by the project.
|
|
</para>
|
|
|
|
<para>All systems not otherwise classified into a support tier
|
|
are Tier 4 systems.</para>
|
|
</sect2>
|
|
|
|
<sect2>
|
|
<title>Policy on Changing the Tier of an Architecture</title>
|
|
|
|
<para>Systems may only be moved from one tier to another by
|
|
approval of the FreeBSD Core Team, which shall make that
|
|
decision in collaboration with the Security Officer, Release
|
|
Engineering, and toolchain maintenance teams.</para>
|
|
</sect2>
|
|
</sect1>
|
|
|
|
<sect1 id="ports">
|
|
<title>Ports Specific FAQ</title>
|
|
|
|
<qandaset>
|
|
<qandadiv>
|
|
<title>Adding a New Port</title>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>How do I add a new port?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>First, please read the section about repository
|
|
copies.</para>
|
|
|
|
<para>The easiest way to add a new port is to use the
|
|
<command>addport</command> script on
|
|
<hostid>freefall</hostid>. It will add a port from the
|
|
directory you specify, determining the category automatically
|
|
from the port <filename>Makefile</filename>.
|
|
It will also add an entry to the
|
|
<filename>CVSROOT/modules</filename> file and the port's
|
|
category <filename>Makefile</filename>. It was
|
|
written by &a.mharo; and &a.will;, but Will is the current
|
|
maintainer so please send questions/patches about
|
|
<command>addport</command> to him.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>Any other things I need to know when I add a new
|
|
port?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>Check the port, preferably to make sure it compiles
|
|
and packages correctly. This is the recommended
|
|
sequence:</para>
|
|
|
|
<screen>&prompt.root; <userinput>make install</userinput>
|
|
&prompt.root; <userinput>make package</userinput>
|
|
&prompt.root; <userinput>make deinstall</userinput>
|
|
&prompt.root; <userinput>pkg_add <replaceable>package you built above</replaceable></userinput>
|
|
&prompt.root; <userinput>make deinstall</userinput>
|
|
&prompt.root; <userinput>make reinstall</userinput>
|
|
&prompt.root; <userinput>make package</userinput>
|
|
</screen>
|
|
|
|
<para>The
|
|
<ulink url="../../books/porters-handbook/index.html">Porters
|
|
Handbook</ulink> contains more detailed
|
|
instructions.</para>
|
|
|
|
<para>Use &man.portlint.1; to check the syntax of the port.
|
|
You do not necessarily have to eliminate all warnings but
|
|
make sure you have fixed the simple ones.</para>
|
|
|
|
<para>If the port came from a submitter who has not
|
|
contributed to the project before, add that person's
|
|
name to the <ulink
|
|
url="../contributors/contrib-additional.html">Additional
|
|
Contributors</ulink> section of the FreeBSD Contributors
|
|
List.</para>
|
|
|
|
<para>Close the PR if the port came in as a PR. To close
|
|
a PR, just do
|
|
<userinput>edit-pr <replaceable>PR#</replaceable></userinput>
|
|
on <hostid>freefall</hostid> and change the
|
|
<varname>state</varname> from <constant>open</constant>
|
|
to <constant>closed</constant>. You will be asked to
|
|
enter a log message and then you are done.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
</qandadiv>
|
|
|
|
<qandadiv>
|
|
<title>Repository Copies</title>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>When do we need a repository copy?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>When you want to add a port that is related to
|
|
any port that is already in the tree in a separate
|
|
directory, you have to do a repository copy.
|
|
Here <wordasword>related</wordasword> means
|
|
it is a different version or a slightly modified
|
|
version. Examples are
|
|
<filename>print/ghostscript*</filename> (different
|
|
versions) and <filename>x11-wm/windowmaker*</filename>
|
|
(English-only and internationalized version).</para>
|
|
|
|
<para>Another example is when a port is moved from one
|
|
subdirectory to another, or when you want to change the
|
|
name of a directory because the author(s) renamed their
|
|
software even though it is a
|
|
descendant of a port already in a tree.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>When do we <emphasis>not</emphasis> need a
|
|
repository copy?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>When there is no history to preserve. If a port is
|
|
added into a wrong category and is moved immediately,
|
|
it suffices to simply <command>cvs remove</command> the
|
|
old one and <command>addport</command> the new
|
|
one.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>What do I need to do?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>File a PR in <application>GNATS</application>, listing the
|
|
reasons for the repository copy request. Assign it to
|
|
<literal>portmgr</literal> and set <varname>state</varname> to
|
|
<literal>repocopy</literal>. If &a.portmgr; approves it,
|
|
it will be reassigned to <literal>cvs</literal>. &a.cvs; will
|
|
do a repository copy from the old to the new location, and
|
|
reassign the PR back to you. Once everything is done, perform the
|
|
following:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>When a port has been repo copied:</para>
|
|
|
|
<procedure>
|
|
<step>
|
|
<para>Upgrade the copied port to the new version (remember
|
|
to change the <makevar>PORTNAME</makevar> so there
|
|
are not duplicate ports with the same name).</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Add the new subdirectory to the
|
|
<makevar>SUBDIR</makevar> listing in the parent
|
|
directory Makefile. You can run <command>make
|
|
checksubdirs</command> in the parent directory to check
|
|
this.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>If the port changed categories, modify the
|
|
<makevar>CATEGORIES</makevar> line of the port's
|
|
<filename>Makefile</filename> accordingly</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Add the new module entry.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Add an entry to
|
|
<filename>ports/MOVED</filename>.</para>
|
|
</step>
|
|
</procedure>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>When removing a port:</para>
|
|
|
|
<procedure>
|
|
<step>
|
|
<para>Perform a thorough check of the ports collection for
|
|
any dependencies on the old port location/name, and
|
|
update them. Running <command>grep</command> on
|
|
<filename>INDEX</filename> is not enough because some
|
|
ports have dependencies enabled by compile-time options.
|
|
A full <command>grep -r</command> of the ports
|
|
collection is recommended.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Remove the old port, the old
|
|
<makevar>SUBDIR</makevar> entry and the old module
|
|
entry.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Add an entry to
|
|
<filename>ports/MOVED</filename>.</para>
|
|
</step>
|
|
</procedure>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>After repo moves (<quote>rename</quote> operations where
|
|
a port is copied and the old location is removed):</para>
|
|
|
|
<procedure>
|
|
<step>
|
|
<para>Follow the same steps that are outlined in the
|
|
previous two entries, to activate the new location of
|
|
the port and remove the old one.</para>
|
|
</step>
|
|
</procedure>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</answer>
|
|
</qandaentry>
|
|
</qandadiv>
|
|
|
|
<qandadiv>
|
|
<title>Ports Freeze</title>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>What is a <quote>ports freeze</quote>?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>Before a release, it is necessary to restrict
|
|
commits to the ports tree for a short period of time
|
|
while the packages and the release itself are being
|
|
built. This is to ensure consistency among the various
|
|
parts of the release, and is called the <quote>ports
|
|
freeze</quote>.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>How long is a ports freeze?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>Usually an hour or two.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>What does it mean to me?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>During the ports freeze, you are not allowed to
|
|
commit anything to the tree without explicit approval
|
|
from the ports manager. <quote>Explicit
|
|
approval</quote> here means either of the
|
|
following:</para>
|
|
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>You asked the ports manager and got a reply
|
|
saying, <quote>Go ahead and commit
|
|
it.</quote></para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>The ports manager sent a mail to you or the
|
|
mailing lists during the ports freeze pointing out
|
|
that the port is broken and has to be fixed.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
|
|
<para>Note that you do not have implicit permission to fix
|
|
a port during the freeze just because it is
|
|
broken.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>How do I know when the ports freeze starts?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>The ports manager will send out warning messages to
|
|
the &a.ports; and &a.committers;
|
|
announcing the start of the impending release, usually
|
|
two or three weeks in advance. The exact starting time
|
|
will not be determined until a few days before the
|
|
actual release. This is because the ports freeze has to
|
|
be synchronized with the release, and it is usually not
|
|
known until then when exactly the release will be
|
|
rolled.</para>
|
|
|
|
<para>When the freeze starts, there will be another
|
|
announcement to the &a.committers;, of course.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>How do I know when the ports freeze ends?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>A few hours after the release, the ports manager
|
|
will send out a mail to the &a.ports; and &a.committers;
|
|
announcing the end of the ports freeze. Note that the
|
|
release being cut does not automatically end the freeze.
|
|
We have to make sure there will not be any last minute
|
|
snafus that result in an immediate re-rolling of the
|
|
release.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
</qandadiv>
|
|
|
|
<qandadiv>
|
|
<title>Creating a New Category</title>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>What is the procedure for creating a new category?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>A developer who wishes to propose a new category
|
|
should submit a detailed rationale for the new category,
|
|
including why existing categories are not sufficient,
|
|
and the list of ports proposed to move.</para>
|
|
|
|
<para>Before submitting, keep in mind that there is a fair
|
|
amount of work involved from multiple parties; that the
|
|
changes affect everyone who wants to keep up-to-date with
|
|
the entire ports tree; and that such proposals tend to
|
|
attract controversy.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>What do I need to do?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>The procedure is a strict superset of the one to
|
|
repocopy individual ports (see above).</para>
|
|
|
|
<para>File a PR in <application>GNATS</application>, listing the
|
|
reasons for the category request. Preferably, this should
|
|
also include patches for <filename>Makefile</filename>s for
|
|
the old ports, the <filename>Makefile</filename>s for their
|
|
old categories, and the <makevar>VALID_CATEGORIES</makevar>
|
|
definition in <filename>ports/Mk/bsd.port.mk</filename>.
|
|
Assign the PR to the &a.portmgr; (as <literal>portmgr</literal>).
|
|
If they approve it, it will be reassigned to &a.cvs; (as
|
|
<literal>cvs</literal>), who will do a repository copy from
|
|
the old to the new locations and reassign the PR back to you.
|
|
Once everything is done, perform the following steps:</para>
|
|
|
|
<procedure>
|
|
<step>
|
|
<para>Upgrade each copied port's
|
|
<filename>Makefile</filename>. Do not connect the
|
|
new category to the build yet.</para>
|
|
|
|
<para>To do this, you will need to:
|
|
<procedure>
|
|
<step>
|
|
<para>Change the port's <makevar>CATEGORIES</makevar>
|
|
(this was the point of the exercise, remember?)
|
|
The new category should be listed
|
|
<emphasis>first</emphasis>. This will help to
|
|
ensure that the the <makevar>PKGORIGIN</makevar>
|
|
is correct.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Run a <command>make describe</command>. Since
|
|
the top-level <command>make index</command> that
|
|
you will be running in a few steps is an iteration
|
|
of <command>make describe</command> over the entire
|
|
ports hierarchy, catching any errors here will
|
|
save you having to re-run that step later on.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>If you want to be really thorough, now might
|
|
be a good time to run &man.portlint.1;.</para>
|
|
</step>
|
|
</procedure>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Check that the <makevar>PKGORIGIN</makevar>s are
|
|
correct. The ports system uses each port's
|
|
<makevar>CATEGORIES</makevar> entry to create
|
|
its <makevar>PKGORIGIN</makevar>, which is used to
|
|
connect installed packages to the port directory they
|
|
were built from. If this entry is wrong, common port
|
|
tools like &man.pkg.version.1; and
|
|
&man.portupgrade.1; fail.</para>
|
|
|
|
<para>To do this, use the <filename>chkorigin.sh</filename>
|
|
tool, as follows: <command>env
|
|
PORTSDIR=<replaceable>/path/to/ports</replaceable>
|
|
sh -e <replaceable>/path/to/ports</replaceable>/Tools/scripts/chkorigin.sh
|
|
</command>. This will check <emphasis>every</emphasis>
|
|
port in the ports tree, even those not connected to the
|
|
build, so you can run it directly after the repocopy.
|
|
Hint: do not forget to look at the
|
|
<makevar>PKGORIGIN</makevar>s of any slave ports of the
|
|
ports you just repocopied!</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>On your own local system, test the proposed
|
|
changes: first, comment out the
|
|
<makevar>SUBDIR</makevar> entries in the old
|
|
ports' categories' <filename>Makefile</filename>s;
|
|
then enable building the new category in
|
|
<filename>ports/Makefile</filename>.
|
|
Run <command>make checksubdirs</command> in the
|
|
affected category directories to check the
|
|
<makevar>SUBDIR</makevar> entries. Next, in
|
|
the <filename class="directory">ports/</filename>
|
|
directory, run <command>make index</command>. This
|
|
can take over 40 minutes on even modern systems;
|
|
however, it is a necessary step to prevent problems
|
|
for other people.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Once this is done, you can commit the
|
|
updated <filename>ports/Makefile</filename> to
|
|
connect the new category to the build and also
|
|
commit the <filename>Makefile</filename> changes
|
|
for the old category or categories.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Change all the affected module entries in
|
|
<filename>CVSROOT-ports/modules</filename>.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Add appropriate entries to
|
|
<filename>ports/MOVED</filename>.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Update the instructions for &man.cvsup.1; by
|
|
modifying <filename>distrib/cvsup/sup/README</filename>
|
|
and adding the following files into
|
|
<filename>cvsup/sup/ports-categoryname</filename>:
|
|
<filename>list.cvs</filename> and
|
|
<filename>releases</filename>. (Note: these are
|
|
in the src, not the ports, repository).</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Submit a docs PR to add the new category to both the
|
|
<ulink url="../../books/porters-handbook/makefile-categories.html#PORTING-CATEGORIES">
|
|
Porter's Handbook</ulink> and to
|
|
<filename>www/en/ports/categories</filename>.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>The procedure to update the <ulink
|
|
url="../../../../ports/index.html">ports web pages</ulink>
|
|
to reflect the new category is not yet defined.</para>
|
|
</step>
|
|
|
|
<step>
|
|
<para>Only once all the above have been done, and
|
|
no one is any longer reporting problems with the
|
|
new ports, should the old ports be deleted from
|
|
their previous locations in the repository.</para>
|
|
</step>
|
|
</procedure>
|
|
</answer>
|
|
</qandaentry>
|
|
</qandadiv>
|
|
|
|
<qandadiv>
|
|
<title>Miscellaneous Questions</title>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>How do I know if my port is building correctly or
|
|
not?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>First, go check
|
|
<ulink url="http://bento.FreeBSD.org/errorlogs/"></ulink>.
|
|
There you will find error logs from the latest package
|
|
building runs on all supported platforms for the most
|
|
recent branches.</para>
|
|
|
|
<para>However, just because the port does not show up there
|
|
does not mean it is building correctly. (One of the
|
|
dependencies may have failed, for instance.) Here are
|
|
the relevant directories on <hostid>bento</hostid>, so feel free to dig
|
|
around.</para>
|
|
|
|
<programlisting> /a/asami/portbuild/<arch>/<major_version>/errors error logs from latest <major_version> run on <arch>
|
|
/logs all logs from latest <major_version> run on <arch>
|
|
/packages packages from latest <major_version> run on <arch>
|
|
/bak/errors error logs from last complete <major_version> run on <arch>
|
|
/bak/logs all logs from last complete <major_version> run on <arch>
|
|
/bak/packages packages from last complete <major_version> run on <arch>
|
|
</programlisting>
|
|
|
|
<para>Basically, if the port shows up in
|
|
<filename>packages</filename>, or it is in
|
|
<filename>logs</filename> but not in
|
|
<filename>errors</filename>, it built fine. (The
|
|
<filename>errors</filename> directories are what you get
|
|
from the web page.)</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>I added a new port. Do I need to add it to the
|
|
<filename>INDEX</filename>?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>No. The ports manager will regenerate the
|
|
<filename>INDEX</filename> and commit it every few
|
|
days.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>Are there any other files I am not allowed to
|
|
touch?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>Any file directly under <filename>ports/</filename>, or
|
|
any file under a subdirectory that starts with an
|
|
uppercase letter (<filename>Mk/</filename>,
|
|
<filename>Tools/</filename>, etc.). In particular, the
|
|
ports manager is very protective of
|
|
<filename>ports/Mk/bsd.port*.mk</filename> so do not
|
|
commit changes to those files unless you want to face his
|
|
wra(i)th.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>What is the proper procedure for updating the checksum
|
|
for a port's distfile when the file changes without a
|
|
version change?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>When the checksum for a port's distfile is updated due
|
|
to the author updating the file without changing the port's
|
|
revision, the commit message should include a summary of
|
|
the relevant diffs between the original and new distfile to
|
|
ensure that the distfile has not been corrupted or
|
|
maliciously altered. If the current version of the port
|
|
has been in the ports tree for a while, a copy of the old
|
|
distfile will usually be available on the ftp servers;
|
|
otherwise the author or maintainer should be contacted to
|
|
find out why the distfile has changed.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
</qandadiv>
|
|
</qandaset>
|
|
</sect1>
|
|
|
|
<sect1 id="perks">
|
|
<title>Perks of the Job</title>
|
|
|
|
<para>Unfortunately, there are not many perks involved with being a
|
|
committer. Recognition as a competent software engineer is probably
|
|
the only thing that will be of benefit in the long run. However,
|
|
there are at least some perks:</para>
|
|
|
|
<variablelist>
|
|
|
|
<varlistentry>
|
|
<term>Direct access to <hostid>cvsup-master</hostid></term>
|
|
|
|
<listitem>
|
|
<para>As a committer, you may apply to &a.kuriyama; for direct access
|
|
to <hostid role="fqdn">cvsup-master.FreeBSD.org</hostid>,
|
|
providing the public key output from <command>cvpasswd
|
|
<replaceable>yourusername</replaceable>@FreeBSD.org
|
|
freefall.FreeBSD.org</command>. Please note: you must
|
|
specify <hostid>freefall.FreeBSD.org</hostid> on the
|
|
<command>cvpasswd</command> command line even though the
|
|
actual server is <hostid>cvsup-master</hostid>. Access to
|
|
<hostid>cvsup-master</hostid> should not be overused as it is
|
|
a busy machine.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
<varlistentry>
|
|
<term>A Free 4-CD Set or DVD Subscription</term>
|
|
|
|
<listitem>
|
|
<para><ulink url="http://www.freebsdmall.com">FreeBSD Mall,
|
|
Inc.</ulink> offers a free subscription of the 4-CD set or
|
|
the DVD product to all FreeBSD committers. Information about how
|
|
to obtain your free media is mailed to
|
|
<email>developers@FreeBSD.org</email> following each major
|
|
release.</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
|
|
</variablelist>
|
|
</sect1>
|
|
|
|
<sect1 id="misc">
|
|
<title>Miscellaneous Questions</title>
|
|
|
|
<qandaset>
|
|
<qandaentry>
|
|
<question>
|
|
<para>Why are trivial or cosmetic changes to files on a vendor
|
|
branch a bad idea?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<itemizedlist>
|
|
<listitem>
|
|
<para>From now on, every new vendor release of that file will
|
|
need to have patches merged in by hand.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>From now on, every new vendor release of that file will
|
|
need to have patches <emphasis>verified</emphasis> by hand.</para>
|
|
</listitem>
|
|
|
|
<listitem>
|
|
<para>The <option>-j</option> option does not work very well.
|
|
Ask &a.obrien; for horror stories.</para>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>How do I add a new file to a CVS branch?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>To add a file onto a branch, simply checkout or update
|
|
to the branch you want to add to and then add the file using
|
|
<command>cvs add</command> as you normally would. For
|
|
example, if you wanted to MFC the file
|
|
<filename>src/sys/alpha/include/smp.h</filename> from HEAD
|
|
to RELENG_4 and it does not exist in RELENG_4 yet, you would
|
|
use the following steps:</para>
|
|
|
|
<example>
|
|
<title>MFC'ing a New File</title>
|
|
|
|
<screen>&prompt.user; <userinput>cd sys/alpha/include</userinput>
|
|
&prompt.user; <userinput>cvs update -rRELENG_4</userinput>
|
|
cvs update: Updating .
|
|
U clockvar.h
|
|
U console.h
|
|
...
|
|
&prompt.user; <userinput>cvs update -kk -Ap smp.h > smp.h</userinput>
|
|
===================================================================
|
|
Checking out smp.h
|
|
RCS: /usr/cvs/src/sys/alpha/include/smp.h,v
|
|
VERS: 1.1
|
|
***************
|
|
&prompt.user; <userinput>cvs add smp.h</userinput>
|
|
cvs add: scheduling file `smp.h' for addition on branch `RELENG_4'
|
|
cvs add: use 'cvs commit' to add this file permanently
|
|
&prompt.user; <userinput>cvs commit</userinput>
|
|
</screen>
|
|
</example>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>What <quote>meta</quote> information should I include in a
|
|
commit message?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>As well as including an informative message with each commit
|
|
you may need to include some additional information as
|
|
well.</para>
|
|
|
|
<para>This information consists of one or more lines containing the
|
|
key word or phrase, a colon, tabs for formatting, and then the
|
|
additional information.</para>
|
|
|
|
<para>The key words or phrases are:</para>
|
|
|
|
<informaltable frame="none">
|
|
<tgroup cols="2">
|
|
<tbody>
|
|
<row>
|
|
<entry><literal>PR:</literal></entry>
|
|
<entry>The problem report (if any) which is affected
|
|
(typically, by being closed) by this commit.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>Submitted by:</literal></entry>
|
|
<entry>The name and e-mail address of the person that
|
|
submitted the fix; for committers, just the username on
|
|
the FreeBSD cluster.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>Reviewed by:</literal></entry>
|
|
<entry>The name and e-mail address of the person or people
|
|
that reviewed the change; for committers, just the
|
|
username on the FreeBSD cluster. If a patch was
|
|
submitted to a mailing list for review, and the review
|
|
was favorable, then just include the list name.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>Approved by:</literal></entry>
|
|
<entry>The name and e-mail address of the person or people
|
|
that approved the change; for committers, just the
|
|
username on the FreeBSD cluster. It is customary to get
|
|
prior approval for a commit if it is to an area of the
|
|
tree to which you do not usually commit. In addition,
|
|
during the run up to a new release all commits
|
|
<emphasis>must</emphasis> be approved by the release
|
|
engineering team. If these are your first commits then
|
|
you should have passed them past your mentor first, and
|
|
you should list your mentor, as in
|
|
``<replaceable>username-of-mentor</replaceable>
|
|
<literal>(mentor)</literal>''.
|
|
</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>Obtained from:</literal></entry>
|
|
<entry>The name of the project (if any) from which the code
|
|
was obtained.</entry>
|
|
</row>
|
|
|
|
<row>
|
|
<entry><literal>MFC after:</literal></entry>
|
|
|
|
<entry>If you wish to receive an e-mail reminder to
|
|
<acronym>MFC</acronym> at a later date, specify the
|
|
number of days, weeks, or months after which an
|
|
<acronym>MFC</acronym> is planned.</entry>
|
|
</row>
|
|
</tbody>
|
|
</tgroup>
|
|
</informaltable>
|
|
|
|
<example>
|
|
<title>Commit log for a commit based on a PR</title>
|
|
|
|
<para>You want to commit a change based on a PR submitted by John
|
|
Smith containing a patch. The end of the commit message should
|
|
look something like this.</para>
|
|
|
|
<programlisting>...
|
|
|
|
PR: foo/12345
|
|
Submitted by: John Smith <John.Smith@example.com></programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>Commit log for a commit needing review</title>
|
|
|
|
<para>You want to change the virtual memory system. You have
|
|
posted patches to the appropriate mailing list (in this case,
|
|
<literal>freebsd-arch</literal>) and the changes have been
|
|
approved.</para>
|
|
|
|
<programlisting>...
|
|
|
|
Reviewed by: -arch</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>Commit log for a commit needing approval</title>
|
|
|
|
<para>You want to commit a change to a section of the tree with a
|
|
MAINTAINER assigned. You have collaborated with the listed
|
|
MAINTAINER, who has told you to go ahead and commit.</para>
|
|
|
|
<programlisting>...
|
|
|
|
Approved by: <replaceable>abc</replaceable></programlisting>
|
|
|
|
<para>Where <replaceable>abc</replaceable> is the account name of
|
|
the person who approved.</para>
|
|
</example>
|
|
|
|
<example>
|
|
<title>Commit log for a commit bringing in code from
|
|
OpenBSD</title>
|
|
|
|
<para>You want to commit some code based on work done in the
|
|
OpenBSD project.</para>
|
|
|
|
<programlisting>...
|
|
|
|
Obtained from: OpenBSD</programlisting>
|
|
</example>
|
|
|
|
<example>
|
|
<title>Commit log for a change to &os.current; with a planned
|
|
commit to &os.stable; to follow at a later date.</title>
|
|
|
|
<para>You want to commit some code which will be merged from
|
|
&os.current; into the &os.stable; branch after two
|
|
weeks.</para>
|
|
|
|
<programlisting>...
|
|
|
|
MFC after: <replaceable>2 weeks</replaceable></programlisting>
|
|
|
|
<para>Where <replaceable>2</replaceable> is the number of days,
|
|
weeks, or months after which an <acronym>MFC</acronym> is
|
|
planned. The <replaceable>weeks</replaceable> option may be
|
|
<literal>day</literal>, <literal>days</literal>,
|
|
<literal>week</literal>, <literal>weeks</literal>,
|
|
<literal>month</literal>, <literal>months</literal>,
|
|
or may be left off (in which case, days will be assumed).</para>
|
|
</example>
|
|
|
|
<para>In some cases you may need to combine some of these.</para>
|
|
|
|
<para>Consider the situation where a user has submitted a PR
|
|
containing code from the NetBSD project. You are looking at the
|
|
PR, but it is not an area of the tree you normally work in, so
|
|
you have decided to get the change reviewed by the
|
|
<literal>arch</literal> mailing list. Since the change is
|
|
complex, you opt to <acronym>MFC</acronym> after one month to
|
|
allow adequate testing.</para>
|
|
|
|
<para>The extra information to include in the commit would look
|
|
something like</para>
|
|
|
|
<programlisting>PR: foo/54321
|
|
Submitted by: John Smith <John.Smith@example.com>
|
|
Reviewed by: -arch
|
|
Obtained from: NetBSD
|
|
MFC after: 1 month</programlisting>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>How do I access <hostid
|
|
role="fqdn">people.FreeBSD.org</hostid> to put up personal
|
|
or project information?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para><hostid role="fqdn">people.FreeBSD.org</hostid> is the
|
|
same as <hostid
|
|
role="fqdn">freefall.FreeBSD.org</hostid>. Just create a
|
|
<filename>public_html</filename> directory. Anything you
|
|
place in that directory will automatically be visible
|
|
under <ulink url="http://people.FreeBSD.org/"></ulink>.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry>
|
|
<question>
|
|
<para>Where are the mailing list archives stored?</para>
|
|
</question>
|
|
|
|
<answer>
|
|
<para>The mailing lists are archived under <filename>/g/mail</filename>
|
|
which will show up as <filename>/hub/g/mail</filename> with &man.pwd.1;.
|
|
This location is accessible from any machine on the FreeBSD cluster.</para>
|
|
</answer>
|
|
</qandaentry>
|
|
</qandaset>
|
|
</sect1>
|
|
</article>
|