diff options
author | Eric Wong <normalperson@yhbt.net> | 2007-02-24 18:18:22 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-02-25 11:09:56 -0800 |
commit | 17e48368751ae8df7ed0332ae8ef900ce983fce6 (patch) | |
tree | 8368f48d5f5b8e70b8beab8e72330a73a33cec9e /test-chmtime.c | |
parent | 2c7ca1fcf19d3803a225130491e26dca86d1781d (diff) | |
download | git-17e48368751ae8df7ed0332ae8ef900ce983fce6.tar.gz |
Add test-chmtime: a utility to change mtime on files
This is intended to be a portable replacement for our usage
of date(1), touch(1), and Perl one-liners in tests.
Usage: test-chtime (+|=|-|=+|=-)<seconds> <file>..."
'+' increments the mtime on the files by <seconds>
'-' decrements the mtime on the files by <seconds>
'=' sets the mtime on the file to exactly <seconds>
'=+' and '=-' sets the mtime on the file to <seconds> after or
before the current time.
Signed-off-by: Eric Wong <normalperson@yhbt.net>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'test-chmtime.c')
-rw-r--r-- | test-chmtime.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/test-chmtime.c b/test-chmtime.c new file mode 100644 index 0000000000..90da448ebe --- /dev/null +++ b/test-chmtime.c @@ -0,0 +1,61 @@ +#include "git-compat-util.h" +#include <utime.h> + +static const char usage_str[] = "(+|=|=+|=-|-)<seconds> <file>..."; + +int main(int argc, const char *argv[]) +{ + int i; + int set_eq; + long int set_time; + char *test; + const char *timespec; + + if (argc < 3) + goto usage; + + timespec = argv[1]; + set_eq = (*timespec == '=') ? 1 : 0; + if (set_eq) { + timespec++; + if (*timespec == '+') { + set_eq = 2; /* relative "in the future" */ + timespec++; + } + } + set_time = strtol(timespec, &test, 10); + if (*test) { + fprintf(stderr, "Not a base-10 integer: %s\n", argv[1] + 1); + goto usage; + } + if ((set_eq && set_time < 0) || set_eq == 2) { + time_t now = time(NULL); + set_time += now; + } + + for (i = 2; i < argc; i++) { + struct stat sb; + struct utimbuf utb; + + if (stat(argv[i], &sb) < 0) { + fprintf(stderr, "Failed to stat %s: %s\n", + argv[i], strerror(errno)); + return -1; + } + + utb.actime = sb.st_atime; + utb.modtime = set_eq ? set_time : sb.st_mtime + set_time; + + if (utime(argv[i], &utb) < 0) { + fprintf(stderr, "Failed to modify time on %s: %s\n", + argv[i], strerror(errno)); + return -1; + } + } + + return 0; + +usage: + fprintf(stderr, "Usage: %s %s\n", argv[0], usage_str); + return -1; +} |