-def checkProg(description, progs, rc_entry = [], path = [] ):
- '''
- This function will search a program in $PATH plus given path
- If found, return directory and program name (not the options).
-
- description: description of the program
-
- progs: check programs, for each prog, the first word is used
- for searching but the whole string is used to replace
- %% for a rc_entry. So, feel free to add '$$i' etc for programs.
-
- path: additional pathes
-
- rc_entry: entry to outfile, can be
- 1. emtpy: no rc entry will be added
- 2. one pattern: %% will be replaced by the first found program,
- or 'none' is no program is found.
- 3. several patterns for each prog and 'none'. This is used
- when different programs have different usages. If you do not
- want 'none' entry to be added to the RC file, you can specify
- an entry for each prog and use '' for the 'none' entry.
-
- '''
- # one rc entry for each progs plus none entry
- if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
- print "rc entry should have one item or item for each prog and none."
- sys.exit(2)
- print 'checking for ' + description + '...'
- ## print '(' + ','.join(progs) + ')',
- for idx in range(len(progs)):
- # ac_prog may have options, ac_word is the command name
- ac_prog = progs[idx]
- ac_word = ac_prog.split(' ')[0]
- print '+checking for "' + ac_word + '"... ',
- path = os.environ["PATH"].split(os.pathsep) + path
- for ac_dir in path:
- # check both ac_word and ac_word.exe (for windows system)
- if os.path.isfile( os.path.join(ac_dir, ac_word) ) or \
- os.path.isfile( os.path.join(ac_dir, ac_word + ".exe") ):
- print ' yes'
- # write rc entries for this command
+def checkProg(description, progs, rc_entry = [], path = [], not_found = ''):
+ '''
+ This function will search a program in $PATH plus given path
+ If found, return directory and program name (not the options).
+
+ description: description of the program
+
+ progs: check programs, for each prog, the first word is used
+ for searching but the whole string is used to replace
+ %% for a rc_entry. So, feel free to add '$$i' etc for programs.
+
+ path: additional pathes
+
+ rc_entry: entry to outfile, can be
+ 1. emtpy: no rc entry will be added
+ 2. one pattern: %% will be replaced by the first found program,
+ or '' if no program is found.
+ 3. several patterns for each prog and not_found. This is used
+ when different programs have different usages. If you do not
+ want not_found entry to be added to the RC file, you can specify
+ an entry for each prog and use '' for the not_found entry.
+
+ not_found: the value that should be used instead of '' if no program
+ was found
+
+ '''
+ # one rc entry for each progs plus not_found entry
+ if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
+ logger.error("rc entry should have one item or item for each prog and not_found.")
+ sys.exit(2)
+ logger.info('checking for ' + description + '...')
+ ## print '(' + ','.join(progs) + ')',
+ for idx in range(len(progs)):
+ # ac_prog may have options, ac_word is the command name
+ ac_prog = progs[idx]
+ ac_word = ac_prog.split(' ')[0]
+ msg = '+checking for "' + ac_word + '"... '
+ path = os.environ["PATH"].split(os.pathsep) + path
+ extlist = ['']
+ if os.environ.has_key("PATHEXT"):
+ extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
+ for ac_dir in path:
+ for ext in extlist:
+ if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
+ logger.info(msg + ' yes')
+ # write rc entries for this command
+ if len(rc_entry) == 1:
+ addToRC(rc_entry[0].replace('%%', ac_prog))
+ elif len(rc_entry) > 1:
+ addToRC(rc_entry[idx].replace('%%', ac_prog))
+ return [ac_dir, ac_word]
+ # if not successful
+ logger.info(msg + ' no')
+ # write rc entries for 'not found'
+ if len(rc_entry) > 0: # the last one.
+ addToRC(rc_entry[-1].replace('%%', not_found))
+ return ['', not_found]
+
+
+def checkProgAlternatives(description, progs, rc_entry = [], alt_rc_entry = [], path = [], not_found = ''):
+ '''
+ The same as checkProg, but additionally, all found programs will be added
+ as alt_rc_entries
+ '''
+ # one rc entry for each progs plus not_found entry
+ if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
+ logger.error("rc entry should have one item or item for each prog and not_found.")
+ sys.exit(2)
+ logger.info('checking for ' + description + '...')
+ ## print '(' + ','.join(progs) + ')',
+ found_prime = False
+ real_ac_dir = ''
+ real_ac_word = not_found
+ for idx in range(len(progs)):
+ # ac_prog may have options, ac_word is the command name
+ ac_prog = progs[idx]
+ ac_word = ac_prog.split(' ')[0]
+ msg = '+checking for "' + ac_word + '"... '
+ path = os.environ["PATH"].split(os.pathsep) + path
+ extlist = ['']
+ if os.environ.has_key("PATHEXT"):
+ extlist = extlist + os.environ["PATHEXT"].split(os.pathsep)
+ found_alt = False
+ for ac_dir in path:
+ for ext in extlist:
+ if os.path.isfile( os.path.join(ac_dir, ac_word + ext) ):
+ logger.info(msg + ' yes')
+ pr = re.compile(r'(\\\S+)(.*)$')
+ m = None
+ # write rc entries for this command
+ if found_prime == False:
+ if len(rc_entry) == 1:
+ addToRC(rc_entry[0].replace('%%', ac_prog))
+ elif len(rc_entry) > 1:
+ addToRC(rc_entry[idx].replace('%%', ac_prog))
+ real_ac_dir = ac_dir
+ real_ac_word = ac_word
+ found_prime = True
+ if len(alt_rc_entry) == 1:
+ alt_rc = alt_rc_entry[0]
+ if alt_rc == "":
+ # if no explicit alt_rc is given, construct one
+ m = pr.match(rc_entry[0])
+ if m:
+ alt_rc = m.group(1) + "_alternatives" + m.group(2)
+ addToRC(alt_rc.replace('%%', ac_prog))
+ elif len(alt_rc_entry) > 1:
+ alt_rc = alt_rc_entry[idx]
+ if alt_rc == "":
+ # if no explicit alt_rc is given, construct one
+ m = pr.match(rc_entry[idx])
+ if m:
+ alt_rc = m.group(1) + "_alternatives" + m.group(2)
+ addToRC(alt_rc.replace('%%', ac_prog))
+ found_alt = True
+ break
+ if found_alt:
+ break
+ if found_alt == False:
+ # if not successful
+ logger.info(msg + ' no')
+ if found_prime:
+ return [real_ac_dir, real_ac_word]
+ # write rc entries for 'not found'
+ if len(rc_entry) > 0: # the last one.
+ addToRC(rc_entry[-1].replace('%%', not_found))
+ return ['', not_found]
+
+
+def addViewerAlternatives(rcs):
+ r = re.compile(r'\\Format (\S+).*$')
+ m = None
+ alt = ''
+ for idxx in range(len(rcs)):
+ if len(rcs) == 1:
+ m = r.match(rcs[0])
+ if m:
+ alt = r'\viewer_alternatives ' + m.group(1) + " %%"
+ elif len(rcs) > 1:
+ m = r.match(rcs[idxx])
+ if m:
+ if idxx > 0:
+ alt += '\n'
+ alt += r'\viewer_alternatives ' + m.group(1) + " %%"
+ return alt
+
+
+def addEditorAlternatives(rcs):
+ r = re.compile(r'\\Format (\S+).*$')
+ m = None
+ alt = ''
+ for idxx in range(len(rcs)):
+ if len(rcs) == 1:
+ m = r.match(rcs[0])
+ if m:
+ alt = r'\editor_alternatives ' + m.group(1) + " %%"
+ elif len(rcs) > 1:
+ m = r.match(rcs[idxx])
+ if m:
+ if idxx > 0:
+ alt += '\n'
+ alt += r'\editor_alternatives ' + m.group(1) + " %%"
+ return alt
+
+
+def checkViewer(description, progs, rc_entry = [], path = []):
+ ''' The same as checkProgAlternatives, but for viewers '''
+ if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
+ logger.error("rc entry should have one item or item for each prog and not_found.")
+ sys.exit(2)
+ alt_rc_entry = []
+ for idx in range(len(progs)):
+ if len(rc_entry) == 1:
+ rcs = rc_entry[0].split('\n')
+ alt = addViewerAlternatives(rcs)
+ alt_rc_entry.insert(0, alt)
+ elif len(rc_entry) > 1:
+ rcs = rc_entry[idx].split('\n')
+ alt = addViewerAlternatives(rcs)
+ alt_rc_entry.insert(idx, alt)
+ return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
+
+
+def checkEditor(description, progs, rc_entry = [], path = []):
+ ''' The same as checkProgAlternatives, but for editors '''
+ if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
+ logger.error("rc entry should have one item or item for each prog and not_found.")
+ sys.exit(2)
+ alt_rc_entry = []
+ for idx in range(len(progs)):
+ if len(rc_entry) == 1:
+ rcs = rc_entry[0].split('\n')
+ alt = addEditorAlternatives(rcs)
+ alt_rc_entry.insert(0, alt)
+ elif len(rc_entry) > 1:
+ rcs = rc_entry[idx].split('\n')
+ alt = addEditorAlternatives(rcs)
+ alt_rc_entry.insert(idx, alt)
+ return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
+
+
+def checkViewerNoRC(description, progs, rc_entry = [], path = []):
+ ''' The same as checkViewer, but do not add rc entry '''
+ if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
+ logger.error("rc entry should have one item or item for each prog and not_found.")
+ sys.exit(2)
+ alt_rc_entry = []
+ for idx in range(len(progs)):
+ if len(rc_entry) == 1:
+ rcs = rc_entry[0].split('\n')
+ alt = addViewerAlternatives(rcs)
+ alt_rc_entry.insert(0, alt)
+ elif len(rc_entry) > 1:
+ rcs = rc_entry[idx].split('\n')
+ alt = addViewerAlternatives(rcs)
+ alt_rc_entry.insert(idx, alt)
+ rc_entry = []
+ return checkProgAlternatives(description, progs, rc_entry, alt_rc_entry, path, not_found = 'auto')
+
+
+def checkEditorNoRC(description, progs, rc_entry = [], path = []):
+ ''' The same as checkViewer, but do not add rc entry '''
+ if len(rc_entry) > 1 and len(rc_entry) != len(progs) + 1:
+ logger.error("rc entry should have one item or item for each prog and not_found.")
+ sys.exit(2)
+ alt_rc_entry = []
+ for idx in range(len(progs)):