Fix #835: el-get-update treat prop removal now

Use the new source or abort if non-whitelisted properties are changed.

fixes #835
This commit is contained in:
Takafumi Arakaki 2012-08-31 23:43:50 +02:00
parent d5b6d874bd
commit aa0aae272b

View File

@ -238,6 +238,22 @@ are not."
else do (setq disallowed (plist-put disallowed k v))
finally return (list update disallowed)))
(defun el-get-non-whitelisted-properties-changed-p (old-source new-source)
"Test if non-whitelisted properties are changed."
(loop for k in (set-difference
(remove-duplicates
(append (loop for (k _) on old-source by 'cddr collect k)
(loop for (k _) on new-source by 'cddr collect k)))
el-get-status-recipe-update-whitelist)
for in-old-p = (plist-member old-source k)
for in-new-p = (plist-member new-source k)
for old-val = (plist-get old-source k)
for new-val = (plist-get new-source k)
if (or (and (not in-old-p) in-new-p) ; added
(and (not in-new-p) in-old-p) ; removed
(not (equal old-val new-val))) ; changed
return t))
(defun* el-get-merge-properties-into-status (package-or-source
&optional package-status-alist
&key noerror skip-non-updatable)
@ -291,7 +307,7 @@ non-whitelisted changes, and no error will be raised.
append (list k v))))
(destructuring-bind (update disallowed)
(el-get-classify-new-properties cached-recipe source)
(when disallowed
(when (el-get-non-whitelisted-properties-changed-p cached-recipe source)
;; Emit a verbose message if `noerror' is t (but still quit
;; the function).
(funcall (if noerror 'el-get-verbose-message 'error)
@ -307,11 +323,9 @@ Maybe you should use `el-get-update' or `el-get-reinstall' on %s instead?"
(el-get-source-name cached-recipe))
(return-from el-get-merge-properties-into-status))
(when update
(loop for (k v) on update by 'cddr
do (plist-put cached-recipe k v))
(if save-to-file
(el-get-save-package-status package "installed" cached-recipe)
(el-get-save-package-status package "installed" source)
(plist-put (cdr (assq package package-status-alist))
'recipe cached-recipe))))))
'recipe source))))))
(provide 'el-get-status)