[trivial PATCH 12/22] [otp_mppe.c] eliminate build warnings
Jeffrey Hutzelman
jhutz at cmu.edu
Tue Feb 2 01:19:06 CET 2010
--On Tuesday, February 02, 2010 12:01:04 AM +0100 Alan DeKok
<aland at deployingradius.com> wrote:
> Frank Cusack wrote:
>> Grouping 22 1-line patches into a single changeset is not large. OTOH
>> submitting them as 22 individual patches belies a naive understanding
>> of source control, and actually makes merging that much more difficult,
>> or at least time consuming.
>
> I also prefer changes to function prototypes to be in the same patch
> as changes to the functions... otherwise the build breaks.
If you'll allow me to borrow the soapbox for a moment...
The guiding principal I've often seen and used is typically expressed as
"one change per patch; one patch per change". That is, the fundamental
property of interest is not size, but the number of logically separate
changes which are part of the same patch. The correct number is always
exactly one.
Multiple related edits like changing a function's prototype, making the
corresponding change to its definition, and updating all of the call sites
are really a single change, and should be part of the same patch, and thus
the same commit.
The same goes for a group of edits spread across the tree that introduce a
new feature or fix a bug. If they're part of one logical change, they
should be part of one commit. A good rule to use here is to combine things
that are syntactically or semantically interdependent, such that applying
only part of the change results in a tree that doesn't build or that no
longer works correctly.
The flip side is that unrelated things should generally not be part of the
same patch. Don't fix a bug and add a feature in the same patch. Or fix
two bugs, or add two features. That goes triple for keeping
cosmetic/stylistic changes such as a reindent separate from warning
elimination, and both separate from actual functional changes.
Putting unrelated changes in the same patch makes that patch harder to
review, makes it harder to accept one change but not the other (which may
result in the whole thing being rejected), and makes it harder to track
down what happened if one of those changes introduced a bug. "git bisect"
is a powerful tool for tracking down when a problem was introduced, but
can't split the difference between two changes that were part of the same
commit.
There is, of course, some grey here. Some projects prefer to get things
like reindent or warning elimination in larger chunks, arguing that such
changes are related even if not interdependent, and are actually easier to
merge and review in large batches. Alan has clearly indicated his
preference to be the opposite, and around here, he gets to decide.
Similarly, it may often be possible to take a large set of changes to add a
complex new feature, and break it down into smaller parts, each building on
the last. Such things are often easier to review and test, which is always
a good thing.
-- Jeffrey T. Hutzelman (N3NHS) <jhutz+ at cmu.edu>
Carnegie Mellon University - Pittsburgh, PA
More information about the Freeradius-Devel
mailing list