summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--morphlib/__init__.py5
-rw-r--r--morphlib/gitversion.py57
-rw-r--r--setup.py53
-rw-r--r--without-test-modules1
4 files changed, 109 insertions, 7 deletions
diff --git a/morphlib/__init__.py b/morphlib/__init__.py
index 213241d8..2d2f68a2 100644
--- a/morphlib/__init__.py
+++ b/morphlib/__init__.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2011-2012 Codethink Limited
+# Copyright (C) 2011-2013 Codethink Limited
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -19,8 +19,9 @@
import cliapp
+import gitversion
-__version__ = '0.1'
+__version__ = gitversion.version
class Error(cliapp.AppException):
diff --git a/morphlib/gitversion.py b/morphlib/gitversion.py
new file mode 100644
index 00000000..b1f82da6
--- /dev/null
+++ b/morphlib/gitversion.py
@@ -0,0 +1,57 @@
+# Copyright (C) 2013 Codethink Limited
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+
+'''Version information retrieved either from the package data, or the
+ git repository the library is being run from.
+
+ It is an error to run morph without this version information, since
+ it makes it impossible to reproduce any Systems that are built.
+'''
+
+
+import subprocess
+import os
+
+import cliapp
+
+
+try:
+ import pkgutil
+ version = pkgutil.get_data('morphlib', 'version')
+ commit = pkgutil.get_data('morphlib', 'commit')
+ tree = pkgutil.get_data('morphlib', 'tree')
+ ref = pkgutil.get_data('morphlib', 'ref')
+except IOError, e:
+ from os.path import dirname
+ def run_git(*args):
+ command = ['git'] + list(args)
+ p = subprocess.Popen(command,
+ cwd=os.path.dirname(__file__),
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ o = p.communicate()
+ if p.returncode:
+ raise subprocess.CalledProcessError(p.returncode,
+ command)
+ return o[0].strip()
+
+ try:
+ version = run_git('describe', '--always', '--dirty=-unreproducible')
+ commit = run_git('rev-parse', 'HEAD^{commit}')
+ tree = run_git('rev-parse', 'HEAD^{tree}')
+ ref = run_git('rev-parse', '--symbolic-full-name', 'HEAD')
+ except cliapp.AppException:
+ raise cliapp.AppException("morphlib version could not be determined")
diff --git a/setup.py b/setup.py
index eceb705b..6e8c4c4b 100644
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2011, 2012 Codethink Limited
+# Copyright (C) 2011, 2012, 2013 Codethink Limited
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -23,23 +23,58 @@ from distutils.command.build import build
from distutils.command.clean import clean
import glob
import os
+import os.path
import shutil
import subprocess
+import cliapp
+
import morphlib
-class GenerateManpage(build):
+class GenerateResources(build):
def run(self):
+ if not self.dry_run:
+ self.generate_manpages()
+ self.generate_version()
build.run(self)
- print 'building manpages'
+
+ def generate_manpages(self):
+ self.announce('building manpages')
for x in ['morph']:
with open('%s.1' % x, 'w') as f:
subprocess.check_call(['python', x,
'--generate-manpage=%s.1.in' % x,
'--output=%s.1' % x], stdout=f)
+ def generate_version(self):
+ target_dir = os.path.join(self.build_lib, 'morphlib')
+
+ self.mkpath(target_dir)
+
+ def save_git_info(filename, *args):
+ path = os.path.join(target_dir, filename)
+ command = ['git'] + list(args)
+
+ self.announce('generating %s with %s' %
+ (path, ' '.join(command)))
+
+ with open(os.path.join(target_dir, filename), 'w') as f:
+ p = subprocess.Popen(command,
+ cwd=os.path.dirname(__file__),
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ o = p.communicate()
+ if p.returncode:
+ raise subprocess.CalledProcessError(p.returncode, command)
+ f.write(o[0].strip())
+
+ save_git_info('version', 'describe', '--always',
+ '--dirty=-unreproducible')
+ save_git_info('commit', 'rev-parse', 'HEAD^{commit}')
+ save_git_info('tree', 'rev-parse', 'HEAD^{tree}')
+ save_git_info('ref', 'rev-parse', '--symbolic-full-name', 'HEAD')
class Clean(clean):
@@ -104,10 +139,18 @@ FIXME
url='http://www.baserock.org/',
scripts=['morph'],
packages=['morphlib'],
- package_data={'morphlib': ['plugins/*_plugin.py']},
+ package_data={
+ 'morphlib': [
+ 'plugins/*_plugin.py',
+ 'version',
+ 'commit',
+ 'tree',
+ 'ref',
+ ]
+ },
data_files=[('share/man/man1', glob.glob('*.[1-8]'))],
cmdclass={
- 'build': GenerateManpage,
+ 'build': GenerateResources,
'check': Check,
'clean': Clean,
})
diff --git a/without-test-modules b/without-test-modules
index f1ea523d..cb0302c8 100644
--- a/without-test-modules
+++ b/without-test-modules
@@ -16,5 +16,6 @@ morphlib/plugins/trebuchet_plugin.py
morphlib/plugins/branch_and_merge_plugin.py
morphlib/buildcommand.py
morphlib/plugins/build_plugin.py
+morphlib/gitversion.py
morphlib/plugins/expand_repo_plugin.py