Improved build scripts

Signed-off-by: Giulio Cesare Solaroli <giulio.cesare@clipperz.com>
This commit is contained in:
Giulio Cesare Solaroli 2012-02-11 23:34:25 +00:00
parent 17efce23d9
commit 185949cb77
16 changed files with 4545 additions and 5580 deletions

View File

@ -1,4 +1,9 @@
{ {
"request.path": "../index.php", "request.path": "index.php",
"should.pay.toll": "false" "should.pay.toll": "false"
"development.settings": {
"url": "http://localhost/php/clipperz"
}
} }

View File

@ -0,0 +1,8 @@
{
"request.path": "clipperz.py",
"should.pay.toll": "false"
"development.settings": {
"url": "http://localhost/python/clipperz"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -24,136 +24,128 @@ refer to http://www.clipperz.com.
*/ */
/* @override https://www.example.com/css/compact.css */ /* @override https://www.example.com/css/compact.css */
body.compact div#mainDiv {
/* /*
Color list:
- login box:
light #ff9955
dark #ff6622
- login button:
regular #dd5500
hover #773311
- login translations:
box: #cc6622;
not-selected:
color: #ddaa99
background: #994422
selected: #772211;
*/
body.compact div#mainDiv {
/*
width: 250px; width: 250px;
height: 95%; height: 95%;
border: 1px solid #333366; border: 1px solid #333366;
*/ */
padding: 0px;
}
padding: 0px;
}
body.compact div#compactHeader { body.compact div#compactHeader {
background-color: #333366; background-color: #333366;
} }
body.compact div#compactHeader img { body.compact div#compactHeader img {
padding: 2px 20px 2px 4px; padding: 2px 20px 2px 4px;
width: 60; width: 60;
} }
body.compact div#compactHeader a { body.compact div#compactHeader a {
color: white; color: white;
text-decoration: none; text-decoration: none;
font-size: 10pt; font-size: 10pt;
/* position: absolute; */ /* position: absolute; */
right: 10px;
top: 6px;
}
right: 10px;
top: 6px;
}
body.compact div#compactHeader a:hover { body.compact div#compactHeader a:hover {
color: #ff9400; color: #ff9400;
} }
body.compact h4 { body.compact h4 {
color: #999999; color: #999999;
text-align: center; text-align: center;
padding: 20px; padding: 20px;
font-weight: normal; font-weight: normal;
font-size: 12pt; font-size: 12pt;
font-style: italic; font-style: italic;
} }
body.compact div.loginPanel form { body.compact div.loginPanel form {
padding: 10px; padding: 10px;
} }
body.compact div.loginPanel dt { body.compact div.loginPanel dt {
color: #aaaaaa; color: #aaaaaa;
font-size: 10pt; font-size: 10pt;
} }
body.compact div.loginPanel input { body.compact div.loginPanel input {
width: 180px; width: 180px;
} }
body.compact ul#directLogins { body.compact ul#directLogins {
background-image: none; background-image: none;
padding: 4px 0px; padding: 4px 0px;
} }
body.compact ul#directLogins li { body.compact ul#directLogins li {
width:auto; width: auto;
} }
body.compact ul#directLogins li.hover { body.compact ul#directLogins li.hover {
width:auto; width: auto;
padding-right: 0px; padding-right: 0px;
} }
body.compact div.lockPanel { body.compact div.lockPanel {
color: #999999; color: #999999;
font-size: 10pt; font-size: 10pt;
padding: 10px; padding: 10px;
} }
div#compactMiscLinks ul { div#compactMiscLinks ul {
/* text-align: center; */ /* text-align: center; */
display: block;
padding-left: 22px;
background-color: #ff9400;
}
display: block;
padding-left: 22px;
background-color: #ff9400;
}
div#compactMiscLinks ul li { div#compactMiscLinks ul li {
display: inline; display: inline;
padding: 2px 5px; padding: 2px 5px;
} }
div#compactHeader div#compactMiscLinks ul li a { div#compactHeader div#compactMiscLinks ul li a {
font-size: 9pt; font-size: 9pt;
} }
div#compactHeader div#compactMiscLinks ul li a:hover { div#compactHeader div#compactMiscLinks ul li a:hover {
color: #333366; color: #333366;
} }
div#lockBlock { div#lockBlock {
position: absolute; position: absolute;
right: 10px; right: 10px;
top: 6px; top: 6px;
} }
div#lockBlock input { div#lockBlock input {
width: auto; width: auto;
padding-bottom: 2px; padding-bottom: 2px;
} }
div#lockBlock span { div#lockBlock span {
font-size: 9pt; font-size: 9pt;
padding: 0px 5px 0px 4px; padding: 0px 5px 0px 4px;
color: #aaaaaa; color: #aaaaaa;
} }
div#lockBlock a#lock { div#lockBlock a#lock {
font-size: 9pt; font-size: 9pt;
} }
/* @group Donate */ /* @group Donate */
a#donateHeaderLink { a#donateHeaderLink {
font-weight: bold; font-weight: bold;
} }
div#compactMiscLinks a#donateHeaderIconLink img#donateHeaderLinkIcon { div#compactMiscLinks a#donateHeaderIconLink img#donateHeaderLinkIcon {
display: inline; display: inline;
position: absolute; position: absolute;
top: 22px; top: 22px;
left: 1px; left: 1px;
width: 12px; width: 12px;
height: 12px; height: 12px;
} }
/* @end */ /* @end */

File diff suppressed because one or more lines are too long

View File

@ -3,57 +3,69 @@
import sys, os, json import sys, os, json
import shutil import shutil
import main
import hashlib import hashlib
class BackendBuilder: import main
#===================================================================
class BackendBuilder(object):
def __init__ (self, projectTargetDir, frontends, versions, settings): def __init__ (self, projectTargetDir, frontends, versions, settings):
self.projectTargetDir = projectTargetDir self.projectTargetDir = projectTargetDir
self.frontends = frontends self.frontends = frontends
self.versions = versions self.versions = versions
self.settings = settings self.settings = settings
# --------------------------------------------------------------------------
def name (self): def name (self):
raise NotImplementedError() raise NotImplementedError()
def relativePath (self): def relativePath (self):
raise NotImplementedError() raise NotImplementedError()
def compileCode (self): def compileCode (self):
pass raise NotImplementedError()
def copyCompiledCodeToTargetDir (self): def createPackage (self):
src = self.sourceFolder() raise NotImplementedError()
dst = self.targetFolder()
main.createFolder(os.path.dirname(dst)) # --------------------------------------------------------------------------
shutil.copytree(src, dst)
def sourceFolder (self): 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): def targetFolder (self):
return self.projectTargetDir + self.relativePath() return os.path.join(self.projectTargetDir, self.relativePath())
# --------------------------------------------------------------------------
def createTargetFolder (self): def writeToFolder (self, folder, filename, content):
main.createFolder(self.targetFolder()) file = open(os.path.join(folder, filename), 'w')
# 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')
file.write(content.encode('utf-8')) file.write(content.encode('utf-8'))
file.close() file.close()
def configureIndexContent (self, indexContent): def configureIndexContent (self, indexContent, requestPathPrefix = ".."):
result = indexContent 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'] ) result = result.replace( '@should.pay.toll@', self.settings['should.pay.toll'] )
return result return result
@ -68,22 +80,39 @@ class BackendBuilder:
print message + ": " + sha256Digest + " (sha256)" print message + ": " + sha256Digest + " (sha256)"
def shouldCompileCode (self):
return ('debug' in self.versions) or ('install' in self.versions)
def run (self): def run (self):
print self.name() + " - RUN" print self.name() + " - RUN"
self.compileCode() if self.shouldCompileCode():
self.copyCompiledCodeToTargetDir() self.compileCode()
for frontend in self.frontends: for frontend in self.frontends:
frontendPath = frontend.module + '/' main.createFolder(os.path.join(self.frontEndTempFolder(), frontend.module))
if 'debug' in self.versions:
frontend.copyResourcesToTargetFolder(self.targetFolder()) if 'debug' in self.versions:
#self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assembleDebugVersion())) frontend.copyResourcesToFolder(self.frontEndTempFolder())
self.writeToTargetFolder(frontendPath + 'index_debug.html', self.configureIndexContent(frontend.assemble(assemblyMode='DEBUG', versionType='DEBUG')))
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: self.createPackage()
index = self.configureIndexContent(frontend.assemble())
self.writeToTargetFolder(frontendPath + 'index.html', index) if 'development' in self.versions:
self.logChecksums(index, "[" + self.name() + " - " + frontend.module + "] index.html checksum") 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)
#===================================================================

View File

@ -1,14 +1,13 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
from backendBuilder import BackendBuilder from scriptLanguageBuilder import ScriptLanguageBuilder
class PhpBuilder(BackendBuilder): class PhpBuilder(ScriptLanguageBuilder):
def name(self): def name(self):
return "PHP builder" return "PHP builder"
def relativePath(self): def relativePath(self):
return 'php' return 'php'

View 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)

View 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)

View File

@ -9,17 +9,11 @@ import shutil
import StringIO import StringIO
import urllib import urllib
#from mercurial import ui, hg
#from mercurial.node import hex
from dulwich.repo import Repo
import main import main
class FrontendBuilder(object):
def __init__ (self, frontend, settings, repositoryVersion):
class FrontendBuilder:
def __init__ (self, frontend, settings):
if '.' in frontend: if '.' in frontend:
moduleComponents = frontend.split('.') moduleComponents = frontend.split('.')
self.module = moduleComponents[0] self.module = moduleComponents[0]
@ -30,53 +24,26 @@ class FrontendBuilder:
self.settings = settings self.settings = settings
self.projectDir = main.projectBaseDir() self.projectDir = main.projectBaseDir()
# self.repository = repository.repositoryWithPath(self.projectDir)
self.repositoryVersion = repositoryVersion
self.processedFiles = {} 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): def log (self, message):
print "frontend [" + self.module + "]: " + message print "frontend [" + self.module + "]: " + message
def absolutePathForSourceFile (self, folder, basePath, file): def absolutePathForSources (self):
return folder + '/frontend/' + self.module + '/' + basePath + '/' + file 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): 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): def filterFiles (self, files):
result = [] result = []
@ -92,13 +59,13 @@ class FrontendBuilder:
def copyResources (self, sourceFolder, destinationFolder, fileType): def copyResources (self, sourceFolder, destinationFolder, fileType):
for file in self.filterFiles(self.settings[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) dst = self.absolutePathForTargetFile(destinationFolder, fileType, file)
main.createFolder(os.path.dirname(dst)) main.createFolder(os.path.dirname(dst))
shutil.copy2(src, dst) shutil.copy2(src, dst)
def copyResourcesToTargetFolder (self, targetFolder): def copyResourcesToFolder (self, targetFolder):
self.copyResources(self.projectDir, targetFolder, 'css') self.copyResources(self.projectDir, targetFolder, 'css')
self.copyResources(self.projectDir, targetFolder, 'js') self.copyResources(self.projectDir, targetFolder, 'js')
@ -108,7 +75,7 @@ class FrontendBuilder:
for file in self.filterFiles(files): for file in self.filterFiles(files):
try: try:
fileHandler = codecs.open(self.absolutePathForSourceFile(self.projectDir, basePath, file), 'r', 'utf-8') fileHandler = codecs.open(self.absolutePathForSourceFile(basePath, file), 'r', 'utf-8')
except: except:
print "FILE: " + file print "FILE: " + file
@ -181,8 +148,8 @@ class FrontendBuilder:
#========================================================================== #==========================================================================
def compressJS_jsmin (self, js): def compressJS_jsmin (self, js, description):
self.log("compressing JS code") self.log("compressing " + description + " code")
original = StringIO.StringIO(js) original = StringIO.StringIO(js)
output = StringIO.StringIO() output = StringIO.StringIO()
@ -196,7 +163,7 @@ class FrontendBuilder:
return result return result
def compressJS_closureCompiler (self, js): def compressJS_closureCompiler (self, js, description):
# Googles Closure compiler # Googles Closure compiler
# java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js # java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js
@ -205,14 +172,14 @@ class FrontendBuilder:
return result return result
def compressJS (self, js): def compressJS (self, js, description):
return self.compressJS_jsmin(js) return self.compressJS_jsmin(js, description)
#return self.compressJS_closureCompiler(js) #return self.compressJS_closureCompiler(js, description)
#========================================================================== #==========================================================================
def packBookmarklet (self, bookmakeletCode): def packBookmarklet (self, bookmakeletCode, version):
replacers = [ replacers = [
('isLoginForm', 'ilf'), ('isLoginForm', 'ilf'),
('findLoginForm', 'flf'), ('findLoginForm', 'flf'),
@ -227,7 +194,7 @@ class FrontendBuilder:
('parameters', 'p' ), ('parameters', 'p' ),
('inputElementValues', 'iev'), ('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('\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!! # 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): def bookmarklet (self):
cacheKey = 'bookmarklet' cacheKey = 'bookmarklet'
if not self.processedFiles.has_key(cacheKey): 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 self.processedFiles[cacheKey] = result
else: else:
result = self.processedFiles[cacheKey] result = self.processedFiles[cacheKey]
@ -308,7 +275,7 @@ class FrontendBuilder:
return result 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 = self.template()
result = result.replace('@page.title@', pageTitle, 1) result = result.replace('@page.title@', pageTitle, 1)
@ -317,7 +284,7 @@ class FrontendBuilder:
#result = result.replace('@bookmarklet@', bookmarklet, 1) #result = result.replace('@bookmarklet@', bookmarklet, 1)
result = result.replace('@application.version@', version, 1) result = result.replace('@application.version@', version, 1)
result = result.replace('@application.version.type@', versionType, 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) result = re.sub('@js_[^@]+@', '', result)
@ -343,7 +310,7 @@ class FrontendBuilder:
def cssTagsForFiles (self, basePath, files): def cssTagsForFiles (self, basePath, files):
#<link rel="stylesheet" type="text/css" href="./css/reset-min.css" /> #<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): def cssTagForContent (self, content):
@ -352,17 +319,17 @@ class FrontendBuilder:
def scriptTagsForFiles (self, basePath, files): def scriptTagsForFiles (self, basePath, files):
#<script type='text/javascript' src='./js/src/bookmarklet.js'></script> #<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): def scriptTagForContent (self, content):
return '<script>' + content + '</script>' 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 cacheKey = version + "-" + versionType
if not self.processedFiles.has_key(cacheKey): 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 self.processedFiles[cacheKey] = result
else: else:
result = self.processedFiles[cacheKey] result = self.processedFiles[cacheKey]
@ -372,24 +339,48 @@ class FrontendBuilder:
def assemble (self, assemblyMode='INSTALL', versionType='LIVE'): def assemble (self, assemblyMode='INSTALL', versionType='LIVE'):
pageTitle = "Clipperz - " + self.module
if versionType != 'LIVE': if versionType == 'LIVE':
pageTitle += " [" + versionType + " - " + assemblyMode +"]" pageTitle = "Clipperz - " + self.module
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'])))
else: else:
css = self.cssTagsForFiles('css', self.filterFiles(self.settings['css'])) pageTitle = "Clipperz - " + self.module + " [" + versionType + " - " + assemblyMode +"]"
js = self.scriptTagForContent(self.bookmarklet()) + '\n' + self.scriptTagsForFiles('js', self.filterFiles(self.settings['js']))
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( return self.assembleVersion(
assemblyMode = assemblyMode,
pageTitle = pageTitle, pageTitle = pageTitle,
copyright = self.assembleCopyrightHeader(), copyright = copyright,
css = css, css = css,
js = js, js = js,
version = self.repositoryVersion(), jsLoadMode = jsLoadMode,
version = self.repositoryVersion,
versionType = versionType versionType = versionType
) )

View File

@ -1,16 +1,17 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
import sys, os, json import sys
import os
import json
import shutil import shutil
import pprint import pprint
import frontendBuilder
import codecs import codecs
import itertools import itertools
from collections import deque from collections import deque
from phpBuilder import PhpBuilder
from pythonBuilder import PythonBuilder import frontendBuilder
import repository
pp = pprint.PrettyPrinter(indent=4, depth=4) pp = pprint.PrettyPrinter(indent=4, depth=4)
@ -34,7 +35,7 @@ def createFolder (path):
#-------------------------------------------------------------------- #--------------------------------------------------------------------
def loadSettings (component, module): def loadSettings (component, module):
print "MODULE: " + module # print "MODULE: " + module
if '.' in module: if '.' in module:
moduleComponents = module.split('.') moduleComponents = module.split('.')
@ -43,7 +44,8 @@ def loadSettings (component, module):
else: else:
submodule = module 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) result = json.load(settings)
settings.close settings.close
@ -71,24 +73,25 @@ def loadSettings (component, module):
def assembleBackend (backend, frontends, versions): def assembleBackend (backend, frontends, versions):
settings = loadSettings('backend', backend) settings = loadSettings('backend', backend)
if backend == 'php': builderModuleName = backend + 'Builder'
backendBuilder = PhpBuilder(projectTargetDir(), frontends, versions, settings) builderClassName = backend.capitalize() + 'Builder'
elif backend == 'python':
backendBuilder = PythonBuilder(projectTargetDir(), frontends, versions, settings) builderModule = __import__(builderModuleName)
#elif backend == 'java': builderClass = getattr(builderModule, builderClassName)
# buildJavaBackend (frontends, versions, settings)
else: backendBuilder = builderClass(projectTargetDir(), frontends, versions, settings)
raise Exception('unrecognized backend: ' + backend)
backendBuilder.run() backendBuilder.run()
#==================================================================== #====================================================================
def build (settings): def build (settings, repository):
frontends = [] frontends = []
if repository.areTherePendingChanges():
print "\nWARNING: repository has pending changes\n"
for frontend in settings['frontends']: 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']: for backend in settings['backends']:
assembleBackend(backend, frontends, settings['versions']) assembleBackend(backend, frontends, settings['versions'])
@ -96,7 +99,7 @@ def build (settings):
#-------------------------------------------------------------------- #--------------------------------------------------------------------
def clean (): def clean ():
print "cleaning up …" # print "cleaning up …"
if os.path.exists(projectTargetDir()): if os.path.exists(projectTargetDir()):
shutil.rmtree(projectTargetDir()) shutil.rmtree(projectTargetDir())
@ -107,35 +110,42 @@ def usage (message):
print "ERROR: " + message print "ERROR: " + message
print print
print "build.py clean" # print "build clean"
print "build.py clean install" # print "build clean install"
print "build.py install --ALL" print "build install --ALL"
print "build.py install debug --ALL" print "build install debug --ALL"
print "build.py clean install debug --ALL" # print "build clean install debug --ALL"
print "build.ph install, debug --backends php java --frontends beta gamma" print "build install debug --backends php python --frontends beta gamma"
print "build.ph install, debug --backends php java --frontends beta gamma gamma.mobile" print "build install debug development --backends php python --frontends beta gamma gamma.mobile"
exit(1) exit(1)
#-------------------------------------------------------------------- #--------------------------------------------------------------------
def allFrontends ():
return ['beta', 'gamma', 'mobile']
def allBackends ():
return ['php', 'python']
#--------------------------------------------------------------------
def main (): def main ():
settings = {} settings = {}
parameters = list(itertools.islice(sys.argv, 1, None)) parameters = list(itertools.islice(sys.argv, 1, None))
shouldClean = len(filter(lambda x: x == 'clean', parameters)) > 0 sys.path.append(os.path.join(scriptDir(), 'backends'))
if (shouldClean): currentRepository = repository.repositoryWithPath(projectBaseDir())
clean ()
clean()
parameters = filter(lambda x: x != 'clean', parameters)
versions = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters)) 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)) parameters = deque(itertools.dropwhile(lambda x: not x.startswith('--'), parameters))
if len(parameters) > 0: if len(parameters) > 0:
parameter = parameters.popleft() parameter = parameters.popleft()
if parameter == "--ALL": if parameter == "--ALL":
settings['frontends'] = ['beta', 'gamma', 'mobile'] settings['frontends'] = allFrontends()
settings['backends'] = ['php', 'python', 'java'] settings['backends'] = allBackends()
else: else:
while parameter != None: while parameter != None:
values = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters)) values = list(itertools.takewhile(lambda x: not x.startswith('--'), parameters))
@ -158,8 +168,9 @@ def main ():
if (not settings.has_key('backends')): if (not settings.has_key('backends')):
usage("missing 'backends'") usage("missing 'backends'")
build (settings) build(settings, currentRepository)
else:
usage("Suggestions on how to call the 'build' script:")
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -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'

View 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()))
#===================================================================