[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

[PATCH] Best practices #2

From: Scott Lamb <slamb_at_slamb.org>
Date: 2002-08-08 22:25:12 CEST

Revised version after Karl's comments.

-- 
Scott Lamb
Add "Best Practices" chapter to handbook.
* doc/handbook/best_practices.texi:
  New file with tips to use Subversion more effectively.
* doc/handbook/svn-handbook.texi:
  Link to new chapter.
Index: ./doc/handbook/svn-handbook.texi
===================================================================
--- ./doc/handbook/svn-handbook.texi
+++ ./doc/handbook/.svn/tmp/svn-handbook.texi.62476.00001.tmp	Thu Aug  8 15:08:56 2002
@@ -97,12 +97,14 @@
 * Getting Started::           History, installation and overview of Subversion.
 * Client Cookbook::           How to use the Subversion client.
 * Repository Administration:: Managing a repository.
+* Best Practices::            Tips to use Subversion more effectively.
 * Appendices::                Other useful documents and pointers.
 @end menu
 
 @include getting_started.texi
 @include client.texi
 @include repos_admin.texi
+@include best_practices.texi
 @include appendices.texi
 
 @bye
Index: ./doc/handbook/best_practices.texi
===================================================================
--- ./doc/handbook/best_practices.texi
+++ ./doc/handbook/best_practices.texi	Thu Aug  8 15:04:54 2002
@@ -0,0 +1,202 @@
+@node Best Practices
+@chapter Best Practices
+
+Tips to use Subversion more effectively.
+
+In this chapter, we'll focus on how to avoid some pitfalls of version
+control systems in general and Subversion specifically.
+
+@menu
+* Source code formatting::
+* When you commit::
+@end menu
+
+
+
+@c ------------------------------------------------------
+@node Source code formatting
+@section Source code formatting
+
+Subversion diffs and merges text files work on a line-by-line basis. They
+don't understand the syntax of programming languages or even know when
+you've just reflowed text to a different line width.
+
+Given this design, it's important to avoid unnecessary reformatting. It
+creates unnecessary conflicts when merging branches, updating working
+copies, and applying patches. It also can drown you in noise when viewing
+differences between revisions.
+
+You can avoid these problems by following clearly-defined formatting rules.
+The Subversion project's own
+@uref{http://svn.collab.net/repos/svn/trunk/HACKING,HACKING} document and
+the @uref{http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html,Code
+Conventions for the Java Programming Language} are good examples.
+
+Tabs are particularly important. Some projects, like Subversion, do not use
+tabs at all in the source tree. Others always use them and define a
+particular tab size.
+
+It can be very helpful to have an editor smart enough to help adhere to
+these rules. For example, @command{vim} can do this on a per-project basis
+with @file{.vimrc} commands like the following:
+
+@verbatim
+autocmd BufRead,BufNewFile */rapidsvn/*.{cpp,h}
+    setlocal ts=4 noexpandtab
+autocmd BufRead,BufNewFile */subversion/*.[ch]
+    setlocal sw=2 expandtab cinoptions=>2sn-s{s^-s:s
+@end verbatim
+
+Check your favorite editor's documentation for more information.
+
+@subsection When you have to reformat
+
+In the real world, we're not always so perfect. Formatting preferences may
+change over time, or we may just make mistakes. There are things you can do
+to minimize the problems of reformatting.
+
+These are good guidelines to follow:
+
+@itemize @bullet
+@item If you're making a sweeping reformatting change, do it in a single
+commit with no semantic changes. Give precise directions on duplicating
+formatting changes.
+@item If you've made semantic changes to some area of code and see
+inconsistent formatting in the immediate context, it's okay to reformat.
+Causing conflicts is not as great a concern because your semantic changes
+are likely to do that anyway.
+@end itemize
+
+Here's an example of a sweeping reformat:
+
+@example
+$ svn co file:///repo/path/trunk indent_wc
+$ indent -gnu indent_wc/src/*.[ch]
+$ svn commit -m 'Ran indent -gnu src/*.[ch]' indent_wc
+@end example
+
+This follows all rules: there were no semantic changes mixed in (no files
+were changed other than through @command{indent}). The @command{indent}
+commandline was given, so the changes can be very easily duplicated. All the
+reformatting was done in a single revision.
+
+Let's say these changes occurred to the trunk at revision 26. The head
+revision is now 42. You created a branch at revision 13 and now want to
+merge it back into the trunk. Ordinarily you'd do this:
+
+@example
+$ svn co file://repo/path/trunk merge_wc
+$ svn merge -r 13:head file://repo/path/branches/mybranch merge_wc
+@dots{} # resolve conflicts
+$ svn commit -m 'Merged branch'
+@end example
+
+But with the reformatting changes, there will be many, many conflicts. If
+you follow these rules, you can merge more easily:
+
+@example
+$ svn co -r 25 file://repo/path/trunk merge_wc
+$ svn merge -r 13:head file://repo/path/branches/mybranch merge_wc
+@dots{} # resolve conflicts
+$ indent -gnu src/*.[ch]
+$ svn up
+@dots{} # resolve conflicts
+$ svn commit -m 'Merged branch'
+@end example
+
+In English, the procedure is:
+
+@itemize @bullet
+@item Check out a pre-reformatting trunk working copy.
+@item Merge all branch changes. Fix conflicts.
+@item Reformat in the same manner.
+@item Update to the head revision. Fix conflicts.
+@item Check in the merged working copy.
+@end itemize
+
+@subsection Ignoring whitespace differences
+
+When viewing differences between revisions, you can customize
+@command{svn diff} output to hide whitespace changes. The @samp{-x} argument
+passes arguments through to GNU diff. Here are some useful arguments:
+
+@table @b
+@item @samp{-b}
+Ignore differences in whitespace only.
+@item @samp{-B}
+Ignore added/removed blank lines.
+@item @samp{-i}
+Ignore changes in case.
+@item @samp{-t}
+Expand tabs to spaces to preserve alignment.
+@item @samp{-T}
+Output a tab rather than a space at the beginning of each line to start on a
+tab stop.
+@end table
+
+The commit emails always show whitespace-only changes.
+@file{commit-email.pl} uses @command{svnlook diff} to get differences, which
+doesn't support the @samp{-x} option.
+
+@subsection Line endings
+
+Different platforms (Unix, Windows, MacOS) have different conventions for
+marking the line endings of text files. Simple editors may rewrite line
+endings, causing problems with diff and merge. This is a subset of the
+formatting problems.
+
+Subversion has built-in support for normalizing line endings. To enable it,
+set the @samp{svn:eol-style} property to ``native''. @xref{Properties}.
+
+
+@c ------------------------------------------------------
+@node When you commit
+@section When you commit
+
+It pays to take some time before you commit to review your changes and
+create an appropriate log message. You are publishing the newly changed
+project anew every time you commit. This is true in two senses:
+
+@itemize @bullet
+@item When you commit, you are potentially destabilizing the head revision.
+Many projects have a policy that the head revision is ``stable'' --- it
+should always parse/compile, it should always pass unit tests, etc. If you
+don't get something right, you may be inconveniencing an arbitrary number of
+people until someone commits a fix.
+@item You can not easily remove revisions. (There is no equivalent to
+@samp{cvs admin -o}.) If you might not want something to be in the
+repository, make sure it is not included in your commit.  Check for
+sensitive information, autogenerated files, and unnecessary large files.
+@end itemize
+
+If you later don't like your log message, it is possible to change it. The
+@samp{svnadmin setlog} command will do this locally. You can set up the
+@uref{http://svn.collab.net/repos/svn/trunk/tools/cgi/tweak-log.cgi,tweak-log.cgi}
+script to allow the same thing remotely. All the same, creating a good log
+message beforehand helps clarify your thoughts and avoid committing a mistake.
+
+You should run a @samp{svn diff} before each commit and ask yourself:
+
+@itemize @bullet
+@item do these changes belong together? It's best that each revision is a
+single logical change. It's very easy to forget that you've started another
+change.
+@item do I have a log entry for these changes?
+@end itemize
+
+Defining a log entry policy is also helpful --- the Subversion
+@uref{http://svn.collab.net/repos/svn/trunk/HACKING,HACKING} document is a
+good model. If you always embed filenames, function names, etc. then you can
+easily search through the logs with
+@uref{http://svn.collab.net/repos/svn/trunk/tools/client-side/search-svnlog.pl,search-svnlog.pl}.
+
+You may want to write the log entry as you go. It's common to create a file
+@file{changes} with your log entry in progress. When you commit, use
+@samp{svn ci -F changes}.
+
+@subsection Binary files
+
+Subversion does not have any way to merge or view differences of binary
+files, so it's critical that these have accurate log messages. Since you
+can't review your changes with @samp{svn diff} immediately before
+committing, it's a particularly good idea to write the log entry as you go.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Thu Aug 8 22:28:10 2002

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.