support/pushsources/publishtool.py
225a3b12
 #! /usr/bin/python2
 #
 #    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])
         return result
 
     def hasPendingSync(self, advice):
         return (len(advice[const.updates]) > 0 or len(advice[const.new]) > 0)
 
     #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 = raw_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 = raw_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, 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, e:
         print "Error: %s" % e
         sys.exit(1)
 
 
 if __name__ == "__main__":
     main(sys.argv)