diff options
author | Lars Henriksen <LarsHenriksen@get2net.dk> | 2020-03-10 00:12:50 +0100 |
---|---|---|
committer | Lukas Fleischer <lfleischer@calcurse.org> | 2020-03-22 13:40:28 -0400 |
commit | 467815d465195ac7fe05449e074963585c4eaf9f (patch) | |
tree | 12ac0cdfbc9650435e69e284c7327d40280220ed | |
parent | 80b60d63cb751134e31955836e011a7dc593f4f8 (diff) | |
download | calcurse-467815d465195ac7fe05449e074963585c4eaf9f.tar.gz calcurse-467815d465195ac7fe05449e074963585c4eaf9f.zip |
Improve ical import logging
The log file is not deleted if items were skipped (adresses Github issue #269).
The log file includes the import file name and time.
The import line numbers have been corrected (and tests amended).
Signed-off-by: Lars Henriksen <LarsHenriksen@get2net.dk>
Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
-rw-r--r-- | src/args.c | 3 | ||||
-rw-r--r-- | src/calcurse.h | 8 | ||||
-rw-r--r-- | src/ical.c | 37 | ||||
-rw-r--r-- | src/io.c | 25 | ||||
-rwxr-xr-x | test/ical-001.sh | 2 | ||||
-rwxr-xr-x | test/ical-002.sh | 2 | ||||
-rwxr-xr-x | test/ical-003.sh | 2 | ||||
-rwxr-xr-x | test/ical-004.sh | 2 | ||||
-rwxr-xr-x | test/ical-005.sh | 2 | ||||
-rwxr-xr-x | test/ical-006.sh | 2 | ||||
-rwxr-xr-x | test/ical-007.sh | 2 | ||||
-rwxr-xr-x | test/ical-008.sh | 2 |
12 files changed, 49 insertions, 40 deletions
@@ -425,7 +425,8 @@ int parse_args(int argc, char **argv) int dump_imported = 0, export_uid = 0; /* Data file locations */ const char *datadir = NULL; - const char *cfile = NULL, *ifile = NULL, *confdir = NULL; + const char *cfile = NULL, *confdir = NULL; + char *ifile = NULL; int non_interactive = 1; int ch, cpid, type; diff --git a/src/calcurse.h b/src/calcurse.h index 419915e..d65d088 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -876,9 +876,9 @@ int display_help(const char *); int run_hook(const char *); /* ical.c */ -void ical_import_data(FILE *, FILE *, unsigned *, unsigned *, unsigned *, - unsigned *, unsigned *, const char *, const char *, - const char *, const char *, const char *); +void ical_import_data(const char *, FILE *, FILE *, unsigned *, unsigned *, + unsigned *, unsigned *, unsigned *, const char *, + const char *, const char *, const char *, const char *); void ical_export_data(FILE *, int); /* io.c */ @@ -903,7 +903,7 @@ int io_check_file(const char *); int io_check_data_files(void); void io_startup_screen(int); void io_export_data(enum export_type, int); -void io_import_data(enum import_type, const char *, const char *, const char *, +void io_import_data(enum import_type, char *, const char *, const char *, const char *, const char *, const char *); struct io_file *io_log_init(void); void io_log_print(struct io_file *, int, const char *); @@ -305,26 +305,35 @@ static void ical_export_todo(FILE * stream, int export_uid) } /* Print a header to describe import log report format. */ -static void ical_log_init(FILE * log, int major, int minor) +static void ical_log_init(const char *file, FILE * log, int major, int minor) { const char *header = "+-------------------------------------------------------------------+\n" "| Calcurse icalendar import log. |\n" "| |\n" - "| Items imported from icalendar file, version %d.%d |\n" - "| Some items could not be imported, they are described hereafter. |\n" + "| Import from icalendar file |\n" + "| %-60s|\n" + "| version %d.%d at %s. |\n" + "| |\n" + "| Items which could not be imported are described below. |\n" "| The log line format is as follows: |\n" "| |\n" "| TYPE [LINE]: DESCRIPTION |\n" "| |\n" "| where: |\n" - "| * TYPE represents the item type ('VEVENT' or 'VTODO') |\n" - "| * LINE is the line in the input stream at which this item begins |\n" - "| * DESCRIPTION indicates why the item could not be imported |\n" + "| * TYPE is the item type, 'VEVENT' or 'VTODO' |\n" + "| * LINE is the line in the import file where the item begins |\n" + "| * DESCRIPTION explains why the item could not be imported |\n" "+-------------------------------------------------------------------+\n\n"; + char *date, *fmt; + + asprintf(&fmt, "%s %s", DATEFMT(conf.input_datefmt), "%H:%M"); + date = date_sec2date_str(now(), fmt); if (log) - fprintf(log, header, major, minor); + fprintf(log, header, file, major, minor, date); + mem_free(fmt); + mem_free(date); } /* @@ -479,13 +488,13 @@ ical_readline_init(FILE * fdi, char *buf, char *lstore, unsigned *ln) *buf = *lstore = '\0'; if (fgets(lstore, BUFSIZ, fdi)) { + (*ln)++; if ((eol = strchr(lstore, '\n')) != NULL) { if (*(eol - 1) == '\r') *(eol - 1) = '\0'; else *eol = '\0'; } - (*ln)++; } } @@ -494,9 +503,9 @@ static int ical_readline(FILE * fdi, char *buf, char *lstore, unsigned *ln) char *eol; strncpy(buf, lstore, BUFSIZ); - (*ln)++; while (fgets(lstore, BUFSIZ, fdi) != NULL) { + (*ln)++; if ((eol = strchr(lstore, '\n')) != NULL) { if (*(eol - 1) == '\r') *(eol - 1) = '\0'; @@ -506,7 +515,6 @@ static int ical_readline(FILE * fdi, char *buf, char *lstore, unsigned *ln) if (*lstore != SPACE && *lstore != TAB) break; strncat(buf, lstore + 1, BUFSIZ - strlen(buf) - 1); - (*ln)++; } if (feof(fdi)) { @@ -919,7 +927,7 @@ ical_read_event(FILE * fdi, FILE * log, unsigned *noevents, char *lstore, unsigned *lineno, const char *fmt_ev, const char *fmt_rev, const char *fmt_apt, const char *fmt_rapt) { - const int ITEMLINE = *lineno; + const int ITEMLINE = *lineno - !feof(fdi); ical_vevent_e vevent_type; char *p; struct { @@ -1073,7 +1081,7 @@ static void ical_read_todo(FILE * fdi, FILE * log, unsigned *notodos, unsigned *noskipped, char *buf, char *lstore, unsigned *lineno, const char *fmt_todo) { - const int ITEMLINE = *lineno; + const int ITEMLINE = *lineno - !feof(fdi); struct { char *mesg, *note; int priority; @@ -1140,7 +1148,7 @@ cleanup: /* Import calcurse data. */ void -ical_import_data(FILE * stream, FILE * log, unsigned *events, +ical_import_data(const char *file, FILE * stream, FILE * log, unsigned *events, unsigned *apoints, unsigned *todos, unsigned *lines, unsigned *skipped, const char *fmt_ev, const char *fmt_rev, const char *fmt_apt, const char *fmt_rapt, @@ -1155,10 +1163,9 @@ ical_import_data(FILE * stream, FILE * log, unsigned *events, _("Warning: ical header malformed or wrong version number. " "Aborting...")); - ical_log_init(log, major, minor); + ical_log_init(file, log, major, minor); while (ical_readline(stream, buf, lstore, lines)) { - (*lines)++; if (starts_with_ci(buf, "BEGIN:VEVENT")) { ical_read_event(stream, log, events, apoints, skipped, buf, lstore, lines, fmt_ev, @@ -1247,31 +1247,29 @@ void io_export_data(enum export_type type, int export_uid) } } -static FILE *get_import_stream(enum import_type type) +static FILE *get_import_stream(enum import_type type, char **stream_name) { FILE *stream = NULL; - char *stream_name; const char *ask_fname = _("Enter the file name to import data from:"); const char *wrong_file = _("The file cannot be accessed, please enter another file name."); const char *press_enter = _("Press [ENTER] to continue."); - stream_name = mem_malloc(BUFSIZ); - memset(stream_name, 0, BUFSIZ); + *stream_name = mem_malloc(BUFSIZ); + memset(*stream_name, 0, BUFSIZ); while (stream == NULL) { status_mesg(ask_fname, ""); - if (updatestring(win[STA].p, &stream_name, 0, 1)) { - mem_free(stream_name); + if (updatestring(win[STA].p, stream_name, 0, 1)) { + mem_free(*stream_name); return NULL; } - stream = fopen(stream_name, "r"); + stream = fopen(*stream_name, "r"); if (stream == NULL) { status_mesg(wrong_file, press_enter); keys_wait_for_any_key(win[KEY].p); } } - mem_free(stream_name); return stream; } @@ -1282,7 +1280,7 @@ static FILE *get_import_stream(enum import_type type) * A temporary log file is created in /tmp to store the import process report, * and is cleared at the end. */ -void io_import_data(enum import_type type, const char *stream_name, +void io_import_data(enum import_type type, char *stream_name, const char *fmt_ev, const char *fmt_rev, const char *fmt_apt, const char *fmt_rapt, const char *fmt_todo) @@ -1309,7 +1307,7 @@ void io_import_data(enum import_type type, const char *stream_name, "Aborting...")); break; case UI_CURSES: - stream = get_import_stream(type); + stream = get_import_stream(type, &stream_name); break; default: EXIT(_("FATAL ERROR: wrong import mode")); @@ -1329,7 +1327,7 @@ void io_import_data(enum import_type type, const char *stream_name, } if (type == IO_IMPORT_ICAL) - ical_import_data(stream, log->fd, &stats.events, + ical_import_data(stream_name, stream, log->fd, &stats.events, &stats.apoints, &stats.todos, &stats.lines, &stats.skipped, fmt_ev, fmt_rev, fmt_apt, fmt_rapt, fmt_todo); @@ -1380,7 +1378,10 @@ void io_import_data(enum import_type type, const char *stream_name, mem_free(stats_str[1]); mem_free(stats_str[2]); mem_free(stats_str[3]); - io_log_free(log); + if (ui_mode == UI_CURSES) + mem_free(stream_name); + if (!stats.skipped) + io_log_free(log); } struct io_file *io_log_init(void) diff --git a/test/ical-001.sh b/test/ical-001.sh index ff5b9ce..4ff1bfe 100755 --- a/test/ical-001.sh +++ b/test/ical-001.sh @@ -11,7 +11,7 @@ if [ "$1" = 'actual' ]; then rm -rf .calcurse || exit 1 elif [ "$1" = 'expected' ]; then cat <<EOD -Import process report: 0017 lines read +Import process report: 0012 lines read 1 app / 0 events / 1 todo / 0 skipped 01/01/80: - 00:01 -> ..:.. diff --git a/test/ical-002.sh b/test/ical-002.sh index 81ed1f1..0b74b19 100755 --- a/test/ical-002.sh +++ b/test/ical-002.sh @@ -10,7 +10,7 @@ if [ "$1" = 'actual' ]; then rm -rf .calcurse || exit 1 elif [ "$1" = 'expected' ]; then cat <<EOD -Import process report: 0036 lines read +Import process report: 0028 lines read 5 apps / 0 events / 0 todos / 0 skipped 01/01/00: - 00:00 -> 00:00 diff --git a/test/ical-003.sh b/test/ical-003.sh index 244a6d5..a0734ce 100755 --- a/test/ical-003.sh +++ b/test/ical-003.sh @@ -10,7 +10,7 @@ if [ "$1" = 'actual' ]; then rm -rf .calcurse || exit 1 elif [ "$1" = 'expected' ]; then cat <<EOD -Import process report: 0031 lines read +Import process report: 0025 lines read 3 apps / 0 events / 0 todos / 0 skipped 01/01/00: - 00:00 -> 01:30 diff --git a/test/ical-004.sh b/test/ical-004.sh index 1819791..7be6d1c 100755 --- a/test/ical-004.sh +++ b/test/ical-004.sh @@ -11,7 +11,7 @@ if [ "$1" = 'actual' ]; then rm -rf .calcurse || exit 1 elif [ "$1" = 'expected' ]; then cat <<EOD -Import process report: 0017 lines read +Import process report: 0012 lines read 1 app / 0 events / 1 todo / 0 skipped 01/01/80: - 00:01 -> ..:.. diff --git a/test/ical-005.sh b/test/ical-005.sh index 5e9796b..f23fe65 100755 --- a/test/ical-005.sh +++ b/test/ical-005.sh @@ -10,7 +10,7 @@ if [ "$1" = 'actual' ]; then rm -rf .calcurse || exit 1 elif [ "$1" = 'expected' ]; then cat <<EOD -Import process report: 0030 lines read +Import process report: 0023 lines read 0 apps / 4 events / 0 todos / 0 skipped 10/03/13: * All day diff --git a/test/ical-006.sh b/test/ical-006.sh index 1d9359a..6899d42 100755 --- a/test/ical-006.sh +++ b/test/ical-006.sh @@ -10,7 +10,7 @@ if [ "$1" = 'actual' ]; then rm -rf .calcurse || exit 1 elif [ "$1" = 'expected' ]; then cat <<EOD -Import process report: 0078 lines read +Import process report: 0063 lines read 12 apps / 0 events / 0 todos / 0 skipped 06/01/12: - 15:00 -> 15:30 diff --git a/test/ical-007.sh b/test/ical-007.sh index 4c43a4e..0a5ad2a 100755 --- a/test/ical-007.sh +++ b/test/ical-007.sh @@ -11,7 +11,7 @@ if [ "$1" = 'actual' ]; then rm -rf .calcurse || exit 1 elif [ "$1" = 'expected' ]; then cat <<EOD -Import process report: 0018 lines read +Import process report: 0013 lines read 2 apps / 0 events / 0 todos / 0 skipped 02/23/15: - 06:00 -> 07:00 diff --git a/test/ical-008.sh b/test/ical-008.sh index bc59e56..b659eb0 100755 --- a/test/ical-008.sh +++ b/test/ical-008.sh @@ -11,7 +11,7 @@ if [ "$1" = 'actual' ]; then rm -rf .calcurse || exit 1 elif [ "$1" = 'expected' ]; then cat <<EOD -Import process report: 0017 lines read +Import process report: 0012 lines read 1 app / 0 events / 1 todo / 0 skipped 01/01/80: - 00:01 -> ..:.. |