Bring from virt-edit the small hack of putting the ctime of the
temporary file few seconds back to notice file changes also on fast
editing.
---
fish/file-edit.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/fish/file-edit.c b/fish/file-edit.c
index 3a9dd2d..e2298eb 100644
--- a/fish/file-edit.c
+++ b/fish/file-edit.c
@@ -31,6 +31,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <assert.h>
+#include <utime.h>
#include "guestfs-internal-frontend.h"
@@ -49,6 +50,7 @@ edit_file_editor (guestfs_h *g, const char *filename, const char
*editor,
CLEANUP_FREE char *cmd = NULL;
struct stat oldstat, newstat;
int r, fd;
+ struct utimbuf times;
/* Download the file and write it to a temporary. */
if (asprintf (&tmpfilename, "%s/libguestfsXXXXXX", tmpdir) == -1) {
@@ -74,6 +76,23 @@ edit_file_editor (guestfs_h *g, const char *filename, const char
*editor,
return -1;
}
+ /* Set the time back a few seconds on the original file. This is so
+ * that if the user is very fast at editing, or if EDITOR is an
+ * automatic editor, then the edit might happen within the 1 second
+ * granularity of mtime, and we would think the file hasn't changed.
+ */
+ if (stat (tmpfilename, &oldstat) == -1) {
+ perror (tmpfilename);
+ return -1;
+ }
+
+ times.actime = oldstat.st_atime - 5;
+ times.modtime = oldstat.st_mtime - 5;
+ if (utime (tmpfilename, ×) == -1) {
+ perror ("utimes");
+ return -1;
+ }
+
/* Get the old stat. */
if (stat (tmpfilename, &oldstat) == -1) {
perror (tmpfilename);
--
1.9.3