From: David Levine Date: Thu, 29 Sep 2016 19:13:05 +0000 (-0400) Subject: Welcome message enhancements: X-Git-Url: https://diplodocus.org/git/nmh/commitdiff_plain/7111aba92b83fff6b0ac8637dd1f6e2fa287ac8c?ds=inline;hp=-c Welcome message enhancements: 1) Disable if Welcome: disable component is in profile. 2) If MHCONTEXT is set, only print the message if the context file already has a Version: reference where the version is old. --- 7111aba92b83fff6b0ac8637dd1f6e2fa287ac8c diff --git a/h/utils.h b/h/utils.h index 52d7d05b..00249be4 100644 --- a/h/utils.h +++ b/h/utils.h @@ -59,9 +59,9 @@ char *nmh_strcasestr (const char *, const char *); int contains8bit(const char *start, const char *end); /* - * Check to see if the user is running a different version of nmh - * than they had last run, and notify them if so. But only if - * they seem to be running an interactive program. - * Returns 1 if they are, 0 if they are not. + * Compares prior version of nmh with current version. Returns 1 + * if they compare the be the same, 0 if not. + * + * older - 0 for difference comparison, 1 for only if older */ -int nmh_version_changed (); +int nmh_version_changed (int older); diff --git a/man/mh-profile.man b/man/mh-profile.man index 9a873a05..d3a8bf16 100644 --- a/man/mh-profile.man +++ b/man/mh-profile.man @@ -1,4 +1,4 @@ -.TH MH-PROFILE %manext5% "December 21, 2014" "%nmhversion%" +.TH MH-PROFILE %manext5% "September 29, 2016" "%nmhversion%" .\" .\" %nmhwarning% .\" @@ -478,6 +478,34 @@ exception that the permission checks done by caution and only when absolutely necessary. (profile, default: legacy) .RE +.PP +.BR Welcome : +disable +.RS 5 +If the Welcome component is not present, or its value is not +.RI \*(lq disable \*(rq, +a welcome message will be displayed the first time that an interactive +.B nmh +program is run after updating the +.B nmh +installation. +The user must press the Enter key to continue. +.PP +If the MHCONTEXT environment variable is set and non-empty (and +the Welcome component is not +.RI \*(lq disable \*(rq), +the welcome message is only displayed if the context file contains a version +reference, and that reference is older than the installed +.B nmh +version. The version reference is of the form: +.PP +.RS 5 +.nf +Version: %nmhversion% +.fi +.RE +.PP +.RE .SS "Process Profile Entries" The following profile elements are used whenever an .B nmh diff --git a/sbr/utils.c b/sbr/utils.c index f103167c..1b1b4738 100644 --- a/sbr/utils.c +++ b/sbr/utils.c @@ -367,14 +367,28 @@ nmh_init(const char *argv0, int read_context) { /* Read context, if supposed to. */ if (read_context) { + int allow_version_check = 1; + int check_older_version = 0; + char *cp; + context_read(); - /* Check to see if the user is running a different version of nmh - than they had last run, and notify them if so. But only if - read_context was set to a value to enable this. */ - if (read_context == 1 && isatty (fileno (stdin)) && + if (read_context != 1 || + ((cp = context_find ("Welcome")) && strcasecmp (cp, "disable") == 0)) { + allow_version_check = 0; + } else if ((cp = getenv ("MHCONTEXT")) != NULL && *cp != '\0') { + /* Context file comes from $MHCONTEXT, so only print the message + if the context file has an older version. If it does, or if it + doesn't have a version at all, update the version. */ + check_older_version = 1; + } + + /* Check to see if the user is running a different (or older, if + specified) version of nmh than they had run bfore, and notify them + if so. But only if read_context was set to a value to enable. */ + if (allow_version_check && isatty (fileno (stdin)) && isatty (fileno (stdout)) && isatty (fileno (stderr))) { - if (nmh_version_changed ()) { + if (nmh_version_changed (check_older_version)) { printf ("===================================================" "====================\n"); printf ("Welcome to nmh version %s\n\n", VERSION); @@ -404,20 +418,36 @@ nmh_init(const char *argv0, int read_context) { /* - * Check stored version, and if out-of-date or non-existent, notify the user - * and update. + * Check stored version, and return 1 if out-of-date or non-existent. + * Because the output of "mhparam version" is prefixed with "nmh-", + * use that prefix here. */ int -nmh_version_changed () { - const char *const old_version = context_find("Version"); - - /* mhparam version includes the nmh- prefix, so be consistent with that. */ - if (old_version == NULL || strcmp(old_version, "nmh-" VERSION) != 0) { - context_replace ("Version", "nmh-" VERSION); +nmh_version_changed (int older) { + const char *const context_version = context_find("Version"); + + if (older) { + /* Convert the version strings to floats and compare them. This will + break for versions with multiple decimal points, etc. */ + const float current_version = strtod (VERSION, NULL); + const float old_version = + context_version && strncmp (context_version, "nmh-", 4) == 0 + ? strtof (context_version + 4, NULL) + : 99999999; + + if (context_version == NULL || old_version < current_version) { + context_replace ("Version", "nmh-" VERSION); + } - return 1; + return old_version < current_version ? 1 : 0; } else { - return 0; + if (context_version == NULL || strcmp(context_version, "nmh-" VERSION) != 0) { + context_replace ("Version", "nmh-" VERSION); + + return 1; + } else { + return 0; + } } } diff --git a/test/install-mh/test-version-check b/test/install-mh/test-version-check index 3dfef043..591eb1ee 100755 --- a/test/install-mh/test-version-check +++ b/test/install-mh/test-version-check @@ -21,8 +21,10 @@ require_prog script actual="$MH_TEST_DIR/test-version-check$$.actual" context="${MH_TEST_DIR}"/Mail/context +version="Version: nmh-${MH_VERSION}" -# Removing Version will trigger the welcome message. +# Removing Version will trigger the welcome message. (setup_test +# inserted it so that other tests wouldn't show it.) grep -v Version "$context" > "$context.NEW" mv -f "$context.NEW" "$context" @@ -34,6 +36,20 @@ script -c 'mhparam path last' -f -q "$actual" >/dev/null & wait $! grep 'Welcome to nmh version ' "$actual" >/dev/null && false rm "$actual" +# Make sure that version wasn't added to context. +grep "^${version}$" "${MH_TEST_DIR}/Mail/context" >/dev/null && false +finish_test + + +start_test 'Welcome: disable in profile skips the welcome message' +cp "${MH}" "${MH}-welcome" +printf 'Welcome: disable\n' >> "${MH}-welcome" +MH="${MH}-welcome" script -c 'pick last' -f -q "$actual" >/dev/null & +wait $! +grep 'Welcome to nmh version ' "$actual" >/dev/null && false +rm "$actual" +# Make sure that version wasn't added to context. +grep "^${version}$" "${MH_TEST_DIR}/Mail/context" >/dev/null && false finish_test @@ -42,6 +58,8 @@ script -c 'pick last' -f -q "$actual" >/dev/null & wait $! grep 'Welcome to nmh version ' "$actual" >/dev/null rm "$actual" +# Make sure that version was added to context. +grep "^${version}$" "${MH_TEST_DIR}/Mail/context" >/dev/null finish_test @@ -52,6 +70,42 @@ script -c 'pick last' -f -q "$actual" >/dev/null & wait $! grep 'Welcome to nmh version ' "$actual" >/dev/null && false rm "$actual" +# Make sure that version is still in context. +grep "^${version}$" "${MH_TEST_DIR}/Mail/context" >/dev/null +finish_test + + +start_test 'with MHCONTEXT, welcome only if older' +MHCONTEXT="${MH_TEST_DIR}/Mail/context2"; export MHCONTEXT +printf 'Version: nmh-1.5\n' >"${MHCONTEXT}" +script -c 'pick last' -f -q "$actual" >/dev/null & +wait $! +grep 'Welcome to nmh version ' "$actual" >/dev/null +# And make sure that version did get updated in context. +grep "^${version}$" "${MHCONTEXT}" >/dev/null +rm "$actual" +finish_test + + +start_test "with MHCONTEXT doesn't welcome if newer" +printf 'Version: nmh-10000.0\n' >"${MHCONTEXT}" +script -c 'pick last' -f -q "$actual" >/dev/null & +wait $! +grep 'Welcome to nmh version ' "$actual" >/dev/null && false +rm "$actual" +# And make sure that version didn't get updated in context. +grep '^Version: nmh-10000.0$' "${MHCONTEXT}" >/dev/null +finish_test + + +start_test 'with MHCONTEXT but no version, no welcome and update' +printf '' >"${MHCONTEXT}" +script -c 'pick last' -f -q "$actual" >/dev/null & +wait $! +grep 'Welcome to nmh version ' "$actual" >/dev/null && false +# And make sure that version did get updated in context. +grep "^${version}$" "${MHCONTEXT}" >/dev/null +rm "$actual" finish_test diff --git a/uip/install-mh.c b/uip/install-mh.c index 93f52f5a..6b8f4442 100644 --- a/uip/install-mh.c +++ b/uip/install-mh.c @@ -225,7 +225,7 @@ query: /* Initialize the saved nmh version. The Path profile entry was added above, that's all this needs. */ - (void) nmh_version_changed (); + (void) nmh_version_changed (0); done (0); return 1;