from termcolor import colored
from urllib.parse import urlparse
-#on tuxfamily
-#ssh_path = 'galette/galette-repository/'
-#ssh_host = 'ssh.tuxfamily.org'
-#galette_dl_repo = 'http://download.tuxfamily.org/galette/'
-#on ulysses
-ssh_path = '/var/www/galette.eu/download/'
-ssh_host = 'ulysses.fr'
-galette_dl_repo = 'https://galette.eu/download/'
+# on Tuxfamily
+ssh_path = 'galette/galette-repository/'
+ssh_host = 'ssh.tuxfamily.org'
+galette_dl_repo = 'http://download.tuxfamily.org/galette/'
local_dl_repo = os.path.join(
os.path.dirname(
tag_commit = None
repo = None
+
def print_err(msg):
"""
Display colored error message
"""
print(colored(msg, 'red', attrs=['bold']))
+
def get_numeric_version(ver):
"""
Returns all numeric version
"""
return re.findall(r'\d+', ver)
+
def valid_version(ver):
"""
Check if provided version is valid.
"""
return '.'.join(get_numeric_version(ver)) == ver
+
def incr_version(ver):
"""
Increment version number
version[-1] = str(int(version[-1]) + 1)
return version
+
def propose_version():
"""
Propose new minor and major versions,
for tagref in tagrefs:
tag = tagref.tag
if valid_version(tag.tag):
- #last minor version is always the last one :)
+ # last minor version is always the last one :)
if tag.tag > last_minor:
last_minor = tag.tag
- #last major version
+ # last major version
if len(tag.tag) == 5 and tag.tag > last_major:
last_major = tag.tag
if verbose:
print('last minor: %s | last major %s' % (last_minor, last_major))
- #no version provided. propose one
+ # no version provided. propose one
new_minor = None
new_major = None
if len(last_minor) == 5:
- #if the latest is a major version
- new_minor = last_minor + ('.1')
+ # if the latest is a major version
+ new_minor = last_minor + '.1'
else:
new_minor = '.'.join(incr_version(last_minor))
major: %s
""" % (new_minor, new_major))
+
def get_latest_version():
"""
Look for latest version
last = None
for tagref in tagrefs:
tag = tagref.tag
- if tag != None and valid_version(tag.tag):
- #last minor version is always the last one :)
- if last == None or tag.tag > last.tag:
+ if tag is not None and valid_version(tag.tag):
+ # last minor version is always the last one :)
+ if last is None or tag.tag > last.tag:
last = tag
tag_commit = last.hexsha
return last.tag
+
def is_existing_version(ver):
"""
Look specified version exists
return True
return False
+
def is_version_bumped(ver):
"""
Check if version has been bumped in Galette configuration file
"""
global repo, tag_commit
- versions_file = repo.git.execute(["git", "show", f"{tag_commit}:{os.path.join('galette', 'config', 'versions.inc.php')}"])
+ versions_file = repo.git.execute(
+ ["git", "show", f"{tag_commit}:{os.path.join('galette', 'config', 'versions.inc.php')}"])
file_version = re.search("^define\\('GALETTE_VERSION', 'v(?P<version>.+)'\\)", versions_file, re.MULTILINE)
if file_version.group('version') != ver:
print_err('Trying to release %s, but bumped version is %s!' % (ver, file_version.group('version')))
exit(1)
+
def ask_user_confirm(msg):
"""
Ask user his confirmation
"Invalid input. Please enter 'yes' or 'no' (or 'y' or 'n')."
)
+
def get_rel_name(buildver):
"""
Build archive name from command line parameters
return archive_name
+
def _do_build(ver):
"""
Proceed build
)
if not force:
- #first check if a version
+ # first check if a version
local = False
ascLocal = False
exists = response.status == 200
if not exists:
- #also check from local repo
+ # also check from local repo
exists = os.path.exists(galette_archive)
if exists:
local = True
ascexists = response.status == 200
if not ascexists:
- #also check from local repo
+ # also check from local repo
ascexists = os.path.exists(
os.path.join(
local_dl_repo,
loctxt = ''
if local:
loctxt = 'locally '
- msg = 'Relase %s already %sexists' % (rel_name, loctxt)
+ msg = 'Release %s already %sexists' % (rel_name, loctxt)
if ascexists:
loctxt = ''
typever,
galette_archive
))
- print('Archive command: %s' % (archive_cmd))
+ print('Archive command: %s' % archive_cmd)
if commit and extra:
print('Archiving GIT commit %s' % commit)
if upload:
do_scp(galette_archive)
+
def do_sign(archive):
sign_cmd = 'gpg --detach-sign --armor %s' % archive
p1 = subprocess.Popen(sign_cmd, shell=True)
p1.communicate()
+
def do_scp(archive):
global ssh_key, ssh_host, ssh_path
- #path = 'galette/galette-repository/'
path = ssh_path
if extra:
path += 'dev/'
p1 = subprocess.Popen(scp_cmd, shell=True)
p1.communicate()
+
def add_libs(rel_name, galette_archive):
"""
Add external libraries to the archive
galette.extractall(path=src_dir)
galette.close()
- #set galette nightly version
+ # set galette nightly version
config_dir = os.path.join(src_dir, rel_name, 'galette', 'config')
if nightly_version != None:
sed_cmd = 'sed -e "s/GALETTE_NIGHTLY\', false/GALETTE_NIGHTLY\', \'%s\'/" -i versions.inc.php' % nightly_version
p1 = subprocess.Popen(sed_cmd, shell=True, cwd=config_dir)
p1.wait()
- #install npm modules
+ # install npm modules
npm_dir = os.path.join(src_dir, rel_name)
npm_cmd = 'npm install --prefix %s' % npm_dir
print(npm_cmd)
p1 = subprocess.Popen(npm_cmd, shell=True, cwd=npm_dir)
p1.wait()
- #build the UI assets
+ # build the UI assets
wp_cmd = 'npm run first-build'
p1 = subprocess.Popen(wp_cmd, shell=True, cwd=npm_dir)
p1.wait()
- #node modules are no longer needed
+ # node modules are no longer needed
shutil.rmtree(os.path.join(npm_dir, 'node_modules'))
- #UI sources and some built assets are no longer needed
+ # UI sources and some built assets are no longer needed
shutil.rmtree(os.path.join(npm_dir, 'semantic'))
shutil.rmtree(os.path.join(npm_dir, 'ui'))
shutil.rmtree(os.path.join(src_dir, rel_name, 'galette/webroot/themes/default/ui/components'))
os.remove(os.path.join(src_dir, rel_name, 'galette/webroot/themes/default/ui/semantic.css'))
os.remove(os.path.join(src_dir, rel_name, 'galette/webroot/themes/default/ui/semantic.rtl.css'))
- #install php dependencies
+ # install php dependencies
composer_cmd = 'composer install --ignore-platform-reqs --no-dev'
composer_dir = os.path.join(src_dir, rel_name, 'galette')
print(composer_dir)
p1 = subprocess.Popen(composer_cmd, shell=True, cwd=composer_dir)
p1.wait()
- #cleaunp files not required in releases
+ # cleaunp files not required in releases
todrop = [
'.travis.yml',
'apigen.neon',
if os.path.exists(os.path.join(src_dir, rel_name, '.github')):
shutil.rmtree(os.path.join(src_dir, rel_name, '.github'))
- #cleanup vendors
+ # cleanup vendors
for root, dirnames, filenames in os.walk(os.path.join(composer_dir, 'vendor')):
- #remove git directories
+ # remove git directories
for dirname in fnmatch.filter(dirnames, '.git*'):
remove_dir = os.path.join(composer_dir, root, dirname)
shutil.rmtree(remove_dir)
- #remove test directories
+ # remove test directories
for dirname in fnmatch.filter(dirnames, 'test?'):
remove_dir = os.path.join(composer_dir, root, dirname)
shutil.rmtree(remove_dir)
- #remove examples directories
+ # remove examples directories
for dirname in fnmatch.filter(dirnames, 'example?'):
remove_dir = os.path.join(composer_dir, root, dirname)
shutil.rmtree(remove_dir)
- #remove doc directories
+ # remove doc directories
for dirname in fnmatch.filter(dirnames, 'doc?'):
remove_dir = os.path.join(composer_dir, root, dirname)
shutil.rmtree(remove_dir)
- #remove composer stuff
+ # remove composer stuff
for filename in fnmatch.filter(filenames, 'composer*'):
remove_file = os.path.join(composer_dir, root, filename)
os.remove(remove_file)
for dirname in dirnames:
- #remove Faker useless languages
+ # remove Faker useless languages
if root.endswith('src/Faker/Provider'):
if dirname not in ['en_US', 'fr_FR', 'de_DE']:
shutil.rmtree(os.path.join(root, dirname))
- #begin to remove tcpdf not used fonts
+ # begin to remove tcpdf not used fonts
if root.endswith('tcpdf/fonts'):
if dirname != 'dejavu-fonts-ttf-2.34':
shutil.rmtree(os.path.join(root, dirname))
for filename in filenames:
if os.path.islink(os.path.join(root, filename)):
os.remove(os.path.join(root, filename))
- #remove tcpdf not used fonts
+ # remove tcpdf not used fonts
if root.endswith('tcpdf/fonts'):
if filename not in [
- 'dejavusansbi.ctg.z',
- 'dejavusansbi.z',
- 'dejavusansb.z',
- 'dejavusansi.ctg.z',
- 'dejavusansi.z',
- 'dejavusans.z',
- 'zapfdingbats.php',
- 'dejavusansb.ctg.z',
- 'dejavusansbi.php',
- 'dejavusansb.php',
- 'dejavusans.ctg.z',
- 'dejavusansi.php',
- 'dejavusans.php',
- 'helvetica.php'
+ 'dejavusansbi.ctg.z',
+ 'dejavusansbi.z',
+ 'dejavusansb.z',
+ 'dejavusansi.ctg.z',
+ 'dejavusansi.z',
+ 'dejavusans.z',
+ 'zapfdingbats.php',
+ 'dejavusansb.ctg.z',
+ 'dejavusansbi.php',
+ 'dejavusansb.php',
+ 'dejavusans.ctg.z',
+ 'dejavusansi.php',
+ 'dejavusans.php',
+ 'helvetica.php'
]:
os.remove(os.path.join(root, filename))
galette.close()
shutil.rmtree(src_dir)
+
def valid_commit(repo, c):
"""
- Validate commit existance in repository
+ Validate commit existence in repository
Also prepare version for GALETTE_NIGHTLY value
"""
global commit, nightly_version
except gitdb.exc.BadObject:
return False
+
def main():
"""
Main method
"""
- global verbose, tagrefs, force, extra, assume_yes, nightly, sign, ssh_key, repo
+ global verbose, tagrefs, force, extra, assume_yes, nightly, sign, ssh_key, repo, ssh_host, ssh_path, galette_dl_repo
parser = argparse.ArgumentParser(description='Release Galette')
group = parser.add_mutually_exclusive_group()
'--ssh-key',
help='SSH key to be used for uploading',
)
+ parser.add_argument(
+ '-H',
+ '--ssh-host',
+ help='SSH host to upload to (default %s)' % ssh_host
+ )
+ parser.add_argument(
+ '-P',
+ '--ssh-path',
+ help='Path on SSH host (default %s)' % ssh_path
+ )
+ parser.add_argument(
+ '-d',
+ '--download-url',
+ help='Download URL (default %s)' % galette_dl_repo
+ )
parser.add_argument('-f', action='store_true')
args = parser.parse_args()
- verbose=args.verbose
+ verbose = args.verbose
if verbose:
print(args)
force = ask_user_confirm(
'Are you *REALLY* sure you mean -f when you typed -f? [yes/No] '
)
- assume_yes=args.assume_yes
+ assume_yes = args.assume_yes
if args.ssh_key:
ssh_key = args.ssh_key
+ if args.ssh_host:
+ ssh_host = args.ssh_host
+
+ if args.ssh_path:
+ ssh_path = args.ssh_path
+
+ if args.download_url:
+ galette_dl_repo = args.download_url
+
build = False
buildver = None
if args.nightly:
print_err('%s is not a valid version number!' % args.version)
sys.exit(1)
else:
- #check if specified version exists
+ # check if specified version exists
if not is_existing_version(args.version):
print_err('%s does not exist!' % args.version)
else:
if build:
_do_build(buildver)
+
if __name__ == "__main__":
main()