Skip to content

Commit

Permalink
Committed to semantic versioning
Browse files Browse the repository at this point in the history
as prompted by #365, #430, #447 and a thread on the google group.
- split version bumping out of generateSingleHeader script
- separate scripts for bumping each version component
- "build" number only incremented for "develop" builds
  • Loading branch information
philsquared committed Jun 29, 2015
1 parent f5fef1e commit 21f7ef6
Show file tree
Hide file tree
Showing 13 changed files with 238 additions and 132 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
![catch logo](catch-logo-small.png)

*v1.1 build 3 (master branch)*
*v1.2.0*

Build status (on Travis CI) [![Build Status](https://travis-ci.org/philsquared/Catch.png)](https://travis-ci.org/philsquared/Catch)

Expand Down
2 changes: 1 addition & 1 deletion docs/contributing.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ If you are contributing to the code base there are a few simple guidelines to ke

## Branches

Ongoing development is on the "develop" branch, or on feature branches that are branched off of develop. Please target any pull requests at develop, or, for larger chunks of work, a branch off of develop.
Ongoing development is on the "develop" branch (if there is one, currently), or on feature branches that are branched off of develop. Please target any pull requests at develop, or, for larger chunks of work, a branch off of develop.

## Directory structure

Expand Down
14 changes: 5 additions & 9 deletions include/catch_runner.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,12 +126,7 @@ namespace Catch {
}

void showHelp( std::string const& processName ) {
Catch::cout() << "\nCatch v" << libraryVersion.majorVersion << "."
<< libraryVersion.minorVersion << " build "
<< libraryVersion.buildNumber;
if( libraryVersion.branchName != std::string( "master" ) )
Catch::cout() << " (" << libraryVersion.branchName << " branch)";
Catch::cout() << "\n";
Catch::cout() << "\nCatch v" << libraryVersion << "\n";

m_cli.usage( Catch::cout(), processName );
Catch::cout() << "For more detail usage please see the project docs\n" << std::endl;
Expand All @@ -148,9 +143,10 @@ namespace Catch {
catch( std::exception& ex ) {
{
Colour colourGuard( Colour::Red );
Catch::cerr() << "\nError(s) in input:\n"
<< Text( ex.what(), TextAttributes().setIndent(2) )
<< "\n\n";
Catch::cerr()
<< "\nError(s) in input:\n"
<< Text( ex.what(), TextAttributes().setIndent(2) )
<< "\n\n";
}
m_cli.usage( Catch::cout(), m_configData.processName );
return (std::numeric_limits<int>::max)();
Expand Down
17 changes: 9 additions & 8 deletions include/internal/catch_version.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,20 @@ namespace Catch {
struct Version {
Version( unsigned int _majorVersion,
unsigned int _minorVersion,
unsigned int _buildNumber,
char const* const _branchName )
: majorVersion( _majorVersion ),
minorVersion( _minorVersion ),
buildNumber( _buildNumber ),
branchName( _branchName )
{}
unsigned int _patchNumber,
std::string const& _branchName,
unsigned int _buildNumber );

unsigned int const majorVersion;
unsigned int const minorVersion;
unsigned int const patchNumber;

// buildNumber is only used if branchName is not null
std::string const branchName;
unsigned int const buildNumber;
char const* const branchName;

friend std::ostream& operator << ( std::ostream& os, Version const& version );

private:
void operator=( Version const& );
};
Expand Down
29 changes: 27 additions & 2 deletions include/internal/catch_version.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,33 @@

namespace Catch {

// These numbers are maintained by a script
Version libraryVersion( 1, 1, 3, "master" );
Version::Version
( unsigned int _majorVersion,
unsigned int _minorVersion,
unsigned int _patchNumber,
std::string const& _branchName,
unsigned int _buildNumber )
: majorVersion( _majorVersion ),
minorVersion( _minorVersion ),
patchNumber( _patchNumber ),
branchName( _branchName ),
buildNumber( _buildNumber )
{}

std::ostream& operator << ( std::ostream& os, Version const& version ) {
os << version.majorVersion << "."
<< version.minorVersion << "."
<< version.patchNumber;

if( !version.branchName.empty() ) {
os << "-" << version.branchName
<< "." << version.buildNumber;
}
return os;
}

Version libraryVersion( 1, 2, 0, "", 0 );

}

#endif // TWOBLUECUBES_CATCH_VERSION_HPP_INCLUDED
7 changes: 1 addition & 6 deletions include/reporters/catch_reporter_console.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -261,12 +261,7 @@ namespace Catch {
stream << "\n" << getLineOfChars<'~'>() << "\n";
Colour colour( Colour::SecondaryText );
stream << currentTestRunInfo->name
<< " is a Catch v" << libraryVersion.majorVersion << "."
<< libraryVersion.minorVersion << " b"
<< libraryVersion.buildNumber;
if( libraryVersion.branchName != std::string( "master" ) )
stream << " (" << libraryVersion.branchName << ")";
stream << " host application.\n"
<< " is a Catch v" << libraryVersion << " host application.\n"
<< "Run with -? for options\n\n";

if( m_config->rngSeed() != 0 )
Expand Down
9 changes: 9 additions & 0 deletions scripts/developBuild.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from __future__ import print_function
from releaseCommon import Version

v = Version()
v.incrementBuildNumber()
v.updateVersionFile()
v.updateReadmeFile()

print( "Updated Version.hpp and README to v{0}".format( v.getVersionString() ) )
93 changes: 20 additions & 73 deletions scripts/generateSingleHeader.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
import string

from scriptCommon import catchPath
from releaseCommon import Version


versionParser = re.compile( r'(\s*Version\slibraryVersion)\s*\(\s*(.*)\s*,\s*(.*)\s*,\s*(.*)\s*,\s*\"(.*)\"\s*\).*' )
includesParser = re.compile( r'\s*#include\s*"(.*)"' )
guardParser = re.compile( r'\s*#.*TWOBLUECUBES_CATCH_.*_INCLUDED')
defineParser = re.compile( r'\s*#define')
Expand All @@ -20,22 +21,15 @@
blankParser = re.compile( r'^\s*$')
seenHeaders = set([])
rootPath = os.path.join( catchPath, 'include/' )
versionPath = os.path.join( rootPath, "internal/catch_version.hpp" )
readmePath = os.path.join( catchPath, "README.md" )
outputPath = os.path.join( catchPath, 'single_include/catch.hpp' )

bumpVersion = True
includeImpl = True

for arg in sys.argv[1:]:
arg = string.lower(arg)
if arg == "nobump":
bumpVersion = False
print( "Not bumping version number" )
elif arg == "noimpl":
if arg == "noimpl":
includeImpl = False
bumpVersion = False
print( "Not including impl code (and not bumping version)" )
print( "Not including impl code" )
else:
print( "\n** Unrecognised argument: " + arg + " **\n" )
exit(1)
Expand Down Expand Up @@ -87,70 +81,23 @@ def parseFile( path, filename ):
if blanks < 2:
write( line.rstrip() + "\n" )

class Version:
def __init__(self):
f = open( versionPath, 'r' )
for line in f:
m = versionParser.match( line )
if m:
self.variableDecl = m.group(1)
self.majorVersion = int(m.group(2))
self.minorVersion = int(m.group(3))
self.buildNumber = int(m.group(4))
self.branchName = m.group(5)
f.close()

def incrementBuildNumber(self):
self.buildNumber = self.buildNumber+1

def updateVersionFile(self):
f = open( versionPath, 'r' )
lines = []
for line in f:
m = versionParser.match( line )
if m:
lines.append( '{0}( {1}, {2}, {3}, "{4}" );'.format( self.variableDecl, self.majorVersion, self.minorVersion, self.buildNumber, self.branchName ) )
else:
lines.append( line.rstrip() )
f.close()
f = open( versionPath, 'w' )
for line in lines:
f.write( line + "\n" )

def updateReadmeFile(self):
f = open( readmePath, 'r' )
lines = []
for line in f:
lines.append( line.rstrip() )
f.close()
f = open( readmePath, 'w' )
for line in lines:
if line.startswith( "*v" ):
f.write( '*v{0}.{1} build {2} ({3} branch)*\n'.format( self.majorVersion, self.minorVersion, self.buildNumber, self.branchName ) )
else:
f.write( line + "\n" )

def generateSingleInclude():
v = Version()
if bumpVersion:
v.incrementBuildNumber()
v.updateVersionFile()
v.updateReadmeFile()
out.write( "/*\n" )
out.write( " * CATCH v{0}.{1} build {2} ({3} branch)\n".format( v.majorVersion, v.minorVersion, v.buildNumber, v.branchName ) )
out.write( " * Generated: {0}\n".format( datetime.datetime.now() ) )
out.write( " * ----------------------------------------------------------\n" )
out.write( " * This file has been merged from multiple headers. Please don't edit it directly\n" )
out.write( " * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.\n" )
out.write( " *\n" )
out.write( " * Distributed under the Boost Software License, Version 1.0. (See accompanying\n" )
out.write( " * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n" )
out.write( " */\n" )
out.write( "#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n" )
out.write( "#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n" )
v = Version()
out.write( "/*\n" )
out.write( " * Catch v{0}\n".format( v.getVersionString() ) )
out.write( " * Generated: {0}\n".format( datetime.datetime.now() ) )
out.write( " * ----------------------------------------------------------\n" )
out.write( " * This file has been merged from multiple headers. Please don't edit it directly\n" )
out.write( " * Copyright (c) 2012 Two Blue Cubes Ltd. All rights reserved.\n" )
out.write( " *\n" )
out.write( " * Distributed under the Boost Software License, Version 1.0. (See accompanying\n" )
out.write( " * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n" )
out.write( " */\n" )
out.write( "#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n" )
out.write( "#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n" )

parseFile( rootPath, 'catch.hpp' )
parseFile( rootPath, 'catch.hpp' )

out.write( "#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n\n" )
out.write( "#endif // TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED\n\n" )

generateSingleInclude()
print ("Generated single include for Catch v{0}\n".format( v.getVersionString() ) )
9 changes: 9 additions & 0 deletions scripts/majorRelease.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from __future__ import print_function
from releaseCommon import Version

v = Version()
v.incrementMajorVersion()
v.updateVersionFile()
v.updateReadmeFile()

print( "Updated Version.hpp and README to v{0}".format( v.getVersionString() ) )
9 changes: 9 additions & 0 deletions scripts/minorRelease.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from __future__ import print_function
from releaseCommon import Version

v = Version()
v.incrementMinorVersion()
v.updateVersionFile()
v.updateReadmeFile()

print( "Updated Version.hpp and README to v{0}".format( v.getVersionString() ) )
9 changes: 9 additions & 0 deletions scripts/patchRelease.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from __future__ import print_function
from releaseCommon import Version

v = Version()
v.incrementPatchNumber()
v.updateVersionFile()
v.updateReadmeFile()

print( "Updated Version.hpp and README to v{0}".format( v.getVersionString() ) )
89 changes: 89 additions & 0 deletions scripts/releaseCommon.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
from __future__ import print_function

import os
import sys
import re
import string

from scriptCommon import catchPath

versionParser = re.compile( r'(\s*Version\slibraryVersion)\s*\(\s*(.*)\s*,\s*(.*)\s*,\s*(.*)\s*,\s*\"(.*)\"\s*,\s*(.*)\s*\).*' )
rootPath = os.path.join( catchPath, 'include/' )
versionPath = os.path.join( rootPath, "internal/catch_version.hpp" )
readmePath = os.path.join( catchPath, "README.md" )

class Version:
def __init__(self):
f = open( versionPath, 'r' )
for line in f:
m = versionParser.match( line )
if m:
self.variableDecl = m.group(1)
self.majorVersion = int(m.group(2))
self.minorVersion = int(m.group(3))
self.patchNumber = int(m.group(4))
self.branchName = m.group(5)
self.buildNumber = int(m.group(6))
f.close()

def nonDevelopRelease(self):
if self.branchName != "":
self.branchName = ""
self.buildNumber = 0
def developBuild(self):
if self.branchName == "":
self.branchName = "develop"
self.buildNumber = 0

def incrementBuildNumber(self):
self.developBuild()
self.buildNumber = self.buildNumber+1

def incrementPatchNumber(self):
self.nonDevelopRelease()
self.patchNumber = self.patchNumber+1

def incrementMinorVersion(self):
self.nonDevelopRelease()
self.patchNumber = 0
self.minorVersion = self.minorVersion+1

def incrementMajorVersion(self):
self.nonDevelopRelease()
self.patchNumber = 0
self.minorVersion = 0
self.majorVersion = self.majorVersion+1

def getVersionString(self):
versionString = '{0}.{1}.{2}'.format( self.majorVersion, self.minorVersion, self.patchNumber )
if self.branchName != "":
versionString = versionString + '-{0}.{1}'.format( self.branchName, self.buildNumber )
return versionString

def updateVersionFile(self):
f = open( versionPath, 'r' )
lines = []
for line in f:
m = versionParser.match( line )
if m:
lines.append( '{0}( {1}, {2}, {3}, "{4}", {5} );'.format( self.variableDecl, self.majorVersion, self.minorVersion, self.patchNumber, self.branchName, self.buildNumber ) )
else:
lines.append( line.rstrip() )
f.close()
f = open( versionPath, 'w' )
for line in lines:
f.write( line + "\n" )

def updateReadmeFile(self):
f = open( readmePath, 'r' )
lines = []
for line in f:
lines.append( line.rstrip() )
f.close()
f = open( readmePath, 'w' )
for line in lines:
if line.startswith( "*v" ):
f.write( '*v{0}*\n'.format( self.getVersionString() ) )
else:
f.write( line + "\n" )

Loading

0 comments on commit 21f7ef6

Please sign in to comment.