diff options
-rw-r--r-- | man/blogcfile.5.ronn | 6 | ||||
-rw-r--r-- | src/blogc-make/atom.c | 12 | ||||
-rw-r--r-- | src/blogc-make/settings.c | 1 | ||||
-rw-r--r-- | tests/blogc-make/check_atom.c | 128 |
4 files changed, 146 insertions, 1 deletions
diff --git a/man/blogcfile.5.ronn b/man/blogcfile.5.ronn index 61812a4..5f2406d 100644 --- a/man/blogcfile.5.ronn +++ b/man/blogcfile.5.ronn @@ -58,6 +58,12 @@ however these rules can be customized with the following settings, from the be `atom.xml`, the Atom feed for the `foo` tag will be `atom/foo.xml` and so on. + * `atom_legacy_entry_id` (default: `false`): + Before `0.13.11` blogc-make was generating "broken" entry IDs in the atom feeds. + This behavior was fixed in version `0.13.11` and current users that don't want + to have their old posts re-shared due to the change of IDs should set this to + `true`, to keep using the old format. + * `content_dir` (default: `content`): The directory that stores the source files. This directory is relative to `blogcfile`. diff --git a/src/blogc-make/atom.c b/src/blogc-make/atom.c index ae5e0c1..b953876 100644 --- a/src/blogc-make/atom.c +++ b/src/blogc-make/atom.c @@ -84,11 +84,21 @@ bm_atom_deploy(bm_settings_t *settings, bc_error_t **err) char *post_url = bm_generate_filename(NULL, post_prefix, "{{ FILENAME }}", post_ext); + char *entry_id = NULL; + if (bc_str_to_bool(bc_trie_lookup(settings->settings, "atom_legacy_entry_id"))) { + entry_id = bc_strdup_printf("%s%s/{{ FILENAME }}/", + post_prefix[0] == '\0' ? "" : "/", post_prefix); + } + else { + entry_id = bc_strdup(post_url); + } + char *content = bc_strdup_printf(atom_template, atom_url->str, atom_url->str, - post_url, post_url); + entry_id, post_url); bc_string_free(atom_url, true); free(post_url); + free(entry_id); if (-1 == write(fd, content, strlen(content))) { *err = bc_error_new_printf(BLOGC_MAKE_ERROR_ATOM, diff --git a/src/blogc-make/settings.c b/src/blogc-make/settings.c index 2029199..719afe1 100644 --- a/src/blogc-make/settings.c +++ b/src/blogc-make/settings.c @@ -43,6 +43,7 @@ static const struct default_settings_map { {"atom_prefix", "atom"}, {"atom_ext", ".xml"}, {"atom_order", "DESC"}, + {"atom_legacy_entry_id", NULL}, // generic {"date_format", "%b %d, %Y, %I:%M %p GMT"}, diff --git a/tests/blogc-make/check_atom.c b/tests/blogc-make/check_atom.c index ac68e67..f58f2ba 100644 --- a/tests/blogc-make/check_atom.c +++ b/tests/blogc-make/check_atom.c @@ -269,6 +269,132 @@ test_atom_dir(void **state) } +static void +test_atom_legacy_entry_id_empty(void **state) +{ + bm_settings_t *settings = bc_malloc(sizeof(bm_settings_t)); + settings->settings = bc_trie_new(free); + bc_trie_insert(settings->settings, "atom_prefix", bc_strdup("")); + bc_trie_insert(settings->settings, "atom_ext", bc_strdup(".xml")); + bc_trie_insert(settings->settings, "post_prefix", bc_strdup("")); + bc_trie_insert(settings->settings, "html_ext", bc_strdup(".html")); + bc_trie_insert(settings->settings, "atom_legacy_entry_id", bc_strdup("1")); + + bc_error_t *err = NULL; + char *rv = bm_atom_deploy(settings, &err); + + assert_non_null(rv); + assert_null(err); + + size_t cmp_len; + char *cmp = bc_file_get_contents(rv, true, &cmp_len, &err); + + assert_non_null(cmp); + assert_null(err); + + assert_string_equal(cmp, + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<feed xmlns=\"http://www.w3.org/2005/Atom\">\n" + " <title type=\"text\">{{ SITE_TITLE }}{% ifdef FILTER_TAG %} - " + "{{ FILTER_TAG }}{% endif %}</title>\n" + " <id>{{ BASE_URL }}{% ifdef FILTER_TAG %}/{{ FILTER_TAG }}" + "{% else %}/index{% endif %}.xml</id>\n" + " <updated>{{ DATE_FIRST_FORMATTED }}</updated>\n" + " <link href=\"{{ BASE_DOMAIN }}{{ BASE_URL }}/\" />\n" + " <link href=\"{{ BASE_DOMAIN }}{{ BASE_URL }}{% ifdef FILTER_TAG %}" + "/{{ FILTER_TAG }}{% else %}/index{% endif %}.xml\" rel=\"self\" />\n" + " <author>\n" + " <name>{{ AUTHOR_NAME }}</name>\n" + " <email>{{ AUTHOR_EMAIL }}</email>\n" + " </author>\n" + " <subtitle type=\"text\">{{ SITE_TAGLINE }}</subtitle>\n" + " {% block listing %}\n" + " <entry>\n" + " <title type=\"text\">{{ TITLE }}</title>\n" + " <id>{{ BASE_URL }}/{{ FILENAME }}/</id>\n" + " <updated>{{ DATE_FORMATTED }}</updated>\n" + " <published>{{ DATE_FORMATTED }}</published>\n" + " <link href=\"{{ BASE_DOMAIN }}{{ BASE_URL }}/{{ FILENAME }}.html\" />\n" + " <author>\n" + " <name>{{ AUTHOR_NAME }}</name>\n" + " <email>{{ AUTHOR_EMAIL }}</email>\n" + " </author>\n" + " <content type=\"html\"><![CDATA[{{ CONTENT }}]]></content>\n" + " </entry>\n" + " {% endblock %}\n" + "</feed>\n"); + + free(cmp); + bm_atom_destroy(rv); + free(rv); + bc_trie_free(settings->settings); + free(settings); +} + + +static void +test_atom_legacy_entry_id(void **state) +{ + bm_settings_t *settings = bc_malloc(sizeof(bm_settings_t)); + settings->settings = bc_trie_new(free); + bc_trie_insert(settings->settings, "atom_prefix", bc_strdup("atom")); + bc_trie_insert(settings->settings, "atom_ext", bc_strdup(".xml")); + bc_trie_insert(settings->settings, "post_prefix", bc_strdup("post")); + bc_trie_insert(settings->settings, "html_ext", bc_strdup(".html")); + bc_trie_insert(settings->settings, "atom_legacy_entry_id", bc_strdup("1")); + + bc_error_t *err = NULL; + char *rv = bm_atom_deploy(settings, &err); + + assert_non_null(rv); + assert_null(err); + + size_t cmp_len; + char *cmp = bc_file_get_contents(rv, true, &cmp_len, &err); + + assert_non_null(cmp); + assert_null(err); + + assert_string_equal(cmp, + "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<feed xmlns=\"http://www.w3.org/2005/Atom\">\n" + " <title type=\"text\">{{ SITE_TITLE }}{% ifdef FILTER_TAG %} - " + "{{ FILTER_TAG }}{% endif %}</title>\n" + " <id>{{ BASE_URL }}/atom{% ifdef FILTER_TAG %}/{{ FILTER_TAG }}" + "{% endif %}.xml</id>\n" + " <updated>{{ DATE_FIRST_FORMATTED }}</updated>\n" + " <link href=\"{{ BASE_DOMAIN }}{{ BASE_URL }}/\" />\n" + " <link href=\"{{ BASE_DOMAIN }}{{ BASE_URL }}/atom{% ifdef FILTER_TAG %}" + "/{{ FILTER_TAG }}{% endif %}.xml\" rel=\"self\" />\n" + " <author>\n" + " <name>{{ AUTHOR_NAME }}</name>\n" + " <email>{{ AUTHOR_EMAIL }}</email>\n" + " </author>\n" + " <subtitle type=\"text\">{{ SITE_TAGLINE }}</subtitle>\n" + " {% block listing %}\n" + " <entry>\n" + " <title type=\"text\">{{ TITLE }}</title>\n" + " <id>{{ BASE_URL }}/post/{{ FILENAME }}/</id>\n" + " <updated>{{ DATE_FORMATTED }}</updated>\n" + " <published>{{ DATE_FORMATTED }}</published>\n" + " <link href=\"{{ BASE_DOMAIN }}{{ BASE_URL }}/post/{{ FILENAME }}.html\" />\n" + " <author>\n" + " <name>{{ AUTHOR_NAME }}</name>\n" + " <email>{{ AUTHOR_EMAIL }}</email>\n" + " </author>\n" + " <content type=\"html\"><![CDATA[{{ CONTENT }}]]></content>\n" + " </entry>\n" + " {% endblock %}\n" + "</feed>\n"); + + free(cmp); + bm_atom_destroy(rv); + free(rv); + bc_trie_free(settings->settings); + free(settings); +} + + int main(void) { @@ -277,6 +403,8 @@ main(void) unit_test(test_atom_empty_dir), unit_test(test_atom_file), unit_test(test_atom_dir), + unit_test(test_atom_legacy_entry_id_empty), + unit_test(test_atom_legacy_entry_id), }; return run_tests(tests); } |