From mboxrd@z Thu Jan 1 00:00:00 1970 Path: main.gmane.org!not-for-mail From: Matthew Mundell Newsgroups: gmane.emacs.devel Subject: Re: dired-do-touch Date: 22 Mar 2004 23:45:14 +0000 Sender: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Message-ID: <87vfkwbg51.fsf@sno.mundell.ukfsn.org> References: <20040321165848.0DB3C662F8@imf.math.ku.dk> <405DDAF3.2080608@math.ku.dk> NNTP-Posting-Host: deer.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: sea.gmane.org 1079999399 22779 80.91.224.253 (22 Mar 2004 23:49:59 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Mon, 22 Mar 2004 23:49:59 +0000 (UTC) Original-X-From: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Tue Mar 23 00:49:54 2004 Return-path: Original-Received: from quimby.gnus.org ([80.91.224.244]) by deer.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 1B5ZB4-0006J7-00 for ; Tue, 23 Mar 2004 00:49:54 +0100 Original-Received: from monty-python.gnu.org ([199.232.76.173]) by quimby.gnus.org with esmtp (Exim 3.35 #1 (Debian)) id 1B5ZB3-0004sx-00 for ; Tue, 23 Mar 2004 00:49:53 +0100 Original-Received: from localhost ([127.0.0.1] helo=monty-python.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.30) id 1B5ZAV-0004Em-1e for emacs-devel@quimby.gnus.org; Mon, 22 Mar 2004 18:49:19 -0500 Original-Received: from list by monty-python.gnu.org with tmda-scanned (Exim 4.30) id 1B5Z9z-0004EZ-C7 for emacs-devel@gnu.org; Mon, 22 Mar 2004 18:48:47 -0500 Original-Received: from mail by monty-python.gnu.org with spam-scanned (Exim 4.30) id 1B5Z9T-00045w-7y for emacs-devel@gnu.org; Mon, 22 Mar 2004 18:48:46 -0500 Original-Received: from [217.158.120.143] (helo=mail.ukfsn.org) by monty-python.gnu.org with esmtp (Exim 4.30) id 1B5Z9S-00045M-C8 for emacs-devel@gnu.org; Mon, 22 Mar 2004 18:48:14 -0500 Original-Received: from localhost (lucy.ukfsn.org [127.0.0.1]) by mail.ukfsn.org (Postfix) with ESMTP id 1CA4FE6D4D for ; Mon, 22 Mar 2004 23:47:47 +0000 (GMT) Original-Received: from mail.ukfsn.org ([127.0.0.1]) by localhost (lucy.ukfsn.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 32520-18 for ; Mon, 22 Mar 2004 23:47:46 +0000 (GMT) Original-Received: from sno.mundell.ukfsn.org (dsl213-218-238-16.as15444.net [213.218.238.16]) by mail.ukfsn.org (Postfix) with ESMTP id A8AFDE6A9A for ; Mon, 22 Mar 2004 23:47:46 +0000 (GMT) Original-Received: from sno.mundell.ukfsn.org ([10.0.0.3]) by sno.mundell.ukfsn.org with esmtp (Exim 3.36 #1 (Debian)) id 1B5Z9L-00024W-00 for ; Mon, 22 Mar 2004 23:48:07 +0000 Original-To: emacs-devel User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3.50 Original-Lines: 155 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.4 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+emacs-devel=quimby.gnus.org@gnu.org Xref: main.gmane.org gmane.emacs.devel:20754 X-Report-Spam: http://spam.gmane.org/gmane.emacs.devel:20754 Here's a version of dired-do-touch which operates on the selected files in the same manner as the other Dired uppercase operations. This version uses set-file-times, a primitive interface to set_file_times, to touch the files. The set-file-times primitive uses lisp_time_argument to get or parse the time. This requires the change to editfns.c to provide lisp_time_argument externally. Making this change will require the set-file-times file name handler to be added to the list of handlers in the Elisp reference. =================================================================== RCS file: /cvsroot/emacs/emacs/lisp/dired-aux.el,v diff -u -r1.114 dired-aux.el --- lisp/dired-aux.el 8 Feb 2004 22:38:51 -0000 1.114 +++ lisp/dired-aux.el 22 Mar 2004 21:53:58 -0000 @@ -2135,6 +2135,29 @@ (backward-delete-char 1)) (message "%s" (buffer-string)))) +(defun dired-touch () + "Touch current file. Return file name on failure, else nil." + (let ((file (dired-get-filename)) + fail) + (condition-case err + (set-file-times file (current-time)) + (error (setq fail err))) + (if fail + (progn + (dired-log "Setting time on `%s' failed:\n%s\n" + file fail) + (dired-make-relative file))))) + +;;;###autoload +(defun dired-do-touch (&optional arg) + "Set the selected files' access and mod times to the current time. + +With non-zero prefix argument ARG, the command operates on the +next ARG files. Otherwise, it operates on all the marked files, +or the current file if none are marked." + (interactive "P") + (dired-map-over-marks-check (function dired-touch) arg 'touch nil)) + (provide 'dired-aux) ;;; arch-tag: 4b508de9-a153-423d-8d3f-a1bbd86f4f60 =================================================================== RCS file: /cvsroot/emacs/emacs/src/editfns.c,v diff -u -r1.368 editfns.c --- src/editfns.c 2 Mar 2004 21:42:03 -0000 1.368 +++ src/editfns.c 22 Mar 2004 22:01:45 -0000 @@ -73,7 +73,7 @@ static void find_field P_ ((Lisp_Object, Lisp_Object, Lisp_Object, int *, Lisp_Object, int *)); static void update_buffer_properties P_ ((int, int)); static Lisp_Object region_limit P_ ((int)); -static int lisp_time_argument P_ ((Lisp_Object, time_t *, int *)); +int lisp_time_argument P_ ((Lisp_Object, time_t *, int *)); static size_t emacs_memftimeu P_ ((char *, size_t, const char *, size_t, const struct tm *, int)); static void general_insert_function P_ ((void (*) (const unsigned char *, int), @@ -1377,7 +1377,7 @@ } -static int +int lisp_time_argument (specified_time, result, usec) Lisp_Object specified_time; time_t *result; =================================================================== RCS file: /cvsroot/emacs/emacs/src/fileio.c,v diff -u -r1.499 fileio.c --- src/fileio.c 18 Mar 2004 02:58:45 -0000 1.499 +++ src/fileio.c 22 Mar 2004 21:53:23 -0000 @@ -323,6 +323,7 @@ Lisp_Object Qfile_accessible_directory_p; Lisp_Object Qfile_modes; Lisp_Object Qset_file_modes; +Lisp_Object Qset_file_times; Lisp_Object Qfile_newer_than_file_p; Lisp_Object Qinsert_file_contents; Lisp_Object Qwrite_region; @@ -3438,7 +3439,45 @@ XSETINT (value, (~ realmask) & 0777); return value; } + +DEFUN ("set-file-times", Fset_file_times, Sset_file_times, 1, 2, 0, + doc: /* Set access and modification times of file FILENAME. +If optional second argument TIME is supplied then it is used instead +of the current time. TIME must be in the format of +`current-time'. */) + (filename, time) + Lisp_Object filename, time; +{ + Lisp_Object absname, encoded_absname; + Lisp_Object handler; + time_t sec; + int usec; + + if (! lisp_time_argument (time, &sec, &usec)) + error ("Invalid time specification"); + + absname = Fexpand_file_name (filename, current_buffer->directory); + + /* If the file name has special constructs in it, + call the corresponding file handler. */ + handler = Ffind_file_name_handler (absname, Qset_file_times); + if (!NILP (handler)) + return call3 (handler, Qset_file_times, absname, time); + + encoded_absname = ENCODE_FILE (absname); + + { + EMACS_TIME t; + EMACS_SET_SECS (t, sec); + EMACS_SET_USECS (t, usec); + + if (set_file_times (SDATA (encoded_absname), t, t) < 0) + report_file_error ("Setting file times", Fcons (absname, Qnil)); + } + + return Qnil; +} #ifdef __NetBSD__ #define unix 42 @@ -6339,6 +6378,7 @@ Qfile_accessible_directory_p = intern ("file-accessible-directory-p"); Qfile_modes = intern ("file-modes"); Qset_file_modes = intern ("set-file-modes"); + Qset_file_times = intern ("set-file-times"); Qfile_newer_than_file_p = intern ("file-newer-than-file-p"); Qinsert_file_contents = intern ("insert-file-contents"); Qwrite_region = intern ("write-region"); @@ -6372,6 +6412,7 @@ staticpro (&Qfile_accessible_directory_p); staticpro (&Qfile_modes); staticpro (&Qset_file_modes); + staticpro (&Qset_file_times); staticpro (&Qfile_newer_than_file_p); staticpro (&Qinsert_file_contents); staticpro (&Qwrite_region); @@ -6595,6 +6636,7 @@ defsubr (&Sfile_regular_p); defsubr (&Sfile_modes); defsubr (&Sset_file_modes); + defsubr (&Sset_file_times); defsubr (&Sset_default_file_modes); defsubr (&Sdefault_file_modes); defsubr (&Sfile_newer_than_file_p);