160 |
;; uniquify-fix-list data structure |
;; uniquify-fix-list data structure |
161 |
(defstruct (uniquify-item |
(defstruct (uniquify-item |
162 |
(:constructor nil) (:copier nil) |
(:constructor nil) (:copier nil) |
163 |
(:constructor uniquify-make-item (base filename buffer proposed))) |
(:constructor uniquify-make-item (base dirname buffer proposed))) |
164 |
base filename buffer proposed) |
base dirname buffer proposed) |
165 |
|
|
166 |
;; Internal variables used free |
;; Internal variables used free |
167 |
(defvar uniquify-possibly-resolvable nil) |
(defvar uniquify-possibly-resolvable nil) |
251 |
(uniquify-rationalize-conflicting-sublist conflicting-sublist |
(uniquify-rationalize-conflicting-sublist conflicting-sublist |
252 |
old-proposed depth))) |
old-proposed depth))) |
253 |
|
|
254 |
(defun uniquify-get-proposed-name (base filename &optional depth) |
(defun uniquify-get-proposed-name (base dirname &optional depth) |
255 |
(unless depth (setq depth uniquify-min-dir-content)) |
(unless depth (setq depth uniquify-min-dir-content)) |
256 |
(assert (equal (directory-file-name filename) filename)) ;No trailing slash. |
(assert (equal (directory-file-name dirname) dirname)) ;No trailing slash. |
257 |
|
|
258 |
;; Distinguish directories by adding extra separator. |
;; Distinguish directories by adding extra separator. |
259 |
(if (and uniquify-trailing-separator-p |
(if (and uniquify-trailing-separator-p |
260 |
(file-directory-p (expand-file-name base filename)) |
(file-directory-p (expand-file-name base dirname)) |
261 |
(not (string-equal base ""))) |
(not (string-equal base ""))) |
262 |
(cond ((eq uniquify-buffer-name-style 'forward) |
(cond ((eq uniquify-buffer-name-style 'forward) |
263 |
(setq base (file-name-as-directory base))) |
(setq base (file-name-as-directory base))) |
267 |
|
|
268 |
(let ((extra-string nil) |
(let ((extra-string nil) |
269 |
(n depth)) |
(n depth)) |
270 |
(while (and (> n 0) filename) |
(while (and (> n 0) dirname) |
271 |
(let ((file (file-name-nondirectory filename))) |
(let ((file (file-name-nondirectory dirname))) |
272 |
(when (setq filename (file-name-directory filename)) |
(when (setq dirname (file-name-directory dirname)) |
273 |
(setq filename (directory-file-name filename))) |
(setq dirname (directory-file-name dirname))) |
274 |
(setq n (1- n)) |
(setq n (1- n)) |
275 |
(push (if (zerop (length file)) ;nil or "". |
(push (if (zerop (length file)) ;nil or "". |
276 |
(prog1 "" (setq filename nil)) ;Could be `filename' iso "". |
(prog1 "" (setq dirname nil)) ;Could be `dirname' iso "". |
277 |
file) |
file) |
278 |
extra-string))) |
extra-string))) |
279 |
(when (zerop n) |
(when (zerop n) |
280 |
(if (and filename extra-string |
(if (and dirname extra-string |
281 |
(equal filename (file-name-directory filename))) |
(equal dirname (file-name-directory dirname))) |
282 |
;; We're just before the root. Let's add the leading / already. |
;; We're just before the root. Let's add the leading / already. |
283 |
;; With "/a/b"+"/c/d/b" this leads to "/a/b" and "d/b" but with |
;; With "/a/b"+"/c/d/b" this leads to "/a/b" and "d/b" but with |
284 |
;; "/a/b"+"/c/a/b" this leads to "/a/b" and "a/b". |
;; "/a/b"+"/c/a/b" this leads to "/a/b" and "a/b". |
322 |
(setf (uniquify-item-proposed item) |
(setf (uniquify-item-proposed item) |
323 |
(uniquify-get-proposed-name |
(uniquify-get-proposed-name |
324 |
(uniquify-item-base item) |
(uniquify-item-base item) |
325 |
(uniquify-item-filename item) |
(uniquify-item-dirname item) |
326 |
depth))) |
depth))) |
327 |
(uniquify-rationalize-a-list conf-list depth)) |
(uniquify-rationalize-a-list conf-list depth)) |
328 |
(unless (string= old-name "") |
(unless (string= old-name "") |