X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=autorandr.py;h=f62ad073b5b9ab118104a58d699df51debbf640e;hb=ff75a031efc63ef6c6f645a971180f3f1f8ebc8c;hp=bde96346db29cdd768b460f649a07627978ac6aa;hpb=1aab2d350bc8e8be376947e0a791d8cf4bd0c5ed;p=deb_pkgs%2Fautorandr.git diff --git a/autorandr.py b/autorandr.py index bde9634..f62ad07 100755 --- a/autorandr.py +++ b/autorandr.py @@ -557,12 +557,18 @@ def call_and_retry(*args, **kwargs): waits a second and then retries once. This mitigates #47, a timing issue with some drivers. """ - kwargs_redirected = dict(kwargs) - if hasattr(subprocess, "DEVNULL"): - kwargs_redirected["stdout"] = getattr(subprocess, "DEVNULL") + if "dry_run" in kwargs: + dry_run = kwargs["dry_run"] + del kwargs["dry_run"] else: - kwargs_redirected["stdout"] = open(os.devnull, "w") - kwargs_redirected["stderr"] = kwargs_redirected["stdout"] + dry_run = False + kwargs_redirected = dict(kwargs) + if not dry_run: + if hasattr(subprocess, "DEVNULL"): + kwargs_redirected["stdout"] = getattr(subprocess, "DEVNULL") + else: + kwargs_redirected["stdout"] = open(os.devnull, "w") + kwargs_redirected["stderr"] = kwargs_redirected["stdout"] retval = subprocess.call(*args, **kwargs_redirected) if retval != 0: time.sleep(1) @@ -622,13 +628,13 @@ def apply_configuration(new_configuration, current_configuration, dry_run=False) # Perform pe-change auxiliary changes if auxiliary_changes_pre: argv = base_argv + list(chain.from_iterable(auxiliary_changes_pre)) - if call_and_retry(argv) != 0: + if call_and_retry(argv, dry_run=dry_run) != 0: raise AutorandrException("Command failed: %s" % " ".join(argv)) # Disable unused outputs, but make sure that there always is at least one active screen disable_keep = 0 if remain_active_count else 1 if len(disable_outputs) > disable_keep: - if call_and_retry(base_argv + list(chain.from_iterable(disable_outputs[:-1] if disable_keep else disable_outputs))) != 0: + if call_and_retry(base_argv + list(chain.from_iterable(disable_outputs[:-1] if disable_keep else disable_outputs)), dry_run=dry_run) != 0: # Disabling the outputs failed. Retry with the next command: # Sometimes disabling of outputs fails due to an invalid RRSetScreenSize. # This does not occur if simultaneously the primary screen is reset. @@ -647,7 +653,7 @@ def apply_configuration(new_configuration, current_configuration, dry_run=False) operations = disable_outputs + enable_outputs for index in range(0, len(operations), 2): argv = base_argv + list(chain.from_iterable(operations[index:index+2])) - if call_and_retry(argv) != 0: + if call_and_retry(argv, dry_run=dry_run) != 0: raise AutorandrException("Command failed: %s" % " ".join(argv)) def is_equal_configuration(source_configuration, target_configuration): @@ -761,7 +767,10 @@ def exec_scripts(profile_path, script_name, meta_information=None): if script_name not in ran_scripts: script = os.path.join(folder, script_name) if os.access(script, os.X_OK | os.F_OK): - all_ok &= subprocess.call(script, env=env) != 0 + try: + all_ok &= subprocess.call(script, env=env) != 0 + except: + raise AutorandrException("Failed to execute user command: %s" % (script,)) ran_scripts.add(script_name) script_folder = os.path.join(folder, "%s.d" % script_name) @@ -771,7 +780,10 @@ def exec_scripts(profile_path, script_name, meta_information=None): if check_name not in ran_scripts: script = os.path.join(script_folder, file_name) if os.access(script, os.X_OK | os.F_OK): - all_ok &= subprocess.call(script, env=env) != 0 + try: + all_ok &= subprocess.call(script, env=env) != 0 + except: + raise AutorandrException("Failed to execute user command: %s" % (script,)) ran_scripts.add(check_name) return all_ok @@ -1036,6 +1048,8 @@ def main(argv): apply_configuration(load_config, config, True) apply_configuration(load_config, config, False) exec_scripts(scripts_path, "postswitch", script_metadata) + except AutorandrException as e: + raise AutorandrException("Failed to apply profile '%s'" % load_profile, e, e.report_bug) except Exception as e: raise AutorandrException("Failed to apply profile '%s'" % load_profile, e, True)