diff options
| -rw-r--r-- | scripts/.gitignore | 3 | ||||
| -rw-r--r-- | scripts/env.yml.sample | 7 | ||||
| -rwxr-xr-x | scripts/uploadrelease.py | 113 |
3 files changed, 111 insertions, 12 deletions
diff --git a/scripts/.gitignore b/scripts/.gitignore index 3e0e62b2..43d23186 100644 --- a/scripts/.gitignore +++ b/scripts/.gitignore @@ -1,2 +1,5 @@ +# ADOdb scripts config file +/env.yml + # Python byte code *.pyc diff --git a/scripts/env.yml.sample b/scripts/env.yml.sample new file mode 100644 index 00000000..fce3840d --- /dev/null +++ b/scripts/env.yml.sample @@ -0,0 +1,7 @@ +# ADOdb maintenance scripts configuration file +# Rename this file to 'env.yml' and update variables below as appropriate. + +# SourceForge API key +# Get it from https://sourceforge.net/auth/preferences/ +# under "Releases API Key" +api_key: diff --git a/scripts/uploadrelease.py b/scripts/uploadrelease.py index 9f6f0aee..bdf98e23 100755 --- a/scripts/uploadrelease.py +++ b/scripts/uploadrelease.py @@ -7,30 +7,37 @@ from distutils.version import LooseVersion import getopt import getpass import glob +import json import os from os import path import re +import requests import subprocess import sys +import yaml # Directories and files to exclude from release tarballs # for debugging, set to a local dir e.g. "localhost:/tmp/sf-adodb/" sf_files = "frs.sourceforge.net:/home/frs/project/adodb/" +# SourceForge Release API base URL +# https://sourceforge.net/p/forge/documentation/Using%20the%20Release%20API/ +sf_api_url = 'https://sourceforge.net/projects/adodb/files/{}/' + # rsync command template rsync_cmd = "rsync -vP --rsh ssh {opt} {src} {usr}@{dst}" # Command-line options -options = "hu:n" -long_options = ["help", "user=", "dry-run"] +options = "hu:ns" +long_options = ["help", "user=", "dry-run", "skip-upload"] def usage(): print '''Usage: %s [options] username [release_path] This script will upload the files in the given directory (or the - current one if unspecified) to Sourceforge. + current one if unspecified) to SourceForge. Parameters: release_path Location of the release files to upload @@ -38,12 +45,12 @@ def usage(): Options: -h | --help Show this usage message - -u | --user <name> Sourceforge account (defaults to current user) + -u | --user <name> SourceForge account (defaults to current user) -n | --dry-run Do not upload the files ''' % ( path.basename(__file__) ) -#end usage() +# end usage() def call_rsync(usr, opt, src, dst): @@ -99,7 +106,7 @@ def get_release_version(): def sourceforge_target_dir(version): - ''' Returns the sourceforge target directory, relative to the root + ''' Returns the SourceForge target directory, relative to the root directory (defined in sf_files global variable): basedir/subdir, with basedir: - for ADOdb version 5: adodb-php5-only @@ -127,10 +134,29 @@ def sourceforge_target_dir(version): return directory +def load_env(): + global api_key + + # Load the config file + env_file = path.join(path.dirname(path.abspath(__file__)), 'env.yml') + try: + stream = file(env_file, 'r') + y = yaml.safe_load(stream) + except IOError: + print("ERROR: Environment file {} not found".format(env_file)) + sys.exit(3) + except yaml.parser.ParserError as e: + print("ERROR: Invalid Environment file") + print(e) + sys.exit(3) + + api_key = y['api_key'] + + def process_command_line(): ''' Retrieve command-line options and set global variables accordingly ''' - global upload_files, upload_doc, dry_run, username, release_path + global dry_run, username, release_path, skip_upload # Get command-line options try: @@ -142,7 +168,7 @@ def process_command_line(): # Default values for flags username = getpass.getuser() - print username + skip_upload = False dry_run = False for opt, val in opts: @@ -153,7 +179,11 @@ def process_command_line(): elif opt in ("-u", "--user"): username = val + elif opt in ("-s", "--skip-upload"): + skip_upload = True + elif opt in ("-n", "--dry-run"): + print("Dry-run mode - files will not be uploaded or modified") dry_run = True # Mandatory parameters @@ -177,6 +207,7 @@ def upload_release_files(): print "Uploading release files..." print " Source:", release_path print " Target: " + target + print " Files: " + ', '.join(glob.glob('*')) print call_rsync( username, @@ -184,17 +215,75 @@ def upload_release_files(): path.join(release_path, "*"), target ) + print -def main(): - process_command_line() +def set_sourceforge_file_info(): + global api_key, dry_run + + print("Updating uploaded files information") + base_url = sf_api_url.format( + sourceforge_target_dir(get_release_version()) + ) + headers = {'Accept': 'application/json"'} + + # Loop through uploaded files + for file in glob.glob('adodb-*'): + print(" " + file) + + # Determine defaults based on file extension + ext = file.split('.', 3)[3] + if ext == 'zip': + defaults = ['windows'] + elif ext == 'tar.gz': + defaults = ['linux', 'mac', 'bsd', 'solaris', 'others'] + else: + print("WARNING: Unknown extension for file " + file) + continue + + # SourceForge API request + url = path.join(base_url, file) + payload = { + 'default': defaults, + 'api_key': api_key + } + if dry_run: + req = requests.Request('PUT', url, headers=headers, params=payload) + r = req.prepare() + print(" Calling SourceForge Release API: " + r.url) + else: + req = requests.put(url, headers=headers, params=payload) + + # Print results + if req.status_code == requests.codes.ok: + result = json.loads(req.text)['result'] + print(" Download default for: " + result['x_sf']['default']) + else: + if req.status_code == requests.codes.unauthorized: + err = "access denied" + else: + err = "SourceForge API call failed" + print("ERROR: {} - check API key".format(err)) + break + + +def main(): # Start upload process print "ADOdb release upload script" - upload_release_files() + load_env() + process_command_line() + + global skip_upload + if skip_upload: + print("Skipping upload of release files") + else: + upload_release_files() + + set_sourceforge_file_info() -#end main() +# end main() if __name__ == "__main__": main() |
