[eluser]Jim OHalloran[/eluser]
I generally use a 3 place numbering system... Which I use as major.minor.release. I bump the release number whenever bugfixes are made (1.0.0 + bug fixes is released as 1.0.1). Bump the minor version for feature enhancements (1.0.1 + new features is released as 1.2.0). Increases in major version are reserved for redesigns, rewrites and major new features (i.e. 1.2.0 when rewritten is released as 2.0.0).
A 1.0 release indicates "stability" in a lot of people's eyes. I always want to releasse 0.x versions until I beleive the app is reasonably stable, but I think it's important to get to 1.0 as soon as possible. That may mean releasing 1.0 in a stable form with a smaller featureset, then following up with 2.0 once the originally planned featureset is done.
One thing I think you always want to avoid is having two different releases with the same version number. Even the smallest bugfix should get a new version, otherwise it's really difficult to track ("have I got the old 1.0.1 or the new 1.0.1", vs "I've got 1.0.1 and 1.0.2 has just been released").
As far as managing all this in code goes, I usually Declare the current version number as a constant in a configuration file (or similar) which then gets included into every script. I try to avoid using version numbers, etc in docblocks to avoid changing those with every release. You can get the current revision number from subversion, and use that as a constant in your code, but that's not as useful as it seems (I tried it once on another project and it was a bit awkward to manage).
Hope that helps.
Jim.