Browse Source

ob: canonical presentation of header arguments when hashing

* lisp/ob.el (org-babel-sha1-hash): Sort list values to header
  arguments, and sort the words in strings.
Eric Schulte 8 years ago
parent
commit
dd31a84af6
1 changed files with 23 additions and 16 deletions
  1. 23 16
      lisp/ob.el

+ 23 - 16
lisp/ob.el

@@ -711,22 +711,29 @@ the current subtree."
     (setf (nth 2 info)
 	  (sort (copy-sequence (nth 2 info))
 		(lambda (a b) (string< (car a) (car b)))))
-    (let ((hash (sha1
-		 (format "%s-%s"
-			 (mapconcat
-			  #'identity
-			  (delq nil
-				(mapcar
-				 (lambda (arg)
-				   (let ((v (cdr arg)))
-				     (when (and v (not (and (sequencep v)
-							    (not (consp v))
-							    (= (length v) 0))))
-				       (format "%S" v))))
-				 (nth 2 info))) ":")
-			 (nth 1 info)))))
-      (when (interactive-p) (message hash))
-      hash)))
+    ((lambda (hash) (when (interactive-p) (message hash)) hash)
+     (sha1 (format "%s-%s"
+		   (mapconcat
+		    #'identity
+		    (delq nil
+			  (mapcar
+			   (lambda (arg)
+			     (let ((v (cdr arg)))
+			       (when (and v (not (and (sequencep v)
+						      (not (consp v))
+						      (= (length v) 0))))
+				 ((lambda (el) (format "%S" el))
+				  (cond
+				   ((and (listp v) ; lists are sorted
+					 (member (car arg) '(:result-params)))
+				    (sort v #'string<))
+				   ((and (stringp v) ; strings are sorted
+					 (member (car arg) '(:results :exports)))
+				    (mapconcat #'identity (sort (split-string v)
+								#'string<) " "))
+				   (t v)))))) ; atomic are left untouched
+			   (nth 2 info))) ":")
+		   (nth 1 info))))))
 
 (defun org-babel-result-hash (&optional info)
   "Return the in-buffer hash associated with INFO."