comparison mxtool/mx.py @ 21166:f383ff4c9af8

mx: fix JDK selection when running outside a tty, capture STRICT_COMPLIANCE from the env file, make sure raw_input promt goes to stdout
author Gilles Duboscq <gilles.m.duboscq@oracle.com>
date Thu, 30 Apr 2015 20:29:27 +0200
parents bdeaa5a7b83c
children fbe449ca9707
comparison
equal deleted inserted replaced
21165:bdeaa5a7b83c 21166:f383ff4c9af8
44 import difflib 44 import difflib
45 from collections import Callable 45 from collections import Callable
46 from threading import Thread 46 from threading import Thread
47 from argparse import ArgumentParser, REMAINDER 47 from argparse import ArgumentParser, REMAINDER
48 from os.path import join, basename, dirname, exists, getmtime, isabs, expandvars, isdir, isfile 48 from os.path import join, basename, dirname, exists, getmtime, isabs, expandvars, isdir, isfile
49
50 # needed to work around https://bugs.python.org/issue1927
51 import readline
52 #then make pylint happy..
53 readline.get_line_buffer()
49 54
50 # Support for Python 2.6 55 # Support for Python 2.6
51 def check_output(*popenargs, **kwargs): 56 def check_output(*popenargs, **kwargs):
52 process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) 57 process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
53 output, _ = process.communicate() 58 output, _ = process.communicate()
1670 self.add_argument('--Jp', action='append', dest='java_args_pfx', help='prefix Java VM arguments (e.g. --Jp @-dsa)', metavar='@<args>', default=[]) 1675 self.add_argument('--Jp', action='append', dest='java_args_pfx', help='prefix Java VM arguments (e.g. --Jp @-dsa)', metavar='@<args>', default=[])
1671 self.add_argument('--Ja', action='append', dest='java_args_sfx', help='suffix Java VM arguments (e.g. --Ja @-dsa)', metavar='@<args>', default=[]) 1676 self.add_argument('--Ja', action='append', dest='java_args_sfx', help='suffix Java VM arguments (e.g. --Ja @-dsa)', metavar='@<args>', default=[])
1672 self.add_argument('--user-home', help='users home directory', metavar='<path>', default=os.path.expanduser('~')) 1677 self.add_argument('--user-home', help='users home directory', metavar='<path>', default=os.path.expanduser('~'))
1673 self.add_argument('--java-home', help='primary JDK directory (must be JDK 7 or later)', metavar='<path>') 1678 self.add_argument('--java-home', help='primary JDK directory (must be JDK 7 or later)', metavar='<path>')
1674 self.add_argument('--extra-java-homes', help='secondary JDK directories separated by "' + os.pathsep + '"', metavar='<path>') 1679 self.add_argument('--extra-java-homes', help='secondary JDK directories separated by "' + os.pathsep + '"', metavar='<path>')
1675 self.add_argument('--strict-compliance', action='store_true', dest='strict_compliance', help='Projects of a certain compliance will only be built with a JDK of this exact compliance', default=bool(os.environ.get('STRICT_COMPLIANCE'))) 1680 self.add_argument('--strict-compliance', action='store_true', dest='strict_compliance', help='Projects of a certain compliance will only be built with a JDK of this exact compliance', default=False)
1676 self.add_argument('--ignore-project', action='append', dest='ignored_projects', help='name of project to ignore', metavar='<name>', default=[]) 1681 self.add_argument('--ignore-project', action='append', dest='ignored_projects', help='name of project to ignore', metavar='<name>', default=[])
1677 self.add_argument('--kill-with-sigquit', action='store_true', dest='killwithsigquit', help='send sigquit first before killing child processes') 1682 self.add_argument('--kill-with-sigquit', action='store_true', dest='killwithsigquit', help='send sigquit first before killing child processes')
1678 if get_os() != 'windows': 1683 if get_os() != 'windows':
1679 # Time outs are (currently) implemented with Unix specific functionality 1684 # Time outs are (currently) implemented with Unix specific functionality
1680 self.add_argument('--timeout', help='timeout (in seconds) for command', type=int, default=0, metavar='<secs>') 1685 self.add_argument('--timeout', help='timeout (in seconds) for command', type=int, default=0, metavar='<secs>')
1702 abort('Could not find user home. Use --user-home option or ensure HOME environment variable is set.') 1707 abort('Could not find user home. Use --user-home option or ensure HOME environment variable is set.')
1703 1708
1704 if opts.java_home: 1709 if opts.java_home:
1705 os.environ['JAVA_HOME'] = opts.java_home 1710 os.environ['JAVA_HOME'] = opts.java_home
1706 os.environ['HOME'] = opts.user_home 1711 os.environ['HOME'] = opts.user_home
1712
1713 if os.environ.get('STRICT_COMPLIANCE'):
1714 _opts.strict_compliance = True
1707 1715
1708 opts.ignored_projects = opts.ignored_projects + os.environ.get('IGNORED_PROJECTS', '').split(',') 1716 opts.ignored_projects = opts.ignored_projects + os.environ.get('IGNORED_PROJECTS', '').split(',')
1709 1717
1710 commandAndArgs = opts.__dict__.pop('commandAndArgs') 1718 commandAndArgs = opts.__dict__.pop('commandAndArgs')
1711 return opts, commandAndArgs 1719 return opts, commandAndArgs
1834 candidateJdks = [join(base, n) for n in os.listdir(base)] 1842 candidateJdks = [join(base, n) for n in os.listdir(base)]
1835 1843
1836 configs = _filtered_jdk_configs(candidateJdks, versionCheck) 1844 configs = _filtered_jdk_configs(candidateJdks, versionCheck)
1837 else: 1845 else:
1838 if not isDefaultJdk: 1846 if not isDefaultJdk:
1839 log('find_jdk(versionCheck={0}, versionDescription={1}, purpose={2}, cancel={3})={4}'.format(versionCheck, versionDescription, purpose, cancel, result))
1840 return result 1847 return result
1841 configs = [result] 1848 configs = [result]
1842 1849
1843 if len(configs) > 1: 1850 if len(configs) > 1:
1844 msg = 'Please select a ' 1851 if not is_interactive():
1845 if isDefaultJdk: 1852 msg = "Multiple possible choices for a JDK"
1846 msg += 'default ' 1853 if purpose:
1847 msg += 'JDK' 1854 msg += ' for' + purpose
1848 if purpose: 1855 msg += ': '
1849 msg += ' for' + purpose 1856 if versionDescription:
1850 msg += ': ' 1857 msg += '(' + versionDescription + ')'
1851 if versionDescription: 1858 selected = configs[0]
1852 msg = msg + '(' + versionDescription + ')' 1859 msg += ". Selecting " + str(selected)
1853 log(msg) 1860 log(msg)
1854 choices = configs + ['<other>'] 1861 else:
1855 if cancel: 1862 msg = 'Please select a '
1856 choices.append('Cancel (' + cancel + ')') 1863 if isDefaultJdk:
1857 selected = select_items(choices, allowMultiple=False) 1864 msg += 'default '
1858 if isinstance(selected, types.StringTypes) and selected == '<other>': 1865 msg += 'JDK'
1859 selected = None 1866 if purpose:
1860 if isinstance(selected, types.StringTypes) and selected == 'Cancel (' + cancel + ')': 1867 msg += ' for' + purpose
1861 return None 1868 msg += ': '
1869 if versionDescription:
1870 msg += '(' + versionDescription + ')'
1871 log(msg)
1872 choices = configs + ['<other>']
1873 if cancel:
1874 choices.append('Cancel (' + cancel + ')')
1875 selected = select_items(choices, allowMultiple=False)
1876 if isinstance(selected, types.StringTypes) and selected == '<other>':
1877 selected = None
1878 if isinstance(selected, types.StringTypes) and selected == 'Cancel (' + cancel + ')':
1879 return None
1862 elif len(configs) == 1: 1880 elif len(configs) == 1:
1863 selected = configs[0] 1881 selected = configs[0]
1864 msg = 'Selected ' + str(selected) + ' as ' 1882 msg = 'Selected ' + str(selected) + ' as '
1865 if isDefaultJdk: 1883 if isDefaultJdk:
1866 msg += 'default' 1884 msg += 'default'
1885 selected = _find_jdk_in_candidates([jdkLocation], versionCheck, warn=True) 1903 selected = _find_jdk_in_candidates([jdkLocation], versionCheck, warn=True)
1886 1904
1887 varName = 'JAVA_HOME' if isDefaultJdk else 'EXTRA_JAVA_HOMES' 1905 varName = 'JAVA_HOME' if isDefaultJdk else 'EXTRA_JAVA_HOMES'
1888 allowMultiple = not isDefaultJdk 1906 allowMultiple = not isDefaultJdk
1889 envPath = join(_primary_suite.mxDir, 'env') 1907 envPath = join(_primary_suite.mxDir, 'env')
1890 if ask_yes_no('Persist this setting by adding "{0}={1}" to {2}'.format(varName, selected.jdk, envPath), 'y'): 1908 if is_interactive() and ask_yes_no('Persist this setting by adding "{0}={1}" to {2}'.format(varName, selected.jdk, envPath), 'y'):
1891 envLines = [] 1909 envLines = []
1892 with open(envPath) as fp: 1910 with open(envPath) as fp:
1893 append = True 1911 append = True
1894 for line in fp: 1912 for line in fp:
1895 if line.rstrip().startswith(varName): 1913 if line.rstrip().startswith(varName):
1916 1934
1917 if varName == 'JAVA_HOME': 1935 if varName == 'JAVA_HOME':
1918 os.environ['JAVA_HOME'] = selected.jdk 1936 os.environ['JAVA_HOME'] = selected.jdk
1919 1937
1920 return selected 1938 return selected
1939
1940 def is_interactive():
1941 return sys.__stdin__.isatty()
1921 1942
1922 def _filtered_jdk_configs(candidates, versionCheck, warn=False, source=None): 1943 def _filtered_jdk_configs(candidates, versionCheck, warn=False, source=None):
1923 filtered = [] 1944 filtered = []
1924 for candidate in candidates: 1945 for candidate in candidates:
1925 try: 1946 try:
4867 if not refreshOnly: 4888 if not refreshOnly:
4868 fsckprojects([]) 4889 fsckprojects([])
4869 4890
4870 def fsckprojects(args): 4891 def fsckprojects(args):
4871 """find directories corresponding to deleted Java projects and delete them""" 4892 """find directories corresponding to deleted Java projects and delete them"""
4872 if not sys.stdout.isatty(): 4893 if not is_interactive():
4873 log('fsckprojects command must be run in an interactive shell') 4894 log('fsckprojects command must be run in an interactive shell')
4874 return 4895 return
4875 hg = HgConfig() 4896 hg = HgConfig()
4876 for suite in suites(True): 4897 for suite in suites(True):
4877 projectDirs = [p.dir for p in suite.projects] 4898 projectDirs = [p.dir for p in suite.projects]
4892 if len(indicators) != 0: 4913 if len(indicators) != 0:
4893 indicators = [os.path.relpath(join(dirpath, i), suite.dir) for i in indicators] 4914 indicators = [os.path.relpath(join(dirpath, i), suite.dir) for i in indicators]
4894 indicatorsInHg = hg.locate(suite.dir, indicators) 4915 indicatorsInHg = hg.locate(suite.dir, indicators)
4895 # Only proceed if there are indicator files that are not under HG 4916 # Only proceed if there are indicator files that are not under HG
4896 if len(indicators) > len(indicatorsInHg): 4917 if len(indicators) > len(indicatorsInHg):
4897 if not sys.stdout.isatty() or ask_yes_no(dirpath + ' looks like a removed project -- delete it', 'n'): 4918 if not is_interactive() or ask_yes_no(dirpath + ' looks like a removed project -- delete it', 'n'):
4898 shutil.rmtree(dirpath) 4919 shutil.rmtree(dirpath)
4899 log('Deleted ' + dirpath) 4920 log('Deleted ' + dirpath)
4900 4921
4901 def javadoc(args, parser=None, docDir='javadoc', includeDeps=True, stdDoclet=True): 4922 def javadoc(args, parser=None, docDir='javadoc', includeDeps=True, stdDoclet=True):
4902 """generate javadoc for some/all Java projects""" 4923 """generate javadoc for some/all Java projects"""
5232 5253
5233 """ 5254 """
5234 if len(items) <= 1: 5255 if len(items) <= 1:
5235 return items 5256 return items
5236 else: 5257 else:
5258 assert is_interactive()
5237 numlen = str(len(str(len(items)))) 5259 numlen = str(len(str(len(items))))
5238 if allowMultiple: 5260 if allowMultiple:
5239 log(('[{0:>' + numlen + '}] <all>').format(0)) 5261 log(('[{0:>' + numlen + '}] <all>').format(0))
5240 for i in range(0, len(items)): 5262 for i in range(0, len(items)):
5241 if descriptions is None: 5263 if descriptions is None:
5413 _show_section('distributions', s.dists) 5435 _show_section('distributions', s.dists)
5414 5436
5415 def ask_yes_no(question, default=None): 5437 def ask_yes_no(question, default=None):
5416 """""" 5438 """"""
5417 assert not default or default == 'y' or default == 'n' 5439 assert not default or default == 'y' or default == 'n'
5418 if not sys.stdout.isatty(): 5440 if not is_interactive():
5419 if default: 5441 if default:
5420 return default 5442 return default
5421 else: 5443 else:
5422 abort("Can not answer '" + question + "?' if stdout is not a tty") 5444 abort("Can not answer '" + question + "?' if stdout is not a tty")
5423 questionMark = '? [yn]: ' 5445 questionMark = '? [yn]: '