summaryrefslogtreecommitdiff
path: root/support/try/try
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/try/try
Initial commit
Diffstat (limited to 'support/try/try')
-rwxr-xr-xsupport/try/try167
1 files changed, 167 insertions, 0 deletions
diff --git a/support/try/try b/support/try/try
new file mode 100755
index 0000000000..a3886cc20f
--- /dev/null
+++ b/support/try/try
@@ -0,0 +1,167 @@
+#!/usr/bin/env python
+
+# Copyright 2013-2014 Ajabu Tex
+#
+# This file is part of TrY.
+#
+# TrY is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# TrY is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with TrY. If not, see <http://www.gnu.org/licenses/>.
+
+import sys
+from datetime import datetime
+import argparse
+import os
+import subprocess
+
+prog_name = 'TrY'
+prog_cmd = 'try'
+prog_version = '4.0'
+prog_author = 'Ajabu Tex'
+prog_revisiondate = 'Jan 2, 2014'
+prog_releasedate = '2014'
+prog_license = prog_name + ' ' + prog_version + '\n' + \
+ 'Copyright 2013-' + prog_releasedate + ' ' + prog_author + '\n' + \
+ 'There is NO warranty. Redistribution of this software is\n' + \
+ 'covered by the terms of both the ' + prog_name + ' copyright and\n' + \
+ 'the GNU General Public License.\n' + \
+ 'For more information about these matters, see the file\n' + \
+ 'named COPYING and the ' + prog_name + ' source.\n' + \
+ 'Author of ' + prog_name + ': ' + prog_author + '.'
+
+def append_to_logfile(a_file_name, a_string_line):
+ if a_string_line.startswith('This is ' + prog_name + \
+ ' ver. ' + prog_version + ' revision ' + prog_revisiondate):
+ openmode = 'w'
+ else:
+ openmode = 'a'
+ now = datetime.now()
+ time_string = now.strftime("%d %b %Y %H:%M:%S.%f")
+ log_string = time_string + ' ' + a_string_line
+ logfile_name = a_file_name + '.trylog'
+ logfile = open(logfile_name, openmode)
+ logfile.write(log_string + '\n')
+ logfile.close
+
+def notify(text, args):
+ if args.log:
+ append_to_logfile(args.filename, text)
+ if args.verbose:
+ print (text)
+
+def get_args():
+ parser = argparse.ArgumentParser(
+ prog=prog_cmd,
+ usage='%(prog)s [options] filename',
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ description='''\
+ ''' + prog_name + '''
+ TeX automation tool''',
+ epilog='(C) 2013-' + prog_releasedate + ' ' + prog_author)
+ parser.add_argument('-l', '--log',
+ action='store_true',
+ help='generate a log output')
+ parser.add_argument('-s' ,'--safe',
+ action='store_true',
+ help='print the list of commands prior to execute them')
+ parser.add_argument('-v', '--verbose',
+ action='store_true',
+ help='print the command output')
+ parser.add_argument('-V', '--version',
+ action='version',
+ version=prog_license)
+ parser.add_argument('filename', nargs='?', default='')
+ args = parser.parse_args()
+ if args.filename == '':
+ parser.print_help()
+ return args
+
+def get_commentchar_from(str_list):
+ result = '%'
+ for str_line in str_list:
+ if '$trycommentchar=' in str_line:
+ str_line = str_line.rpartition('$trycommentchar=')[2]
+ str_line = str_line.rsplit('$')[0]
+ result = str_line
+ return result
+
+def get_trystatement_list_from(str_list, args, flag):
+ file_name = args.filename
+ result = []
+ for str_line in str_list:
+ if str_line.startswith(flag):
+ if '$0' in str_line:
+ str_line = str_line.replace('$0', file_name)
+ str_line = str_line.strip()
+ str_line = str_line.partition(flag)[2]
+ notify('Found command ' + str_line, args)
+ result.append(str_line)
+ return result
+
+def get_trystatements_from(args):
+ file_name = args.filename
+ notify('Looking for ' + prog_name + ' commands in ' + file_name, args)
+ f = open(file_name, 'r')
+ str_lines = f.readlines()
+ f.close()
+ comment_char = get_commentchar_from(str_lines)
+ notify('Comment char used: ' + comment_char, args)
+ try_statement_flag = comment_char + '$ '
+ result = get_trystatement_list_from(str_lines,
+ args, try_statement_flag)
+ return result
+
+def execution_confirmed_of(str_lst):
+ prompt = 'These are the commands that will be processed:\n'
+ for str_line in str_lst:
+ prompt += str_line + '\n'
+ prompt += '\n\nDo you want to continue? [Yes/No]\n'
+ answer = raw_input(prompt)
+ result = answer in ['Y', 'y', 'Yes', 'yes']
+ return result
+
+def execute_statements(try_statements, args):
+ if len(try_statements) == 0:
+ notify('No commands found.', args)
+ sys.exit()
+ else:
+ for statement in try_statements:
+ notify('Executing instruction: ' + statement, args)
+ exit_status = subprocess.call([statement],
+ stdout=subprocess.PIPE, shell=True)
+ if exit_status != 0:
+ notify(prog_name + ': error at system level. \n' + \
+ 'Execution aborted with exit status ' + \
+ str(exit_status) + '\n', args)
+ sys.exit(exit_status)
+ else:
+ notify('SUCCESS', args)
+
+if __name__ == "__main__":
+ args = get_args()
+ if not args.filename =='':
+ notify('This is ' + prog_name + ' ver. ' + prog_version + \
+ ' revision ' + prog_revisiondate + '\n', args)
+ try_statements = get_trystatements_from(args)
+ if len(try_statements) == 0:
+ notify('No commands found in ' + args.filename + '.', args)
+ sys.exit('Nothing to execute.')
+ else:
+ if args.safe:
+ if execution_confirmed_of(try_statements):
+ execute_statements(try_statements, args)
+ else:
+ notify('Execution stopped by the user.', args)
+ sys.exit('Execution aborted.')
+ else:
+ execute_statements(try_statements, args)
+