Mercurial > hg > graal-jvmci-8
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]: ' |