@@ -118,6 +118,7 @@ Setting it too high causes prints fewer status updates."
118
118
elpaca--checkout-ref
119
119
elpaca--run-pre-build-commands
120
120
elpaca--queue-dependencies
121
+ elpaca--check-version
121
122
elpaca--link-build-files
122
123
elpaca--generate-autoloads-async
123
124
elpaca--byte-compile
@@ -1090,6 +1091,67 @@ The keyword's value is expected to be one of the following:
1090
1091
(elpaca--directory-files-recursively file regexp))
1091
1092
(when (string-match-p regexp file) (expand-file-name file)))))))
1092
1093
1094
+ (defvar elpaca--tag-regexp " v\\ (.*\\ )" )
1095
+ (defun elpaca--latest-tag (e )
1096
+ " Return E's latest merged tag matching recipe tag regexp or `elpaca--tag-regexp' ."
1097
+ (when-let ((default-directory (elpaca<-repo-dir e))
1098
+ (recipe (elpaca<-recipe e))
1099
+ (regexp (or (plist-get recipe :version-regexp ) elpaca--tag-regexp))
1100
+ (tags (elpaca-with-process
1101
+ (elpaca-process-call " git" " tag" " --sort=-taggerdate" " --merged" )
1102
+ (when (and success stdout) (split-string stdout " \n " 'omit-nulls )))))
1103
+ (cl-loop for tag in tags when (string-match regexp tag) do
1104
+ (cl-return (or (match-string 1 tag) (match-string 0 tag))))))
1105
+
1106
+ (defun elpaca--date-version (e )
1107
+ " Return date of E's checked out commit."
1108
+ (let ((default-directory (elpaca<-repo-dir e)))
1109
+ (elpaca-with-process
1110
+ (elpaca-process-call " git" " log" " -n" " 1" " --format=%cd" " --date=format:%Y%m%d.%s" )
1111
+ (if (not success ) (elpaca--fail e stderr) (version-to-list (string-trim stdout))))))
1112
+
1113
+ (defvar elpaca--core-date
1114
+ (list (or (and emacs-build-time (string-to-number (format-time-string " %Y%m%d" emacs-build-time)))
1115
+ (alist-get emacs-version '((" 27.1" . 20200804 ) (" 27.2" . 20210319 ) (" 28.1" . 20220403 )
1116
+ (" 28.2" . 20220912 ) (" 29.1" . 20230730 ))
1117
+ nil nil #'equal )
1118
+ (warn " Unable to determine elpaca--core-date" ))))
1119
+
1120
+ (defun elpaca--declared-version (e )
1121
+ " Return E's version as listed in main file's metadata."
1122
+ (when-let ((repo (elpaca<-repo-dir e))
1123
+ (main (elpaca--main-file e)))
1124
+ (with-current-buffer (get-buffer-create " *elpaca--dependencies*" )
1125
+ (setq default-directory repo)
1126
+ (insert-file-contents-literally main nil nil nil 'replace )
1127
+ (goto-char (point-min ))
1128
+ (if (string-suffix-p " -pkg.el" main)
1129
+ (nth 2 (read (current-buffer )))
1130
+ (when-let ((case-fold-search t )
1131
+ (regexp " ^;+[ ]+\\ (Package-\\ )?\\ (Version\\ )[ ]*:[ ]*" )
1132
+ ((re-search-forward regexp nil 'noerror )))
1133
+ (buffer-substring-no-properties (point ) (line-end-position )))))))
1134
+
1135
+ (defun elpaca--check-version (e )
1136
+ " Ensure E's dependency versions are met."
1137
+ (cl-loop
1138
+ initially (elpaca--signal e " Checking dependency versions" )
1139
+ with queued = (elpaca--queued)
1140
+ for (id declared) in (elpaca--dependencies e)
1141
+ for min = (version-to-list declared)
1142
+ for datep = (> (car min ) 10000 ) ; ; Handle YYYYMMDD date version schema.
1143
+ for dep = (elpaca-alist-get id queued)
1144
+ for core = (unless dep (elpaca-alist-get id package--builtin-versions))
1145
+ when (or (and core (version-list-< (if datep elpaca--core-date core) min ))
1146
+ (unless (memq id elpaca-ignored-dependencies)
1147
+ (let ((version (if datep (elpaca--date-version dep)
1148
+ (version-to-list (or (elpaca--declared-version dep) " 0" )))))
1149
+ (and (version-list-< version min )
1150
+ (let ((tag (elpaca--latest-tag dep)))
1151
+ (or (null tag) (version-list-< (version-to-list tag) min )))))))
1152
+ do (cl-return (elpaca--fail e (format " Requires %s >= %s " id declared))))
1153
+ (elpaca--continue-build e))
1154
+
1093
1155
(defun elpaca--main-file (e &optional recache )
1094
1156
" Return E's main file name. Recompute when RECACHE non-nil."
1095
1157
(or (and (not recache) (elpaca<-main e))
@@ -1152,20 +1214,15 @@ If RECACHE is non-nil, do not use cached dependencies."
1152
1214
(unless (memq 'continued-dep (elpaca<-statuses e))
1153
1215
(elpaca--continue-build e nil 'continued-dep )))
1154
1216
1155
- ; ;@MAYBE: Package major version checks.
1156
1217
(defun elpaca--queue-dependencies (e )
1157
1218
" Queue E's dependencies."
1158
1219
(cl-loop
1159
- named out
1160
1220
initially (elpaca--signal e " Queueing Dependencies" 'blocked nil 1 )
1161
- with externals =
1162
- (cl-loop for (id version) in (elpaca--dependencies e)
1163
- when (and (eq id 'emacs )
1164
- (< emacs-major-version (truncate (string-to-number version))))
1165
- do (cl-return-from out (elpaca--fail e (concat " Requires Emacs " version)))
1166
- unless (memq id elpaca-ignored-dependencies) collect id)
1167
- with q = (and externals (elpaca--q e))
1168
- with qd = (and externals (elpaca--queued))
1221
+ with externals = (or (cl-loop for (id . _) in (elpaca--dependencies e)
1222
+ unless (memq id elpaca-ignored-dependencies) collect id)
1223
+ (cl-return (elpaca--continue-build e " No external dependencies" 'unblocked )))
1224
+ with q = (elpaca--q e)
1225
+ with qd = (elpaca--queued)
1169
1226
with finished = 0
1170
1227
with q-id = (elpaca<-queue-id e)
1171
1228
with e-id = (elpaca<-id e)
@@ -1176,7 +1233,7 @@ If RECACHE is non-nil, do not use cached dependencies."
1176
1233
for d-id = (elpaca<-id d)
1177
1234
for d-status = (elpaca--status d)
1178
1235
do (and queued (> (elpaca<-queue-id d) q-id)
1179
- (cl-return-from out (elpaca--fail d (format " dependent %S in past queue " e-id))))
1236
+ (cl-return (elpaca--fail d (format " dependent %S in past queue " e-id))))
1180
1237
(cl-pushnew e-id (elpaca<-dependents d))
1181
1238
(when (or (eq d-status 'queued )
1182
1239
(and (elpaca--throttled-p d) (= elpaca-queue-limit 1 ) ; ; Dependency must be continued.
@@ -1193,8 +1250,7 @@ If RECACHE is non-nil, do not use cached dependencies."
1193
1250
(cl-pushnew e-id (elpaca<-blocking d))
1194
1251
(cl-pushnew d-id (elpaca<-blockers e)))
1195
1252
finally do (if (= (length externals) finished)
1196
- (elpaca--continue-build
1197
- e (when (zerop finished) " No external dependencies" ) 'unblocked )
1253
+ (elpaca--continue-build e nil 'unblocked )
1198
1254
(mapc #'elpaca--continue-dependency pending))))
1199
1255
1200
1256
(defun elpaca--remote-default-branch (remote )
0 commit comments