mirror of
http://git.whoc.org.uk/git/password-manager.git
synced 2025-10-24 17:27:35 +02:00
Improved build scripts
Signed-off-by: Giulio Cesare Solaroli <giulio.cesare@clipperz.com>
This commit is contained in:
@@ -3,57 +3,69 @@
|
||||
|
||||
import sys, os, json
|
||||
import shutil
|
||||
import main
|
||||
import hashlib
|
||||
|
||||
class BackendBuilder:
|
||||
import main
|
||||
|
||||
#===================================================================
|
||||
|
||||
|
||||
class BackendBuilder(object):
|
||||
|
||||
def __init__ (self, projectTargetDir, frontends, versions, settings):
|
||||
self.projectTargetDir = projectTargetDir
|
||||
self.frontends = frontends
|
||||
self.versions = versions
|
||||
self.settings = settings
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
def name (self):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
def relativePath (self):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
def compileCode (self):
|
||||
pass
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
def copyCompiledCodeToTargetDir (self):
|
||||
src = self.sourceFolder()
|
||||
dst = self.targetFolder()
|
||||
main.createFolder(os.path.dirname(dst))
|
||||
shutil.copytree(src, dst)
|
||||
def createPackage (self):
|
||||
raise NotImplementedError()
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
def sourceFolder (self):
|
||||
return main.projectBaseDir() + '/backend/' + self.relativePath() + '/src'
|
||||
|
||||
return os.path.join(main.projectBaseDir() , 'backend', self.relativePath(), 'src')
|
||||
|
||||
|
||||
def tempFolder (self):
|
||||
return os.path.join(self.projectTargetDir, '.tmp', self.relativePath())
|
||||
|
||||
|
||||
def frontEndTempFolder (self):
|
||||
return self.tempFolder()
|
||||
|
||||
|
||||
def developmentTargetFolder (self):
|
||||
return os.path.join(self.projectTargetDir, 'development', self.relativePath())
|
||||
|
||||
def targetFolder (self):
|
||||
return self.projectTargetDir + self.relativePath()
|
||||
return os.path.join(self.projectTargetDir, self.relativePath())
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
def createTargetFolder (self):
|
||||
main.createFolder(self.targetFolder())
|
||||
|
||||
|
||||
# def copyFrontendResources (self, frontend):
|
||||
# print "copying resources for frontend: " + frontend
|
||||
# print "SETTINGS: " + str(self.settings)
|
||||
|
||||
|
||||
def writeToTargetFolder (self, filename, content):
|
||||
file = open(self.targetFolder() + '/' + filename, 'w')
|
||||
def writeToFolder (self, folder, filename, content):
|
||||
file = open(os.path.join(folder, filename), 'w')
|
||||
file.write(content.encode('utf-8'))
|
||||
file.close()
|
||||
|
||||
|
||||
def configureIndexContent (self, indexContent):
|
||||
def configureIndexContent (self, indexContent, requestPathPrefix = ".."):
|
||||
result = indexContent
|
||||
result = result.replace( '@request.path@', self.settings['request.path'] )
|
||||
result = result.replace( '@request.path@', requestPathPrefix + '/' + self.settings['request.path'] )
|
||||
result = result.replace( '@should.pay.toll@', self.settings['should.pay.toll'] )
|
||||
|
||||
return result
|
||||
@@ -68,22 +80,39 @@ class BackendBuilder:
|
||||
print message + ": " + sha256Digest + " (sha256)"
|
||||
|
||||
|
||||
def shouldCompileCode (self):
|
||||
return ('debug' in self.versions) or ('install' in self.versions)
|
||||
|
||||
|
||||
def run (self):
|
||||
print self.name() + " - RUN"
|
||||
|
||||
self.compileCode()
|
||||
self.copyCompiledCodeToTargetDir()
|
||||
if self.shouldCompileCode():
|
||||
self.compileCode()
|
||||
|
||||
for frontend in self.frontends:
|
||||
frontendPath = frontend.module + '/'
|
||||
if 'debug' in self.versions:
|
||||
frontend.copyResourcesToTargetFolder(self.targetFolder())
|
||||
#self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assembleDebugVersion()))
|
||||
self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG')))
|
||||
for frontend in self.frontends:
|
||||
main.createFolder(os.path.join(self.frontEndTempFolder(), frontend.module))
|
||||
|
||||
if 'debug' in self.versions:
|
||||
frontend.copyResourcesToFolder(self.frontEndTempFolder())
|
||||
|
||||
index = self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG'))
|
||||
self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index_debug.html'), index)
|
||||
|
||||
if 'install' in self.versions:
|
||||
index = self.configureIndexContent(frontend.assemble())
|
||||
self.writeToFolder(self.frontEndTempFolder(), os.path.join(frontend.module, 'index.html'), index)
|
||||
|
||||
self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index.html checksum")
|
||||
|
||||
if 'install' in self.versions:
|
||||
index = self.configureIndexContent(frontend.assemble())
|
||||
self.writeToTargetFolder(frontendPath + 'index.html', index)
|
||||
self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index.html checksum")
|
||||
self.createPackage()
|
||||
|
||||
if 'development' in self.versions:
|
||||
for frontend in self.frontends:
|
||||
main.createFolder(os.path.join(self.developmentTargetFolder(), frontend.module))
|
||||
|
||||
index = self.configureIndexContent(frontend.assemble(assemblyMode='DEVELOPMENT', versionType='DEBUG'), self.settings['development.settings']['url'])
|
||||
self.writeToFolder(self.developmentTargetFolder(), os.path.join(frontend.module, 'index_development.html'), index)
|
||||
|
||||
|
||||
#===================================================================
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
from backendBuilder import BackendBuilder
|
||||
from scriptLanguageBuilder import ScriptLanguageBuilder
|
||||
|
||||
class PhpBuilder(BackendBuilder):
|
||||
class PhpBuilder(ScriptLanguageBuilder):
|
||||
|
||||
def name(self):
|
||||
return "PHP builder"
|
||||
|
||||
|
||||
def relativePath(self):
|
||||
return 'php'
|
||||
|
||||
|
||||
27
scripts/builder/backends/pythonBuilder.py
Normal file
27
scripts/builder/backends/pythonBuilder.py
Normal file
@@ -0,0 +1,27 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
from scriptLanguageBuilder import ScriptLanguageBuilder
|
||||
|
||||
class PythonBuilder(ScriptLanguageBuilder):
|
||||
|
||||
def name(self):
|
||||
return "Python builder"
|
||||
|
||||
|
||||
def relativePath(self):
|
||||
return 'python'
|
||||
|
||||
|
||||
def compileCode (self):
|
||||
src = self.sourceFolder()
|
||||
dst = self.targetFolder()
|
||||
|
||||
shutil.copytree(src, dst)
|
||||
|
||||
|
||||
# def copyCompiledCodeToTargetDir (self):
|
||||
# src = self.sourceFolder()
|
||||
# dst = self.targetFolder()
|
||||
#
|
||||
# shutil.copytree(src, dst)
|
||||
20
scripts/builder/backends/scriptLanguageBuilder.py
Normal file
20
scripts/builder/backends/scriptLanguageBuilder.py
Normal file
@@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
import shutil
|
||||
from backendBuilder import BackendBuilder
|
||||
|
||||
class ScriptLanguageBuilder(BackendBuilder):
|
||||
|
||||
def compileCode (self):
|
||||
src = self.sourceFolder()
|
||||
dst = self.tempFolder()
|
||||
|
||||
shutil.copytree(src, dst)
|
||||
|
||||
|
||||
def createPackage (self):
|
||||
src = self.tempFolder()
|
||||
dst = self.targetFolder()
|
||||
|
||||
shutil.copytree(src, dst)
|
||||
@@ -9,17 +9,11 @@ import shutil
|
||||
import StringIO
|
||||
import urllib
|
||||
|
||||
#from mercurial import ui, hg
|
||||
#from mercurial.node import hex
|
||||
from dulwich.repo import Repo
|
||||
|
||||
import main
|
||||
|
||||
class FrontendBuilder(object):
|
||||
|
||||
|
||||
class FrontendBuilder:
|
||||
|
||||
def __init__ (self, frontend, settings):
|
||||
def __init__ (self, frontend, settings, repositoryVersion):
|
||||
if '.' in frontend:
|
||||
moduleComponents = frontend.split('.')
|
||||
self.module = moduleComponents[0]
|
||||
@@ -30,53 +24,26 @@ class FrontendBuilder:
|
||||
|
||||
self.settings = settings
|
||||
self.projectDir = main.projectBaseDir()
|
||||
# self.repository = repository.repositoryWithPath(self.projectDir)
|
||||
self.repositoryVersion = repositoryVersion
|
||||
self.processedFiles = {}
|
||||
|
||||
|
||||
def mercurialRepositoryVersion (self):
|
||||
repo = hg.repository(ui.ui(), self.projectDir)
|
||||
context = repo['tip']
|
||||
result = str(context)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def gitRepositoryVersion (self):
|
||||
repo = Repo(self.projectDir)
|
||||
#if repo.is_dirty():
|
||||
# print "WARNING: build run with dirty repository"
|
||||
result = repo.refs['HEAD']
|
||||
|
||||
return result
|
||||
|
||||
|
||||
|
||||
def repositoryVersion (self):
|
||||
cacheKey = 'repositoryVersion'
|
||||
if not self.processedFiles.has_key(cacheKey):
|
||||
#result = self.mercurialRepositoryVersion()
|
||||
result = self.gitRepositoryVersion()
|
||||
self.processedFiles[cacheKey] = result
|
||||
else:
|
||||
result = self.processedFiles[cacheKey]
|
||||
|
||||
return result
|
||||
|
||||
|
||||
#def relativePath (self):
|
||||
# return self.module
|
||||
#
|
||||
|
||||
def log (self, message):
|
||||
print "frontend [" + self.module + "]: " + message
|
||||
|
||||
|
||||
def absolutePathForSourceFile (self, folder, basePath, file):
|
||||
return folder + '/frontend/' + self.module + '/' + basePath + '/' + file
|
||||
def absolutePathForSources (self):
|
||||
return os.path.join(self.projectDir, 'frontend', self.module)
|
||||
|
||||
|
||||
def absolutePathForSourceFile (self, basePath, file):
|
||||
return os.path.join(self.absolutePathForSources(), basePath, file)
|
||||
|
||||
|
||||
def absolutePathForTargetFile (self, folder, basePath, file):
|
||||
return folder + '/' + self.module + '/' + basePath + '/' + file
|
||||
return os.path.join(folder, self.module, basePath, file)
|
||||
|
||||
|
||||
def filterFiles (self, files):
|
||||
result = []
|
||||
@@ -92,13 +59,13 @@ class FrontendBuilder:
|
||||
|
||||
def copyResources (self, sourceFolder, destinationFolder, fileType):
|
||||
for file in self.filterFiles(self.settings[fileType]):
|
||||
src = self.absolutePathForSourceFile(sourceFolder, fileType, file)
|
||||
src = self.absolutePathForSourceFile(fileType, file)
|
||||
dst = self.absolutePathForTargetFile(destinationFolder, fileType, file)
|
||||
main.createFolder(os.path.dirname(dst))
|
||||
shutil.copy2(src, dst)
|
||||
|
||||
|
||||
def copyResourcesToTargetFolder (self, targetFolder):
|
||||
def copyResourcesToFolder (self, targetFolder):
|
||||
self.copyResources(self.projectDir, targetFolder, 'css')
|
||||
self.copyResources(self.projectDir, targetFolder, 'js')
|
||||
|
||||
@@ -108,7 +75,7 @@ class FrontendBuilder:
|
||||
|
||||
for file in self.filterFiles(files):
|
||||
try:
|
||||
fileHandler = codecs.open(self.absolutePathForSourceFile(self.projectDir, basePath, file), 'r', 'utf-8')
|
||||
fileHandler = codecs.open(self.absolutePathForSourceFile(basePath, file), 'r', 'utf-8')
|
||||
except:
|
||||
print "FILE: " + file
|
||||
|
||||
@@ -181,8 +148,8 @@ class FrontendBuilder:
|
||||
|
||||
#==========================================================================
|
||||
|
||||
def compressJS_jsmin (self, js):
|
||||
self.log("compressing JS code")
|
||||
def compressJS_jsmin (self, js, description):
|
||||
self.log("compressing " + description + " code")
|
||||
original = StringIO.StringIO(js)
|
||||
output = StringIO.StringIO()
|
||||
|
||||
@@ -196,7 +163,7 @@ class FrontendBuilder:
|
||||
|
||||
return result
|
||||
|
||||
def compressJS_closureCompiler (self, js):
|
||||
def compressJS_closureCompiler (self, js, description):
|
||||
# Googles Closure compiler
|
||||
# java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js
|
||||
|
||||
@@ -205,14 +172,14 @@ class FrontendBuilder:
|
||||
return result
|
||||
|
||||
|
||||
def compressJS (self, js):
|
||||
return self.compressJS_jsmin(js)
|
||||
#return self.compressJS_closureCompiler(js)
|
||||
def compressJS (self, js, description):
|
||||
return self.compressJS_jsmin(js, description)
|
||||
#return self.compressJS_closureCompiler(js, description)
|
||||
|
||||
|
||||
#==========================================================================
|
||||
|
||||
def packBookmarklet (self, bookmakeletCode):
|
||||
def packBookmarklet (self, bookmakeletCode, version):
|
||||
replacers = [
|
||||
('isLoginForm', 'ilf'),
|
||||
('findLoginForm', 'flf'),
|
||||
@@ -227,7 +194,7 @@ class FrontendBuilder:
|
||||
('parameters', 'p' ),
|
||||
('inputElementValues', 'iev'),
|
||||
]
|
||||
result = self.compressJS(bookmakeletCode)
|
||||
result = self.compressJS(bookmakeletCode, version + " bookmarklet")
|
||||
|
||||
result = re.sub('\n', ' ', result) # Fit all in a single line
|
||||
# result = re.sub('\s+', ' ', result) # Collapse "redundant" spaces. WARNING: this could have some evil side effects on constant strings used inside to code!!
|
||||
@@ -300,7 +267,7 @@ class FrontendBuilder:
|
||||
def bookmarklet (self):
|
||||
cacheKey = 'bookmarklet'
|
||||
if not self.processedFiles.has_key(cacheKey):
|
||||
result = 'bookmarklet="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet.js'])) + '";bookmarklet_ie="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet_IE.js'])) + '";'
|
||||
result = 'bookmarklet="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet.js']), "regular") + '";bookmarklet_ie="' + self.packBookmarklet(self.loadFilesContent('js', ['Bookmarklet_IE.js']), "IE") + '";'
|
||||
self.processedFiles[cacheKey] = result
|
||||
else:
|
||||
result = self.processedFiles[cacheKey]
|
||||
@@ -308,7 +275,7 @@ class FrontendBuilder:
|
||||
return result
|
||||
|
||||
|
||||
def replaceTemplatePlaceholders (self, assemblyMode, pageTitle, copyright, css, code, version, versionType):
|
||||
def replaceTemplatePlaceholders (self, pageTitle, copyright, css, code, jsLoadMode, version, versionType):
|
||||
result = self.template()
|
||||
|
||||
result = result.replace('@page.title@', pageTitle, 1)
|
||||
@@ -317,7 +284,7 @@ class FrontendBuilder:
|
||||
#result = result.replace('@bookmarklet@', bookmarklet, 1)
|
||||
result = result.replace('@application.version@', version, 1)
|
||||
result = result.replace('@application.version.type@', versionType, 1)
|
||||
result = result.replace('@js_' + assemblyMode + '@', code, 1)
|
||||
result = result.replace('@js_' + jsLoadMode + '@', code, 1)
|
||||
|
||||
result = re.sub('@js_[^@]+@', '', result)
|
||||
|
||||
@@ -343,7 +310,7 @@ class FrontendBuilder:
|
||||
|
||||
def cssTagsForFiles (self, basePath, files):
|
||||
#<link rel="stylesheet" type="text/css" href="./css/reset-min.css" />
|
||||
return '\n'.join(map(lambda file: '<link rel="stylesheet" type="text/css" href="./' + basePath + '/' + file + '" />', files))
|
||||
return '\n'.join(map(lambda file: '<link rel="stylesheet" type="text/css" href="' + basePath + '/' + file + '" />', files))
|
||||
|
||||
|
||||
def cssTagForContent (self, content):
|
||||
@@ -352,17 +319,17 @@ class FrontendBuilder:
|
||||
|
||||
def scriptTagsForFiles (self, basePath, files):
|
||||
#<script type='text/javascript' src='./js/src/bookmarklet.js'></script>
|
||||
return '\n'.join(map(lambda file: '<script type="text/javascript" src="./' + basePath + '/' + file + '"></script>', files))
|
||||
return '\n'.join(map(lambda file: '<script type="text/javascript" src="' + basePath + '/' + file + '"></script>', files))
|
||||
|
||||
|
||||
def scriptTagForContent (self, content):
|
||||
return '<script>' + content + '</script>'
|
||||
|
||||
|
||||
def assembleVersion (self, assemblyMode, pageTitle, copyright, css, js, version, versionType):
|
||||
def assembleVersion (self, pageTitle, copyright, css, js, jsLoadMode, version, versionType):
|
||||
cacheKey = version + "-" + versionType
|
||||
if not self.processedFiles.has_key(cacheKey):
|
||||
result = self.replaceTemplatePlaceholders(assemblyMode, pageTitle, copyright, css, js, version, versionType)
|
||||
result = self.replaceTemplatePlaceholders(pageTitle, copyright, css, js, jsLoadMode, version, versionType)
|
||||
self.processedFiles[cacheKey] = result
|
||||
else:
|
||||
result = self.processedFiles[cacheKey]
|
||||
@@ -372,24 +339,48 @@ class FrontendBuilder:
|
||||
|
||||
|
||||
def assemble (self, assemblyMode='INSTALL', versionType='LIVE'):
|
||||
pageTitle = "Clipperz - " + self.module
|
||||
if versionType != 'LIVE':
|
||||
pageTitle += " [" + versionType + " - " + assemblyMode +"]"
|
||||
|
||||
if assemblyMode == 'INSTALL':
|
||||
css = self.cssTagForContent(self.compressCSS(self.loadFilesContent('css', self.settings['css'])))
|
||||
js = self.scriptTagForContent(self.bookmarklet() + '\n' + self.compressJS(self.loadFilesContent('js', self.settings['js'])))
|
||||
|
||||
if versionType == 'LIVE':
|
||||
pageTitle = "Clipperz - " + self.module
|
||||
else:
|
||||
css = self.cssTagsForFiles('css', self.filterFiles(self.settings['css']))
|
||||
js = self.scriptTagForContent(self.bookmarklet()) + '\n' + self.scriptTagsForFiles('js', self.filterFiles(self.settings['js']))
|
||||
|
||||
pageTitle = "Clipperz - " + self.module + " [" + versionType + " - " + assemblyMode +"]"
|
||||
|
||||
if assemblyMode == 'INSTALL':
|
||||
copyright = self.assembleCopyrightHeader()
|
||||
css = self.cssTagForContent(self.compressCSS(self.loadFilesContent('css', self.settings['css'])))
|
||||
js = self.scriptTagForContent(
|
||||
self.bookmarklet() +
|
||||
'\n' +
|
||||
self.compressJS(self.loadFilesContent('js', self.settings['js']), "application")
|
||||
)
|
||||
jsLoadMode = 'EMBEDDED'
|
||||
|
||||
elif assemblyMode == 'DEBUG':
|
||||
copyright = self.assembleCopyrightHeader()
|
||||
css = self.cssTagsForFiles('./css', self.filterFiles(self.settings['css']))
|
||||
js = self.scriptTagForContent(self.bookmarklet()) + \
|
||||
'\n' + \
|
||||
self.scriptTagsForFiles('./js', self.filterFiles(self.settings['js']))
|
||||
jsLoadMode = 'LINKED'
|
||||
|
||||
elif assemblyMode == 'DEVELOPMENT':
|
||||
copyright = ""
|
||||
css = self.cssTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'css')), self.filterFiles(self.settings['css']))
|
||||
js = self.scriptTagForContent(self.bookmarklet()) + \
|
||||
'\n' + \
|
||||
self.scriptTagsForFiles('file://' + str(os.path.join(self.absolutePathForSources(), 'js')), self.filterFiles(self.settings['js']))
|
||||
jsLoadMode = 'LINKED'
|
||||
|
||||
else:
|
||||
raise NotImplementedError()
|
||||
|
||||
return self.assembleVersion(
|
||||
assemblyMode = assemblyMode,
|
||||
pageTitle = pageTitle,
|
||||
copyright = self.assembleCopyrightHeader(),
|
||||
copyright = copyright,
|
||||
css = css,
|
||||
js = js,
|
||||
version = self.repositoryVersion(),
|
||||
jsLoadMode = jsLoadMode,
|
||||
version = self.repositoryVersion,
|
||||
versionType = versionType
|
||||
)
|
||||
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
import sys, os, json
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
import shutil
|
||||
import pprint
|
||||
import frontendBuilder
|
||||
import codecs
|
||||
import itertools
|
||||
|
||||
from collections import deque
|
||||
from phpBuilder import PhpBuilder
|
||||
from pythonBuilder import PythonBuilder
|
||||
|
||||
import frontendBuilder
|
||||
import repository
|
||||
|
||||
pp = pprint.PrettyPrinter(indent=4, depth=4)
|
||||
|
||||
@@ -34,7 +35,7 @@ def createFolder (path):
|
||||
#--------------------------------------------------------------------
|
||||
|
||||
def loadSettings (component, module):
|
||||
print "MODULE: " + module
|
||||
# print "MODULE: " + module
|
||||
|
||||
if '.' in module:
|
||||
moduleComponents = module.split('.')
|
||||
@@ -43,7 +44,8 @@ def loadSettings (component, module):
|
||||
else:
|
||||
submodule = module
|
||||
|
||||
settings = codecs.open(projectBaseDir() + '/' + component + '/' + module + '/properties/' + submodule + '.properties.json', 'r', 'utf-8')
|
||||
#settings = codecs.open(projectBaseDir() + os.sep + component + os.sep + module + os.sep + 'properties' + os.sep + submodule + '.properties.json', 'r', 'utf-8')
|
||||
settings = codecs.open(os.path.join(projectBaseDir(), component, module, 'properties', submodule + '.properties.json'), 'r', 'utf-8')
|
||||
result = json.load(settings)
|
||||
settings.close
|
||||
|
||||
@@ -71,24 +73,25 @@ def loadSettings (component, module):
|
||||
def assembleBackend (backend, frontends, versions):
|
||||
settings = loadSettings('backend', backend)
|
||||
|
||||
if backend == 'php':
|
||||
backendBuilder = PhpBuilder(projectTargetDir(), frontends, versions, settings)
|
||||
elif backend == 'python':
|
||||
backendBuilder = PythonBuilder(projectTargetDir(), frontends, versions, settings)
|
||||
#elif backend == 'java':
|
||||
# buildJavaBackend (frontends, versions, settings)
|
||||
else:
|
||||
raise Exception('unrecognized backend: ' + backend)
|
||||
|
||||
builderModuleName = backend + 'Builder'
|
||||
builderClassName = backend.capitalize() + 'Builder'
|
||||
|
||||
builderModule = __import__(builderModuleName)
|
||||
builderClass = getattr(builderModule, builderClassName)
|
||||
|
||||
backendBuilder = builderClass(projectTargetDir(), frontends, versions, settings)
|
||||
backendBuilder.run()
|
||||
|
||||
#====================================================================
|
||||
|
||||
def build (settings):
|
||||
def build (settings, repository):
|
||||
frontends = []
|
||||
|
||||
if repository.areTherePendingChanges():
|
||||
print "\nWARNING: repository has pending changes\n"
|
||||
|
||||
for frontend in settings['frontends']:
|
||||
frontends.append(frontendBuilder.FrontendBuilder(frontend, loadSettings('frontend', frontend)))
|
||||
frontends.append(frontendBuilder.FrontendBuilder(frontend, loadSettings('frontend', frontend), repository.version()))
|
||||
|
||||
for backend in settings['backends']:
|
||||
assembleBackend(backend, frontends, settings['versions'])
|
||||
@@ -96,7 +99,7 @@ def build (settings):
|
||||
#--------------------------------------------------------------------
|
||||
|
||||
def clean ():
|
||||
print "cleaning up …"
|
||||
# print "cleaning up …"
|
||||
if os.path.exists(projectTargetDir()):
|
||||
shutil.rmtree(projectTargetDir())
|
||||
|
||||
@@ -107,35 +110,42 @@ def usage (message):
|
||||
print "ERROR: " + message
|
||||
|
||||
print
|
||||
print "build.py clean"
|
||||
print "build.py clean install"
|
||||
print "build.py install --ALL"
|
||||
print "build.py install debug --ALL"
|
||||
print "build.py clean install debug --ALL"
|
||||
print "build.ph install, debug --backends php java --frontends beta gamma"
|
||||
print "build.ph install, debug --backends php java --frontends beta gamma gamma.mobile"
|
||||
# print "build clean"
|
||||
# print "build clean install"
|
||||
print "build install --ALL"
|
||||
print "build install debug --ALL"
|
||||
# print "build clean install debug --ALL"
|
||||
print "build install debug --backends php python --frontends beta gamma"
|
||||
print "build install debug development --backends php python --frontends beta gamma gamma.mobile"
|
||||
exit(1)
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
|
||||
def allFrontends ():
|
||||
return ['beta', 'gamma', 'mobile']
|
||||
|
||||
def allBackends ():
|
||||
return ['php', 'python']
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
|
||||
def main ():
|
||||
settings = {}
|
||||
parameters = list(itertools.islice(sys.argv, 1, None))
|
||||
|
||||
shouldClean = len(filter(lambda x: x == 'clean', parameters)) > 0
|
||||
if (shouldClean):
|
||||
clean ()
|
||||
|
||||
parameters = filter(lambda x: x != 'clean', parameters)
|
||||
|
||||
sys.path.append(os.path.join(scriptDir(), 'backends'))
|
||||
currentRepository = repository.repositoryWithPath(projectBaseDir())
|
||||
|
||||
clean()
|
||||
versions = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters))
|
||||
settings['versions'] = versions; #['debug', 'install']
|
||||
settings['versions'] = versions; #['debug', 'install', 'development']
|
||||
parameters = deque(itertools.dropwhile(lambda x: not x.startswith('--'), parameters))
|
||||
|
||||
if len(parameters) > 0:
|
||||
parameter = parameters.popleft()
|
||||
if parameter == "--ALL":
|
||||
settings['frontends'] = ['beta', 'gamma', 'mobile']
|
||||
settings['backends'] = ['php', 'python', 'java']
|
||||
settings['frontends'] = allFrontends()
|
||||
settings['backends'] = allBackends()
|
||||
else:
|
||||
while parameter != None:
|
||||
values = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters))
|
||||
@@ -158,8 +168,9 @@ def main ():
|
||||
if (not settings.has_key('backends')):
|
||||
usage("missing 'backends'")
|
||||
|
||||
build (settings)
|
||||
|
||||
build(settings, currentRepository)
|
||||
else:
|
||||
usage("Suggestions on how to call the 'build' script:")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
from backendBuilder import BackendBuilder
|
||||
|
||||
class PythonBuilder(BackendBuilder):
|
||||
|
||||
def name(self):
|
||||
return "Python builder"
|
||||
|
||||
def relativePath(self):
|
||||
return 'python'
|
||||
|
||||
|
||||
75
scripts/builder/repository.py
Normal file
75
scripts/builder/repository.py
Normal file
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
|
||||
def repositoryWithPath (path):
|
||||
try:
|
||||
from dulwich.repo import Repo
|
||||
|
||||
repo = Repo(path)
|
||||
result = GitRepository(repo, path)
|
||||
except:
|
||||
from mercurial import ui, hg
|
||||
|
||||
repo = hg.repository(ui.ui(), path)
|
||||
result = HgRepository(repo, path)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
#===================================================================
|
||||
|
||||
|
||||
class Repository(object):
|
||||
|
||||
def __init__ (self, repository, path):
|
||||
self.repository = repository
|
||||
self.path = path
|
||||
|
||||
|
||||
def revision (self):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
def areTherePendingChanges (self):
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
def version (self):
|
||||
result = self.revision()
|
||||
if self.areTherePendingChanges():
|
||||
result = '>>> ' + result + ' <<<'
|
||||
|
||||
# print "VERSION: " + result
|
||||
return result
|
||||
|
||||
|
||||
#===================================================================
|
||||
|
||||
|
||||
class GitRepository(Repository):
|
||||
|
||||
def revision (self):
|
||||
return repository.refs['HEAD']
|
||||
|
||||
|
||||
def areTherePendingChanges (self):
|
||||
return repository.is_dirty()
|
||||
|
||||
|
||||
#===================================================================
|
||||
|
||||
|
||||
class HgRepository(Repository):
|
||||
# http://mercurial.selenic.com/wiki/MercurialApi
|
||||
|
||||
def revision (self):
|
||||
return 'hg:' + str(self.repository['tip'])
|
||||
|
||||
|
||||
def areTherePendingChanges (self):
|
||||
# TODO: FIXME: repository.status() does not report 'unknown(?)' files. :(
|
||||
return not all(map(lambda fileList: len(fileList) == 0, self.repository.status()))
|
||||
|
||||
|
||||
#===================================================================
|
||||
Reference in New Issue
Block a user