Description: When a file's metadata is updated, the mtime is changed to the current time. Whether this is correct or not is often a religious issue (metadata-vs-data), but, generally, all other tag-editing software choose to keep the timestamp. . Since the upstream fixed the issue, it is bad to ignore the fix altogether. At the very least, there should be a command-line option to follow the upstream and The Only Right(tm) behaviour. Author: Adam Borowski Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=445958 --- vorbis.c | 18 ++++++++++-------- vorbis.h | 2 +- vorbisgain.1 | 7 ++++++- vorbisgain.c | 20 ++++++++++++++------ vorbisgain.h | 1 + 5 files changed, 32 insertions(+), 16 deletions(-) --- a/vorbis.c +++ b/vorbis.c @@ -557,7 +557,8 @@ * message has been printed). */ int write_gains(const char *filename, float track_peak, float track_gain, - float album_peak, float album_gain, int verbose, int remove_tags) + float album_peak, float album_gain, int verbose, int remove_tags, + SETTINGS* settings) { struct stat stat_buf; struct utimbuf utime_buf; @@ -778,15 +779,16 @@ file_error(_("Note: Couldn't set mode for file '%s': "), filename); } -#if 0 /* Disable for Debian, this surprises people and is not useful --liw */ - utime_buf.actime = stat_buf.st_atime; - utime_buf.modtime = stat_buf.st_mtime; - - if (utime(filename, &utime_buf) != 0) + if (!settings->trample_mtime) { - file_error(_("Note: Couldn't set time for file '%s': "), filename); + utime_buf.actime = stat_buf.st_atime; + utime_buf.modtime = stat_buf.st_mtime; + + if (utime(filename, &utime_buf) != 0) + { + file_error(_("Note: Couldn't set time for file '%s': "), filename); + } } -#endif result = 0; --- a/vorbisgain.1 +++ b/vorbisgain.1 @@ -72,6 +72,10 @@ .IP "-n, --no-progress" Only display results, but don't show progress in percentages and times. This can be useful if the output is piped into other programs. +.IP "-p, --preserve-mtime" +Do not trample upon the timestamps of any files being worked on. This obeys +the expected data-vs-metadata behaviour, but can confuse some naive +archivers. .IP "-q, --quiet" Do not display any output while processing. Only error and warning messages will be printed. @@ -200,7 +204,8 @@ .SH NOTE The version of vorbisgain packaged for Debian differs in two ways from the upstream version. First, it does not retain the modification time -of the input file: if tags are changed in a file, the mtime will change. +of the input file by default: if tags are changed in a file, the mtime will +change; you can specify "-p" to get the normal behaviour. Second, it does not try to process wildcards in filenames. This makes it impossible to say "process all foo*.ogg in all subdirectories", but also avoids problems with filenames that actually contain wildcards. --- a/vorbisgain.c +++ b/vorbisgain.c @@ -235,7 +235,7 @@ { if (write_gains(file->filename, file->track_peak, file->track_gain, album_peak, file->album_gain, - !settings->quiet, 0) < 0) + !settings->quiet, 0, settings) < 0) { return -1; } @@ -288,7 +288,7 @@ else { if (write_gains(file->filename, NO_PEAK, NO_GAIN, - NO_PEAK, NO_GAIN, !settings->quiet, 1) < 0) + NO_PEAK, NO_GAIN, !settings->quiet, 1, settings) < 0) { return -1; } @@ -425,7 +425,8 @@ if (!settings->album) { if (!settings->display_only && write_gains(file->filename, - file->track_peak, file->track_gain, NO_PEAK, NO_GAIN, 0, 0) < 0) + file->track_peak, file->track_gain, NO_PEAK, NO_GAIN, 0, 0, + settings) < 0) { return -1; } @@ -466,7 +467,7 @@ if (write_gains(file->filename, file->track_peak, file->track_gain, album_peak, album_gain, - !settings->quiet, 0) < 0) + !settings->quiet, 0, settings) < 0) { return -1; } @@ -497,6 +498,7 @@ fprintf(stderr, _(" -h, --help Print this help text\n")); fprintf(stderr, _(" -n, --no-progress Don't show progress, just print results\n")); fprintf(stderr, _(" -q, --quiet Don't print any output (except errors)\n")); + fprintf(stderr, _(" -p, --preserve-mtime Don't change the timestamps\n")); #ifdef ENABLE_RECURSIVE fprintf(stderr, _(" -r, --recursive Search for files recursivly, each folder as an album\n")); #endif @@ -522,6 +524,7 @@ {"fast", 0, NULL, 'f'}, {"help", 0, NULL, 'h'}, {"no-progress", 0, NULL, 'n'}, + {"preserve-mtime",0,NULL, 'p'}, {"quiet", 0, NULL, 'q'}, #ifdef ENABLE_RECURSIVE {"recursive", 0, NULL, 'r'}, @@ -533,9 +536,9 @@ #ifdef ENABLE_RECURSIVE -#define ARG_STRING "acCdfg:hnqrst:v" +#define ARG_STRING "acCdfg:hnpqrst:v" #else -#define ARG_STRING "acCdfg:hnqst:v" +#define ARG_STRING "acCdfg:hnpqst:v" #endif @@ -549,6 +552,7 @@ memset(&settings, 0, sizeof(settings)); settings.first_file = 1; settings.album_gain = NO_GAIN; + settings.trample_mtime = 1; settings.show_progress = 1; #ifdef WIN32 @@ -623,6 +627,10 @@ settings.show_progress = 0; break; + case 'p': + settings.trample_mtime = 0; + break; + case 'q': settings.quiet = 1; break; --- a/vorbisgain.h +++ b/vorbisgain.h @@ -31,6 +31,7 @@ int convert; /**< Convert old format tags to new format */ int display_only; int fast; /**< Skip files that already have all needed tags */ + int trample_mtime; int quiet; #ifdef ENABLE_RECURSIVE int recursive; --- a/vorbis.h +++ b/vorbis.h @@ -15,6 +15,6 @@ SETTINGS *settings); extern int write_gains(const char *filename, float track_peak, float track_gain, float album_gain, float album_peak, int verbose, - int remove_tags); + int remove_tags, SETTINGS *settings); #endif /* VG_VORBIS_H */