summaryrefslogtreecommitdiffstats
path: root/contrib/subversion/doc/programmer/WritingChangeLogs.txt
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/subversion/doc/programmer/WritingChangeLogs.txt')
-rw-r--r--contrib/subversion/doc/programmer/WritingChangeLogs.txt220
1 files changed, 220 insertions, 0 deletions
diff --git a/contrib/subversion/doc/programmer/WritingChangeLogs.txt b/contrib/subversion/doc/programmer/WritingChangeLogs.txt
new file mode 100644
index 0000000..c5f50cd
--- /dev/null
+++ b/contrib/subversion/doc/programmer/WritingChangeLogs.txt
@@ -0,0 +1,220 @@
+This is an essay by Jim Blandy <jimb@redhat.com> on maintaining
+ChangeLog entries.
+
+Although Subversion generates its ChangeLogs from svn log data,
+instead of keeping independent ChangeLog files, most of the advice
+below is as applicable to cvs log messages as to ChangeLog entries.
+
+
+Maintaining the ChangeLog
+=========================
+
+A project's ChangeLog provides a history of development. Comments in
+the code should explain the code's present state, but ChangeLog
+entries should explain how and when it got that way. The ChangeLog
+must show:
+
+* the relative order in which changes entered the code, so you can
+ see the context in which a change was made, and
+
+* the date at which the change entered the code, so you can relate the
+ change to outside events, like branch cuts, code freezes, and
+ releases.
+
+In the case of CVS, these refer to when the change was committed,
+because that is the context in which other developers will see the
+change.
+
+Every change to the sources should have a ChangeLog entry. The value
+of the ChangeLog becomes much less if developers cannot rely on its
+completeness. Even if you've only changed comments, write an entry
+that says, "Doc fix." The only changes you needn't log are small
+changes that have no effect on the source, like formatting tweaks.
+
+In order to keep the ChangeLog a manageable size, at the beginning of
+each year, the ChangeLog should be renamed to "ChangeLog-YYYY", and a
+fresh ChangeLog file started.
+
+
+How to write ChangeLog entries
+------------------------------
+
+ChangeLog entries should be full sentences, not sentence fragments.
+Fragments are more often ambiguous, and it takes only a few more
+seconds to write out what you mean. Fragments like `New file' or `New
+function' are acceptable, because they are standard idioms, and all
+further details should appear in the source code.
+
+The log entry should mention every file changed. It should also
+mention by name every function, variable, macro, makefile target,
+grammar rule, etc. you changed. However, there are common-sense
+exceptions:
+
+* If you have made a change which requires trivial changes throughout
+ the rest of the program (e.g., renaming a variable), you needn't
+ name all the functions affected.
+
+* If you have rewritten a file completely, the reader understands that
+ everything in it has changed, so your log entry may simply give the
+ file name, and say "Rewritten".
+
+In general, there is a tension between making entries easy to find by
+searching for identifiers, and wasting time or producing unreadable
+entries by being exhaustive. Use your best judgement --- and be
+considerate of your fellow developers.
+
+Group ChangeLog entries into "paragraphs", separated by blank lines.
+Each paragraph should be a set of changes that accomplish a single
+goal. Independent changes should be in separate paragraphs. For
+example:
+
+ 1999-03-24 Stan Shebs <shebs@andros.cygnus.com>
+
+ * configure.host (mips-dec-mach3*): Use mipsm3, not mach3.
+
+ Attempt to sort out SCO-related configs.
+ * configure.host (i[3456]86-*-sysv4.2*): Use this instead of
+ i[3456]86-*-sysv4.2MP and i[3456]86-*-sysv4.2uw2*.
+ (i[3456]86-*-sysv5*): Recognize this.
+ * configure.tgt (i[3456]86-*-sco3.2v5*, i[3456]86-*-sco3.2v4*):
+ Recognize these.
+
+Even though this entry describes two changes to `configure.host',
+they're in separate paragraphs, because they're unrelated changes.
+The second change to `configure.host' is grouped with another change
+to `configure.tgt', because they both serve the same purpose.
+
+Also note that the author has kindly recorded his overall motivation
+for the paragraph, so we don't have to glean it from the individual
+changes.
+
+The header line for the ChangeLog entry should have the format shown
+above. If you are using an old version of Emacs (before 20.1) that
+generates entries with more verbose dates, consider using
+`etc/add-log.el', from the GDB source tree. If you are using vi,
+consider using the macro in `etc/add-log.vi'. Both of these generate
+entries in the newer, terser format.
+
+One should never need the ChangeLog to understand the current code.
+If you find yourself writing a significant explanation in the
+ChangeLog, you should consider carefully whether your text doesn't
+actually belong in a comment, alongside the code it explains. Here's
+an example of doing it right:
+
+ 1999-02-23 Tom Tromey <tromey@cygnus.com>
+
+ * cplus-dem.c (consume_count): If `count' is unreasonable,
+ return 0 and don't advance input pointer.
+
+And then, in `consume_count' in `cplus-dem.c':
+
+ while (isdigit ((unsigned char)**type))
+ {
+ count *= 10;
+ count += **type - '0';
+ /* A sanity check. Otherwise a symbol like
+ `_Utf390_1__1_9223372036854775807__9223372036854775'
+ can cause this function to return a negative value.
+ In this case we just consume until the end of the string. */
+ if (count > strlen (*type))
+ {
+ *type = save;
+ return 0;
+ }
+
+This is why a new function, for example, needs only a log entry saying
+"New Function" --- all the details should be in the source.
+
+Avoid the temptation to abbreviate filenames or function names, as in
+this example (mostly real, but slightly exaggerated):
+
+ * gdbarch.[ch] (gdbarch_tdep, gdbarch_bfd_arch_info,
+ gdbarch_byte_order, {set,}gdbarch_long_bit,
+ {set,}gdbarch_long_long_bit, {set,}gdbarch_ptr_bit): Corresponding
+ functions.
+
+This makes it difficult for others to search the ChangeLog for changes
+to the file or function they are interested in. For example, if you
+searched for `set_gdbarch_long_bit', you would not find the above
+entry, because the writer used CSH-style globbing to abbreviate the
+list of functions. If you gave up, and made a second pass looking for
+gdbarch.c, you wouldn't find that either. Consider your poor readers,
+and write out the names.
+
+
+ChangeLogs and the CVS log
+--------------------------
+
+CVS maintains its own logs, which you can access using the `cvs log'
+command. This duplicates the information present in the ChangeLog,
+but binds each entry to a specific revision, which can be helpful at
+times.
+
+However, the CVS log is no substitute for the ChangeLog files.
+
+* CVS provides no easy way to see the changes made to a set of files
+ in chronological order. They're sorted first by filename, not by date.
+
+* Unless you put full ChangeLog paragraphs in your CVS log entries, it's
+ difficult to pull together changes that cross several files.
+
+* CVS doesn't segregate log entries for branches from those for the
+ trunk in any useful way.
+
+In some circumstances, though, the CVS log is more useful than the
+ChangeLog, so we maintain both. When you commit a change, you should
+provide appropriate text in both the ChangeLog and the CVS log.
+
+It is not necessary to provide CVS log entries for ChangeLog changes,
+since it would simply duplicate the contents of the file itself.
+
+
+Writing ChangeLog entries for merges
+------------------------------------
+
+Revision management software like CVS can introduce some confusion
+when writing ChangeLog entries. For example, one might write a change
+on a branch, and then merge it into the trunk months later. In that
+case, what position and date should the developer use for the
+ChangeLog entry --- that of the original change, or the date of the
+merge?
+
+The principles described at the top need to hold for both the original
+change and the merged change. That is:
+
+* On the branch (or trunk) where the change is first committed, the
+ ChangeLog entry should be written as normal, inserted at the top of
+ the ChangeLog and reflecting the date the change was committed to
+ the branch (or trunk).
+
+* When the change is then merged (to the trunk, or to another branch),
+ the ChangeLog entry should have the following form:
+
+ 1999-03-26 Jim Blandy <jimb@zwingli.cygnus.com>
+
+ Merged change from foobar_20010401_branch:
+
+ 1999-03-16 Keith Seitz <keiths@cygnus.com>
+ [...]
+
+ In this case, "Jim Blandy" is doing the merge on March 26; "Keith
+ Seitz" is the original author of the change, who committed it to
+ `foobar_20010401_branch' on March 16.
+
+ As shown here, the entry for the merge should be like any other
+ change --- inserted at the top of the ChangeLog, and stamped with
+ the date the merge was committed. It should indicate the origin of
+ the change, and provide the full text of the original entry,
+ indented to avoid being confused with a true log entry. Remember
+ that people looking for the merge will search for the original
+ changelog text, so it's important to preserve it unchanged.
+
+ For the merge entry, we use the merge date, and not the original
+ date, because this is when the change appears on the trunk or branch
+ this ChangeLog documents. Its impact on these sources is
+ independent of when or where it originated.
+
+This approach preserves the structure of the ChangeLog (entries appear
+in order, and dates reflect when they appeared), but also provides
+full information about changes' origins.
+
OpenPOWER on IntegriCloud