#! /usr/bin/python3
#
# Copyright (C) 2015 VMware, Inc. All rights reserved.
# publishtool for working with photonpublish
#
# Author(s): Priyesh Padmavilasom
#
import sys
import getopt
from photonpublish import photonPublish
from publishconst import publishConst
const = publishConst()
class publishTool:
def __init__(self, context):
self._context = context
self._publish = photonPublish(context)
#check local files against remote repo
def check(self):
result = self._publish.check(self._context['srcroot'])
print('Updates: %d' % len(result[const.updates]))
print('New: %d' % len(result[const.new]))
print('Verified: %d' % len(result[const.verified]))
print('Obsoletes: %d' % len(result[const.obsoletes]))
print('New files are : %s' %(result[const.new]))
return result
def hasPendingSync(self, advice):
return advice[const.updates] or advice[const.new]
#apply advices to sync remote.
#note: discarding/removing is stll getting resolved pending bintray api
def push(self):
advice = self.check()
if not self._context['silent']:
if not self.hasPendingSync(advice):
print('No changes to push.')
return
choice = input('Continue? y/N:')
if choice != 'y':
print('Aborted on user command')
return
print('push local changes to remote...')
self._publish.syncRemote(self._context['srcroot'], advice)
def printsha1(self, files, label):
print('sha1sum of %s >>>' % label)
for f in files:
print('%s - %s' % (f['name'], f['sha1']))
def makesha1(self):
advice = self.check()
verified = len(advice[const.verified])
if verified <= 0:
print('no files verified. nothing to do.')
return
self.printsha1(advice[const.verified], const.verified)
def writesha1(self):
if 'sha1file' not in self._context.keys():
raise Exception('writesha1 requires a file to write to. specify in --sha1file')
advice = self.check()
verified = advice[const.verified]
verifiedLen = len(advice[const.verified])
if verifiedLen <= 0:
print('no files verified. nothing to do.')
return
with open(self._context['sha1file'], 'w') as sha1file:
for f in verified:
if f['name'] == const.sha1allfilename:
continue
sha1file.write('%s - %s\n' % (f['name'], f['sha1']))
def publish(self):
pending = self._publish.getUnpublished()
pendingCount = len(pending)
if not self._context['silent']:
if pendingCount == 0:
print('No pending changes to publish.')
return
print('Found %d pending files to publish' % pendingCount)
choice = input('Continue? y/N:')
if choice != 'y':
print('Aborted on user command')
return
print(self._publish.publish())
def showUsage():
print('Usage:')
print('check status: publishTool.py \
--config <config file> --srcroot <source root folder> \
--action check')
print('push files: publishTool.py \
--config <config file> --srcroot <source root folder> \
--action push')
print('publish pushed files: publishTool.py \
--config <config file> folder> --action publish')
print('make sha1 file: publishTool.py \
--config <config file> folder> --srcroot <source root folder> \
--action makesha1')
print('write sha1 file: publishTool.py \
--config <config file> folder> --srcroot <source root folder> \
--sha1file <sha1 file path> --action writesha1')
#
def main(argv):
try:
context = {'silent':False}
opts, args = getopt.getopt(
sys.argv[1:],
'',
['config=',
'srcroot=',
'action=',
'sha1file=',
'silent=',
'help'])
for opt, arg in opts:
if opt == '--config':
context['config'] = arg
elif opt == '--srcroot':
context['srcroot'] = arg
elif opt == '--action':
context['action'] = arg
elif opt == '--silent':
context['silent'] = arg
elif opt == '--sha1file':
context['sha1file'] = arg
elif opt == '--help':
showUsage()
return
except Exception as e:
showUsage()
sys.exit(1)
try:
tool = publishTool(context)
if context['action'] == 'push':
tool.push()
elif context['action'] == 'check':
tool.check()
elif context['action'] == 'makesha1':
tool.makesha1()
elif context['action'] == 'writesha1':
tool.writesha1()
elif context['action'] == 'publish':
tool.publish()
except Exception as e:
print("Error: %s" % e)
sys.exit(1)
if __name__ == "__main__":
main(sys.argv)