diff options
-rw-r--r-- | snakemake-test.el | 10 | ||||
-rw-r--r-- | snakemake.el | 17 |
2 files changed, 22 insertions, 5 deletions
diff --git a/snakemake-test.el b/snakemake-test.el index 25713af..213d13c 100644 --- a/snakemake-test.el +++ b/snakemake-test.el @@ -812,7 +812,15 @@ two words" (snakemake-check-target "aa.out"))) (should-not (snakemake-with-temp-dir - (snakemake-check-target "aa.out.not-target")))) + (snakemake-check-target "aa.out.not-target"))) + ;; Write-protected targets should be recognized as valid targets + ;; despite Snakemake throwing an error. + (should + (snakemake-with-temp-dir + (with-temp-file "bb.out" (insert "")) + (set-file-modes "bb.out" (file-modes-symbolic-to-number "u=r")) + (with-temp-file "aa.out" (insert "")) + (snakemake-check-target "bb.out")))) (ert-deftest snakemake-test-org-link-file-targets () (should (equal '("/path/to/fname") diff --git a/snakemake.el b/snakemake.el index 9a93f9e..9ec7b42 100644 --- a/snakemake.el +++ b/snakemake.el @@ -258,15 +258,24 @@ The file list is determined by the output of (regexp-opt (list "MissingRuleException" "RuleException"))) +(defconst snakemake-valid-target-re "ProtectedOutputException" + "Regular expression indicating valid target. +If this matches, the target will be considered valid even if the +exit status is non-zero.") + (defun snakemake-check-target (target &optional directory) "Return non-nil if TARGET is a valid target for DIRECTORY's Snakefile." (snakemake-with-cache directory (target) (with-temp-buffer - (when (= 0 (snakemake-insert-output "--quiet" "--dryrun" target)) + (let ((ex-code (snakemake-insert-output "--quiet" "--dryrun" target))) (goto-char (point-min)) - ;; Lean towards misclassifying targets as valid rather than - ;; silently dropping valid targets as invalid. - (not (re-search-forward snakemake-invalid-target-re nil t)))))) + (cond + ((re-search-forward snakemake-valid-target-re nil t)) + ((and (= ex-code 0) + ;; Lean towards misclassifying targets as valid rather + ;; than silently dropping valid targets as invalid. + (not (re-search-forward snakemake-invalid-target-re + nil t))))))))) (declare-function org-element-context "org-element") (declare-function org-element-property "org-element") |