emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] /srv/bzr/emacs/trunk r99889: Try to detect file modificati


From: Stefan Monnier
Subject: [Emacs-diffs] /srv/bzr/emacs/trunk r99889: Try to detect file modification within the same second.
Date: Mon, 12 Apr 2010 21:47:40 -0400
User-agent: Bazaar (2.0.3)

------------------------------------------------------------
revno: 99889
committer: Stefan Monnier <address@hidden>
branch nick: trunk
timestamp: Mon 2010-04-12 21:47:40 -0400
message:
  Try to detect file modification within the same second.
  * buffer.h (struct buffer): New field modtime_size.
  * buffer.c (reset_buffer): Initialize it.
  * fileio.c (Finsert_file_contents, Fwrite_region): Set it.
  (Fverify_visited_file_modtime): Check it.
  (Fclear_visited_file_modtime, Fset_visited_file_modtime): Clear it.
  (Fset_visited_file_modtime): Set (or clear) it.
modified:
  src/ChangeLog
  src/buffer.c
  src/buffer.h
  src/fileio.c
=== modified file 'src/ChangeLog'
--- a/src/ChangeLog     2010-04-12 23:49:29 +0000
+++ b/src/ChangeLog     2010-04-13 01:47:40 +0000
@@ -1,3 +1,13 @@
+2010-04-13  Stefan Monnier  <address@hidden>
+
+       Try to detect file modification within the same second.
+       * buffer.h (struct buffer): New field modtime_size.
+       * buffer.c (reset_buffer): Initialize it.
+       * fileio.c (Finsert_file_contents, Fwrite_region): Set it.
+       (Fverify_visited_file_modtime): Check it.
+       (Fclear_visited_file_modtime, Fset_visited_file_modtime): Clear it.
+       (Fset_visited_file_modtime): Set (or clear) it.
+
 2010-04-12  Stefan Monnier  <address@hidden>
 
        * process.c (status_notify): Remove unused var `ro'.

=== modified file 'src/buffer.c'
--- a/src/buffer.c      2010-04-02 03:10:33 +0000
+++ b/src/buffer.c      2010-04-13 01:47:40 +0000
@@ -693,6 +693,7 @@
   b->file_truename = Qnil;
   b->directory = (current_buffer) ? current_buffer->directory : Qnil;
   b->modtime = 0;
+  b->modtime_size = -1;
   XSETFASTINT (b->save_length, 0);
   b->last_window_start = 1;
   /* It is more conservative to start out "changed" than "unchanged".  */

=== modified file 'src/buffer.h'
--- a/src/buffer.h      2010-01-16 11:57:09 +0000
+++ b/src/buffer.h      2010-04-13 01:47:40 +0000
@@ -513,6 +513,12 @@
      0 means visited file modtime unknown; in no case complain
      about any mismatch on next save attempt.  */
   int modtime;
+  /* Size of the file when modtime was set.  This is used to detect the
+     case where the file grew while we were reading it, so the modtime
+     is still the same (since it's rounded up to seconds) but we're actually
+     not up-to-date.  -1 means the size is unknown.  Only meaningful if
+     modtime is actually set.  */
+  EMACS_INT modtime_size;
   /* The value of text->modiff at the last auto-save.  */
   int auto_save_modified;
   /* The value of text->modiff at the last display error.

=== modified file 'src/fileio.c'
--- a/src/fileio.c      2010-04-02 03:10:33 +0000
+++ b/src/fileio.c      2010-04-13 01:47:40 +0000
@@ -4092,6 +4092,7 @@
       if (NILP (handler))
        {
          current_buffer->modtime = st.st_mtime;
+         current_buffer->modtime_size = st.st_size;
          current_buffer->filename = orig_filename;
        }
 
@@ -4695,7 +4696,10 @@
      to avoid a "file has changed on disk" warning on
      next attempt to save.  */
   if (visiting)
-    current_buffer->modtime = st.st_mtime;
+    {
+      current_buffer->modtime = st.st_mtime;
+      current_buffer->modtime_size = st.st_size;
+    }
 
   if (failure)
     error ("IO error writing %s: %s", SDATA (filename),
@@ -5004,11 +5008,13 @@
       else
        st.st_mtime = 0;
     }
-  if (st.st_mtime == b->modtime
-      /* If both are positive, accept them if they are off by one second.  */
-      || (st.st_mtime > 0 && b->modtime > 0
-         && (st.st_mtime == b->modtime + 1
-             || st.st_mtime == b->modtime - 1)))
+  if ((st.st_mtime == b->modtime
+       /* If both are positive, accept them if they are off by one second.  */
+       || (st.st_mtime > 0 && b->modtime > 0
+          && (st.st_mtime == b->modtime + 1
+              || st.st_mtime == b->modtime - 1)))
+      && (st.st_size == b->modtime_size
+          || b->modtime_size < 0))
     return Qt;
   return Qnil;
 }
@@ -5020,6 +5026,7 @@
      ()
 {
   current_buffer->modtime = 0;
+  current_buffer->modtime_size = -1;
   return Qnil;
 }
 
@@ -5049,7 +5056,10 @@
      Lisp_Object time_list;
 {
   if (!NILP (time_list))
-    current_buffer->modtime = cons_to_long (time_list);
+    {
+      current_buffer->modtime = cons_to_long (time_list);
+      current_buffer->modtime_size = -1;
+    }
   else
     {
       register Lisp_Object filename;
@@ -5068,7 +5078,10 @@
       filename = ENCODE_FILE (filename);
 
       if (stat (SDATA (filename), &st) >= 0)
-       current_buffer->modtime = st.st_mtime;
+        {
+         current_buffer->modtime = st.st_mtime;
+          current_buffer->modtime_size = st.st_size;
+        }
     }
 
   return Qnil;


reply via email to

[Prev in Thread] Current Thread [Next in Thread]