aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Kummerlaender2019-04-13 00:36:45 +0200
committerAdrian Kummerlaender2019-04-13 00:49:11 +0200
commit6e5e71882d9d9969e0ffe3013e656cac8fa4f115 (patch)
treeb25460980bf2a9a172c7c7872f0468e05261c2bc
parentcd9463e572f31b82a73cdab6db6b53f3a1237b3e (diff)
downloadOverview-6e5e71882d9d9969e0ffe3013e656cac8fa4f115.tar
Overview-6e5e71882d9d9969e0ffe3013e656cac8fa4f115.tar.gz
Overview-6e5e71882d9d9969e0ffe3013e656cac8fa4f115.tar.bz2
Overview-6e5e71882d9d9969e0ffe3013e656cac8fa4f115.tar.xz
Overview-6e5e71882d9d9969e0ffe3013e656cac8fa4f115.zip
Replace commit feed aggregation with manual import
This is the starting point for extending _Overview_ to support various types of recent updates (i.e. not just blog articles and commits over a certain message size). While direct fetching and rendering of markdown-formatted Git commit messages is an attractive concept, this new approach should be much more flexible. As a side benefit commit entries can now be edited and expanded compared to their fixed Git reference. e.g. retroactively expanding upon older commits or adding example media that doesn't strictly belong inside the actual commit message.
-rw-r--r--default.nix2
-rw-r--r--source/00_content/commits/blog.kummerlaender.eu/2017_01_17_20_38_23f6297c212525d71692eb7ee8e6e096ad4711a3.md13
-rw-r--r--source/00_content/commits/blog.kummerlaender.eu/2018_06_04_21_12_c08fbb73a960bd19ab1ca553da5bb8111622baba.md13
-rw-r--r--source/00_content/commits/change/2016_02_14_20_52_1ffaf37388cd691e88196b6e00455eda0e652cf0.md20
-rw-r--r--source/00_content/commits/change/2016_02_17_15_02_af756d78ac042a2eed2417c5250d4b675d43bf93.md11
-rw-r--r--source/00_content/commits/change/2016_02_20_22_30_b3ef0fc8daa41e433f1919a4933a1cc047f59341.md9
-rw-r--r--source/00_content/commits/nixos_system/2018_10_01_08_26_55daf8a35f4f1761f5f4c4ebe4a6dcb4b0ace514.md18
-rw-r--r--source/00_content/commits/slang/2017_04_13_21_51_d2126fe52fd3c002631e66fa7d6e2d5cd8862bea.md21
-rw-r--r--source/00_content/meta.xml3
-rw-r--r--source/00_content/repositories.xml23
-rw-r--r--source/01_raw/commits.xsl44
-rw-r--r--source/01_raw/repository_feeds.xsl26
-rw-r--r--source/02_augment/commits.xsl75
-rw-r--r--source/03_merge/timeline.xsl13
-rw-r--r--source/99_result/overview.xsl52
-rw-r--r--source/99_result/timeline.xsl35
-rwxr-xr-xutility/fetch_feed.sh3
-rw-r--r--utility/reference_commit.xsl25
18 files changed, 187 insertions, 219 deletions
diff --git a/default.nix b/default.nix
index 36edbe9..4cbfb51 100644
--- a/default.nix
+++ b/default.nix
@@ -7,11 +7,11 @@ pkgs.stdenv.mkDerivation {
LANG = "en_US.UTF-8";
buildInputs = [
- pkgs.curl
pkgs.pandoc
pkgs.highlight
mypkgs.katex-wrapper
mypkgs.make-xslt
+ mypkgs.input-xslt
];
installPhase = let
diff --git a/source/00_content/commits/blog.kummerlaender.eu/2017_01_17_20_38_23f6297c212525d71692eb7ee8e6e096ad4711a3.md b/source/00_content/commits/blog.kummerlaender.eu/2017_01_17_20_38_23f6297c212525d71692eb7ee8e6e096ad4711a3.md
new file mode 100644
index 0000000..9145e13
--- /dev/null
+++ b/source/00_content/commits/blog.kummerlaender.eu/2017_01_17_20_38_23f6297c212525d71692eb7ee8e6e096ad4711a3.md
@@ -0,0 +1,13 @@
+# Use `pandoc` as markdown processor
+
+The trigger but not the actual reason for this replacement of `kramdown` with `pandoc` was a strange generation issue with `kramdown`'s latest release.
+
+All recent articles failed to generate anything more than an empty page. A quick check of the resulting HTML for those articles offered nothing out of the ordinary. After taking a close look at the articles in question I narrowed the set of failing articles down to those containing footnotes - tangentially I only started using footnotes a couple of articles ago i.e. this explained this part of the issue.
+
+Some debugging of `InputXSLT` offered the following problem: `Xerces-C` generated an error message and stopped processing XML inputs containing `nbsp` non-blocking space characters in the implementation of the `external-command` function. This change in `kramdown`'s output can be traced back to enhancement issue [399](https://github.com/gettalong/kramdown/pull/399). Obviously this is not a problem in `kramdown` but an issue in the way this static site generator is wrapping HTML inputs.
+
+This problem should be solvable by adding appropriate namespace and doctype declarations to the markdown-generated HTML output. Instead I opted to perform the change to `pandoc` I had already planned for quite some time.
+
+The choice fell on `pandoc` as it offers some additional markdown features as well as allowing for conversion to a rich set of document formats. i.e. features like printing articles as PDF using LaTeX are trivial to implement if `pandoc` is the markdown processor of choice. Furthermore page compilation is noticeably faster using `pandoc`.
+
+One might note that this switch only solved the original issue by coincidence: Should `pandoc` start to generate non-blocking space characters the same problem will occur. But I have hopes that such a change would be configurable via `pandoc`'s plethora of configuration options. As this static site generator assumes everything to be XHTML I see no reason why I should not continue to treat HTML inputs as XML.
diff --git a/source/00_content/commits/blog.kummerlaender.eu/2018_06_04_21_12_c08fbb73a960bd19ab1ca553da5bb8111622baba.md b/source/00_content/commits/blog.kummerlaender.eu/2018_06_04_21_12_c08fbb73a960bd19ab1ca553da5bb8111622baba.md
new file mode 100644
index 0000000..616ee83
--- /dev/null
+++ b/source/00_content/commits/blog.kummerlaender.eu/2018_06_04_21_12_c08fbb73a960bd19ab1ca553da5bb8111622baba.md
@@ -0,0 +1,13 @@
+# Nixify build process
+
+Building the website in the presence of the Nix package manager is now
+as simple as:
+
+- cloning this repo
+- entering the nix-shell environment declared by `shell.nix`
+- calling `generate`
+- optionally call `preview` to spawn a webserver in `target/99_result`
+
+All dependencies such as the internal InputXSLT, StaticXSLT and
+BuildXSLT modules as well as external ones such as KaTeX and pandoc are
+built declaratively by Nix.
diff --git a/source/00_content/commits/change/2016_02_14_20_52_1ffaf37388cd691e88196b6e00455eda0e652cf0.md b/source/00_content/commits/change/2016_02_14_20_52_1ffaf37388cd691e88196b6e00455eda0e652cf0.md
new file mode 100644
index 0000000..e7ee30b
--- /dev/null
+++ b/source/00_content/commits/change/2016_02_14_20_52_1ffaf37388cd691e88196b6e00455eda0e652cf0.md
@@ -0,0 +1,20 @@
+# Implement support for excluding arbitrary paths from tracking
+
+The library may be provided with a new-line separated list of regular expressions via the newly introduced `CHANGE_LOG_IGNORE_PATTERN_PATH`.
+
+Any proposed tracking path that is matched by any of the provided patterns is excluded from change reporting. This functionality uses the Standard's regular expression parsing functionality and as such doesn't introduce any new dependencies. If no file path is provided or the provided file path is unreadable all paths will be tracked.
+
+`change` was adapted to set `CHANGE_LOG_IGNORE_PATTERN_PATH` to `.change_log_ignore` which means that it will by default exclude any patterns provided via this file in the current working directory.
+
+An example for such a file customized for hiding _vim_'s internal write
+logic may look as follows:
+
+ [0-9]+
+ [^~]*~
+ [.*\.viminfo
+ .*\.swp
+
+Note that this is implemented in a fashion where it is not guaranteed that the full _canonical_ path is checked against the patterns. It remains to be decided if this is enough for all common use cases of this new functionality.
+
+`tracking::PathMatcher` lacks any explicit thread synchronization - according to my current knowledge this should not be necessary as we are only ever reading the private `std::vector<std::regex>` instance.
+If invalid regular expressions are provided they are silently ignored.
diff --git a/source/00_content/commits/change/2016_02_17_15_02_af756d78ac042a2eed2417c5250d4b675d43bf93.md b/source/00_content/commits/change/2016_02_17_15_02_af756d78ac042a2eed2417c5250d4b675d43bf93.md
new file mode 100644
index 0000000..8c81150
--- /dev/null
+++ b/source/00_content/commits/change/2016_02_17_15_02_af756d78ac042a2eed2417c5250d4b675d43bf93.md
@@ -0,0 +1,11 @@
+# Implement static allocator for initialization
+
+The previous interposition logic based on plain usage of `dlsym` analogously to various online examples led to a deadlock during _neovim_ startup. This deadlock was caused by _neovim_'s custom memory allocation library _jemalloc_ because it calls `mmap` during its initialization phase. The problem with calling `mmap` during initialization is that this already leads to executing `libChangeLog`'s `mmap` version whoes static `actual_mmap` function pointer is not initialized at this point in time. This is detected and leads to a call to `dlsym` to remedy this situation. Sadly `dlsym` in turn requires memory allocation using `calloc` which leads us back to initializing _jemalloc_ and as such to a deadlock.
+
+I first saw this as a bug in _jemalloc_ which seemed to be confirmed by a short search in my search engine of choice. This prompted me to create an appropriate [bug report](https://github.com/jemalloc/jemalloc/issues/329) which was dismissed as a problem in the way `mmap` was interposed and not as a bug in the library. Thus it seems to be accepted practice that it is not the responsibility of a custom memory allocator to cater to the initialization needs of other libraries relying on function interposition. This is of course a valid position as the whole issue is a kind of _chicken and egg_ problem where both sides can be argued.
+
+To cut to the chase I was left with the only option of working around this deadlock by adapting `libChangeLog` to call `dlsym` without relying on the wrapped application's memory allocator of choice. The most straight forward way to do this is to provide another custom memory allocator alongside the _payload_ function interpositions of `mmap` and friends.
+
+`init/alloc.cc` implements such a selectively transparent memory allocator that offers a small static buffer for usage in the context of executing `dlsym`.The choice between forwarding memory allocation requests to the wrapped application's allocator and using the static buffer is governed by `init::dlsymContext`. This tiny helper class maintains an `dlsym_level` counter by posing as a scope guard.
+
+The end result of this extension to `libChangeLog` is that it now also works with applications using _jemalloc_ such as _neovim_ and should overall be much more robust during its initialization phase.
diff --git a/source/00_content/commits/change/2016_02_20_22_30_b3ef0fc8daa41e433f1919a4933a1cc047f59341.md b/source/00_content/commits/change/2016_02_20_22_30_b3ef0fc8daa41e433f1919a4933a1cc047f59341.md
new file mode 100644
index 0000000..e724abc
--- /dev/null
+++ b/source/00_content/commits/change/2016_02_20_22_30_b3ef0fc8daa41e433f1919a4933a1cc047f59341.md
@@ -0,0 +1,9 @@
+# Interpose `open` library function
+
+`open` is not as side effect free as I had imagined - i.e. if the flag `O_TRUNC` is passed it truncates the file contents alongside opening the file descriptor. In practice this is done by _emacs_ prior to writing the new file content and as such needs to be intercepted so we can start tracking the file before it is changed.
+
+Interposing `open` required some changes to make the library work without including `fcntl.h`. This header not only defines some of the flags we require to check if a library call actually is able to change files but also defines the `open` library function.
+
+While implementing this change I noticed that the function interpositions implemented in C++ actually need to be declared as `external "C"` so their names do not get wrangled during compilation. I suspect that this was previously implicitly done for e.g. `mmap` and `write` by the included C standard library headers. However this did not work for `open` which is why all function interpositions are now explicitly declared external.
+
+End result: _emacs_ file changes are now tracked correctly.
diff --git a/source/00_content/commits/nixos_system/2018_10_01_08_26_55daf8a35f4f1761f5f4c4ebe4a6dcb4b0ace514.md b/source/00_content/commits/nixos_system/2018_10_01_08_26_55daf8a35f4f1761f5f4c4ebe4a6dcb4b0ace514.md
new file mode 100644
index 0000000..28820ef
--- /dev/null
+++ b/source/00_content/commits/nixos_system/2018_10_01_08_26_55daf8a35f4f1761f5f4c4ebe4a6dcb4b0ace514.md
@@ -0,0 +1,18 @@
+# Describe custom gitolite and cgit setup
+
+Replaces short-term Gitea instance on `code.kummerlaender.eu`.
+
+The main reason for implementing this more complex setup is that Gitea
+both lacks in features in areas that I care about and provides distracting
+features in other areas that I do not use.
+
+e.g. Gitea provides multi-user, discussion and organization support but doesn't provide
+Atom feeds which are required for [Overview](https://tree.kummerlaender.eu/projects/xslt/overview/).
+
+This is why exposing [gitolite](http://gitolite.com)-managed repositories
+via [cgit](https://git.zx2c4.com/cgit/about/) is a better fit for my usecases.
+
+Note that gitolite is further configured outside of Nix through its own admin repository.
+
+As a side benefit `pkgs.kummerlaender.eu` now provides further archive
+formats of its Nix expressions which simplifies Nix channel usage.
diff --git a/source/00_content/commits/slang/2017_04_13_21_51_d2126fe52fd3c002631e66fa7d6e2d5cd8862bea.md b/source/00_content/commits/slang/2017_04_13_21_51_d2126fe52fd3c002631e66fa7d6e2d5cd8862bea.md
new file mode 100644
index 0000000..ad39eee
--- /dev/null
+++ b/source/00_content/commits/slang/2017_04_13_21_51_d2126fe52fd3c002631e66fa7d6e2d5cd8862bea.md
@@ -0,0 +1,21 @@
+# Implement deferred word, conditional resolution
+
+Due to the non-trivial way tokens were previously processed the compiler could not safely perform tail-call elimination. Thus the _slang_ evaluation depth was restricted by the maximum call stack size.
+
+This issue is mitigated by introducing deferred word resolution - i.e. pushing expanded tokens onto a buffer stack and processing them in an explicit loop.
+
+This change ties into the implementation of the language's conditional primitive. The previous implementation did implicitly not support direct nesting of conditional expressions such as:
+
+ truthA if
+ mainBranch
+ truthB if
+ secondaryMainBranch
+ then else
+ then
+ alternativeBranch
+ else
+
+This issue is now made explicit by disallowing direct nesting of conditionals as depicted above. Appropriate exceptions are generated when required and the conditional primitive is reimplemented in a more robust fashion under the assumption that this rule holds. Note that nesting is still fully supported iff. the nested conditional is contained in a deferredly evaluated word. As a positive side effect this will make it slightly harder to generate unreadable code by forcing developers to write simpler words.
+
+The main change of the conditional primitive lies in deferring branch token processing until the conditional expression is concluded by `else`. This is achieved by capturing non-dropped tokens in an internal buffer akin to how the word definition operator `§` is implemented.
+The branch buffer is discharged after `else` is evaluated. Discharging is triggered via the newly introduced `result` method of the primitive evaluation module. This avenue for injecting tokens into the processing stream may be used by further primitives in the future.
diff --git a/source/00_content/meta.xml b/source/00_content/meta.xml
index 2347b02..9897e1e 100644
--- a/source/00_content/meta.xml
+++ b/source/00_content/meta.xml
@@ -2,6 +2,8 @@
<datasource>
<title>kummerlaender.eu</title>
<url>https://kummerlaender.eu</url>
+ <author>Adrian Kummerländer</author>
+ <description>Overview of kummerlaender.eu; blog and commit timeline aggregator</description>
<timeline>
<commit_count>32</commit_count>
</timeline>
@@ -9,4 +11,5 @@
<article_count>3</article_count>
<commit_count>16</commit_count>
</overview>
+ <repository_base>https://code.kummerlaender.eu</repository_base>
</datasource>
diff --git a/source/00_content/repositories.xml b/source/00_content/repositories.xml
deleted file mode 100644
index 78f7a5a..0000000
--- a/source/00_content/repositories.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<datasource>
- <entry handle="blog.kummerlaender.eu">
- <feed>http://code.kummerlaender.eu/blog.kummerlaender.eu/atom/?h=master</feed>
- <url>http://tree.kummerlaender.eu/projects/xslt/blog/</url>
- </entry>
- <entry handle="computicle">
- <feed>http://code.kummerlaender.eu/computicle/atom/?h=master</feed>
- <url>http://tree.kummerlaender.eu/projects/computicle/</url>
- </entry>
- <entry handle="change">
- <feed>http://code.kummerlaender.eu/change/atom/?h=master</feed>
- <url>http://tree.kummerlaender.eu/projects/change/</url>
- </entry>
- <entry handle="slang">
- <feed>http://code.kummerlaender.eu/slang/atom/?h=master</feed>
- <url>http://tree.kummerlaender.eu/projects/slang/</url>
- </entry>
- <entry handle="nixos_system">
- <feed>http://code.kummerlaender.eu/nixos_system/atom/?h=master</feed>
- <url>http://code.kummerlaender.eu/nixos_system/</url>
- </entry>
-</datasource>
diff --git a/source/01_raw/commits.xsl b/source/01_raw/commits.xsl
new file mode 100644
index 0000000..c70beab
--- /dev/null
+++ b/source/01_raw/commits.xsl
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet
+ version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:InputXSLT="function.inputxslt.application"
+ exclude-result-prefixes="xalan InputXSLT"
+>
+
+<xsl:include href="[utility/formatter.xsl]"/>
+<xsl:include href="[utility/datasource.xsl]"/>
+
+<xsl:variable name="meta">
+ <datasource type="main" mode="xpath" source="$source_tree/directory[@name = '00_content']/directory" target="files"/>
+ <target mode="plain" value="commits.xml"/>
+</xsl:variable>
+
+<xsl:template match="files/directory[@name = 'commits']">
+ <xsl:apply-templates select="directory">
+ <xsl:sort select="@name" order="descending"/>
+ </xsl:apply-templates>
+</xsl:template>
+
+<xsl:template match="files/directory[@name = 'commits']/directory/file[@extension = '.md']">
+ <xsl:variable name="content">
+ <xsl:call-template name="formatter">
+ <xsl:with-param name="source" select="InputXSLT:read-file(./full)/text()"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <entry hash="{substring(@name, 18, string-length(@name))}" repo="{parent::directory/@name}">
+ <title>
+ <xsl:value-of select="xalan:nodeset($content)/h1"/>
+ </title>
+ <date time="{substring(@name, 12, 2)}:{substring(@name, 15, 2)}">
+ <xsl:value-of select="substring(@name, 0, 11)"/>
+ </date>
+ <content>
+ <xsl:copy-of select="xalan:nodeset($content)/*[name() != 'h1']"/>
+ </content>
+ </entry>
+</xsl:template>
+
+</xsl:stylesheet>
diff --git a/source/01_raw/repository_feeds.xsl b/source/01_raw/repository_feeds.xsl
deleted file mode 100644
index 961c08a..0000000
--- a/source/01_raw/repository_feeds.xsl
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet
- version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:atom="http://www.w3.org/2005/Atom"
- xmlns:InputXSLT="function.inputxslt.application"
- exclude-result-prefixes="InputXSLT"
->
-
-<xsl:include href="[utility/datasource.xsl]"/>
-<xsl:include href="[utility/remove_namespace.xsl]"/>
-
-<xsl:variable name="meta">
- <datasource type="main" mode="full" source="00_content/repositories.xml" target="repositories"/>
- <target mode="plain" value="repository_feeds.xml"/>
-</xsl:variable>
-
-<xsl:template match="repositories/entry">
- <entry handle="{@handle}">
- <xsl:apply-templates mode="remove_namespace" select="InputXSLT:external-command(
- concat('./utility/fetch_feed.sh ', feed/text())
- )/self::command/atom:feed/atom:entry"/>
- </entry>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/source/02_augment/commits.xsl b/source/02_augment/commits.xsl
deleted file mode 100644
index a2ad0b5..0000000
--- a/source/02_augment/commits.xsl
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet
- version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
->
-
-<xsl:include href="[utility/datasource.xsl]"/>
-<xsl:include href="[utility/formatter.xsl]"/>
-
-<xsl:variable name="meta">
- <datasource type="main" mode="full" source="01_raw/repository_feeds.xml" target="repositories"/>
- <target mode="plain" value="commits.xml"/>
-</xsl:variable>
-
-<xsl:template match="entry" mode="commit">
- <commit hash="{substring(id, 0, 7)}">
- <xsl:apply-templates select="@*|node()" mode="commit"/>
- </commit>
-</xsl:template>
-
-<xsl:template match="id" mode="commit"/>
-<xsl:template match="updated" mode="commit"/>
-<xsl:template match="content[@type = 'xhtml']" mode="commit"/>
-
-<xsl:template match="author" mode="commit">
- <xsl:copy>
- <xsl:value-of select="name"/>
- </xsl:copy>
-</xsl:template>
-
-<xsl:template match="published" mode="commit">
- <date>
- <xsl:attribute name="time">
- <xsl:value-of select="substring(text(), 12, 5)"/>
- </xsl:attribute>
-
- <xsl:apply-templates select="@*|node()" mode="commit"/>
- </date>
-</xsl:template>
-
-<xsl:template match="published/text()" mode="commit">
- <xsl:value-of select="substring(., 0, 11)"/>
-</xsl:template>
-
-<xsl:template match="link" mode="commit">
- <link>
- <xsl:value-of select="@href"/>
- </link>
-</xsl:template>
-
-<xsl:template match="content[@type = 'text']" mode="commit">
- <message>
- <xsl:apply-templates select="node()" mode="commit"/>
- </message>
-</xsl:template>
-
-<xsl:template match="content[@type = 'text']/text()" mode="commit">
- <xsl:call-template name="formatter">
- <xsl:with-param name="source" select="."/>
- </xsl:call-template>
-</xsl:template>
-
-<xsl:template match="@* | node()" mode="commit">
- <xsl:copy>
- <xsl:apply-templates select="@* | node()" mode="commit"/>
- </xsl:copy>
-</xsl:template>
-
-<xsl:template match="repositories/entry">
- <entry handle="{@handle}">
- <xsl:apply-templates select="entry" mode="commit"/>
- </entry>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/source/03_merge/timeline.xsl b/source/03_merge/timeline.xsl
index fce6f0b..2813b80 100644
--- a/source/03_merge/timeline.xsl
+++ b/source/03_merge/timeline.xsl
@@ -5,15 +5,20 @@
>
<xsl:include href="[utility/datasource.xsl]"/>
-<xsl:include href="[utility/reference_commit.xsl]"/>
<xsl:variable name="meta">
- <datasource type="main" mode="full" source="02_augment/commits.xml" target="repositories"/>
+ <datasource type="main" mode="full" source="01_raw/commits.xml" target="timeline"/>
<target mode="plain" value="timeline.xml"/>
</xsl:variable>
-<xsl:template match="repositories">
- <xsl:apply-templates select="entry/commit[count(message//text()) &gt;= 6]" mode="commit">
+<xsl:template match="@* | node()" mode="commit">
+ <xsl:copy>
+ <xsl:apply-templates select="@* | node()" mode="commit"/>
+ </xsl:copy>
+</xsl:template>
+
+<xsl:template match="timeline">
+ <xsl:apply-templates select="entry" mode="commit">
<xsl:sort select="date" data-type="text" order="descending"/>
<xsl:sort select="date/@time" data-type="text" order="descending"/>
</xsl:apply-templates>
diff --git a/source/99_result/overview.xsl b/source/99_result/overview.xsl
index a21aa8a..5a319b8 100644
--- a/source/99_result/overview.xsl
+++ b/source/99_result/overview.xsl
@@ -21,63 +21,41 @@
<datasource type="main" mode="full" source="00_content/meta.xml" target="meta"/>
<datasource type="support" mode="full" source="02_augment/articles.xml" target="articles"/>
<datasource type="support" mode="full" source="03_merge/timeline.xml" target="timeline"/>
- <datasource type="support" mode="full" source="02_augment/commits.xml" target="commits"/>
- <datasource type="support" mode="full" source="00_content/repositories.xml" target="repositories"/>
<target mode="plain" value="index.html"/>
</xsl:variable>
<xsl:variable name="root" select="/datasource"/>
-<xsl:template name="get_commit">
- <xsl:param name="repository"/>
- <xsl:param name="hash"/>
-
- <xsl:variable name="commit" select="$root/commits/entry[
- @handle = $repository
- ]/commit[
- @hash = $hash
- ]"/>
-
- <xsl:variable name="project" select="$root/repositories/entry[
- @handle = $repository
- ]"/>
-
+<xsl:template match="timeline/entry">
<h3>
<span class="arrow">
<xsl:text>» </xsl:text>
</span>
- <a href="{$commit/link}">
- <xsl:value-of select="$commit/title"/>
+ <a href="{$root/meta/repository_base}/{@repo}/commit/?id={@hash}">
+ <xsl:value-of select="title"/>
</a>
</h3>
<span class="info">
<xsl:call-template name="format-date">
- <xsl:with-param name="date" select="$commit/date"/>
+ <xsl:with-param name="date" select="date"/>
<xsl:with-param name="format" select="'M x, Y'"/>
</xsl:call-template>
<xsl:text> at </xsl:text>
- <xsl:value-of select="$commit/date/@time"/>
+ <xsl:value-of select="date/@time"/>
<xsl:text> | </xsl:text>
- <a href="{$project/url}">
- <xsl:value-of select="$repository"/>
+ <a href="{$root/meta/repository_base}/{@repo}/">
+ <xsl:value-of select="@repo"/>
</a>
<xsl:text> | </xsl:text>
- <a href="{$commit/link}">
- <xsl:value-of select="$commit/@hash"/>
+ <a href="{$root/meta/repository_base}/{@repo}/commit/?id={@hash}">
+ <xsl:value-of select="substring(@hash,0,7)"/>
</a>
<xsl:text> | </xsl:text>
- <xsl:value-of select="$commit/author"/>
+ <xsl:value-of select="$root/meta/author"/>
</span>
- <xsl:apply-templates select="$commit/message/node()" mode="xhtml"/>
-</xsl:template>
-
-<xsl:template match="timeline/commit">
- <xsl:call-template name="get_commit">
- <xsl:with-param name="repository" select="@repository"/>
- <xsl:with-param name="hash" select="@hash"/>
- </xsl:call-template>
+ <xsl:apply-templates select="content/node()" mode="xhtml"/>
</xsl:template>
<xsl:template match="articles/entry">
@@ -113,8 +91,8 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <meta name="author" content="Adrian Kummerländer"/>
- <meta name="description" content="Overview of kummerlaender.eu; blog and commit timeline aggregator"/>
+ <meta name="author" content="{$root/meta/author}"/>
+ <meta name="description" content="{$root/meta/description}"/>
<meta name="viewport" content="width=device-width,initial-scale=1.0"/>
<title>
@@ -170,7 +148,7 @@
<div class="normal menuhead">
<h2>
- <a href="https://code.kummerlaender.eu">
+ <a href="{$root/meta/repository_base}">
<xsl:text>Selected commits</xsl:text>
</a>
</h2>
@@ -187,7 +165,7 @@
</ul>
</div>
- <xsl:apply-templates select="timeline/commit[position() &lt;= $root/meta/overview/commit_count]"/>
+ <xsl:apply-templates select="timeline/entry[position() &lt;= $root/meta/overview/commit_count]"/>
</div>
</body>
</html>
diff --git a/source/99_result/timeline.xsl b/source/99_result/timeline.xsl
index de0c6e4..5c4630c 100644
--- a/source/99_result/timeline.xsl
+++ b/source/99_result/timeline.xsl
@@ -16,31 +16,27 @@
<xsl:variable name="meta">
<datasource type="main" mode="full" source="03_merge/timeline.xml" target="timeline"/>
- <datasource type="support" mode="full" source="02_augment/commits.xml" target="repositories"/>
<datasource type="support" mode="full" source="00_content/meta.xml" target="meta"/>
<target mode="plain" value="timeline.xml"/>
</xsl:variable>
<xsl:variable name="root" select="/datasource"/>
<xsl:variable name="url" select="concat($root/meta/url, '/timeline.xml')"/>
-<xsl:variable name="latest" select="$root/repositories/entry[
- @handle = $root/timeline/commit[1]/@repository
-]/commit[
- @hash = $root/timeline/commit[1]/@hash
-]"/>
-<xsl:template match="repositories/entry/commit">
+<xsl:template match="timeline/entry">
+ <xsl:variable name="link" select="concat($root/meta/repository_base, '/', @repo, '/commits/?id=', @hash)"/>
+
<entry xmlns="http://www.w3.org/2005/Atom">
<id>
- <xsl:value-of select="link"/>
+ <xsl:value-of select="$link"/>
</id>
<title>
<xsl:value-of select="title"/>
</title>
- <link rel="alternate" title="{title}" href="{link}"/>
+ <link rel="alternate" title="{title}" href="$link"/>
<author>
<name>
- <xsl:value-of select="author"/>
+ <xsl:value-of select="$root/meta/author"/>
</name>
</author>
<updated>
@@ -51,7 +47,7 @@
</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
- <xsl:apply-templates select="message/*" mode="xhtml"/>
+ <xsl:apply-templates select="content/*" mode="xhtml"/>
</div>
</content>
</entry>
@@ -69,25 +65,14 @@
<xsl:value-of select="$root/meta/title"/>
</title>
<updated>
- <xsl:value-of select="$latest/date"/>
+ <xsl:value-of select="timeline/entry[1]/date"/>
<xsl:text>T</xsl:text>
- <xsl:value-of select="$latest/date/@time"/>
+ <xsl:value-of select="timeline/entry[1]/date/@time"/>
<xsl:text>:00+02:00</xsl:text>
</updated>
- <xsl:apply-templates select="timeline/commit[position() &lt;= $root/meta/timeline/commit_count]"/>
+ <xsl:apply-templates select="timeline/entry[position() &lt;= $root/meta/timeline/commit_count]"/>
</feed>
</xsl:template>
-<xsl:template match="timeline/commit">
- <xsl:variable name="repository" select="@repository"/>
- <xsl:variable name="hash" select="@hash"/>
-
- <xsl:apply-templates select="$root/repositories/entry[
- @handle = $repository
- ]/commit[
- @hash = $hash
- ]"/>
-</xsl:template>
-
</xsl:stylesheet>
diff --git a/utility/fetch_feed.sh b/utility/fetch_feed.sh
deleted file mode 100755
index 37393f6..0000000
--- a/utility/fetch_feed.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env sh
-
-curl $1 | sed -e 's~^\([\*]\)\{3\}~\t\t\*~g' -e 's~^\([\*]\)\{2\}~\t\*~g'
diff --git a/utility/reference_commit.xsl b/utility/reference_commit.xsl
deleted file mode 100644
index 3423cd9..0000000
--- a/utility/reference_commit.xsl
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet
- version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
->
-
-<xsl:template match="@* | node()" mode="commit">
- <xsl:copy>
- <xsl:apply-templates select="@* | node()" mode="commit"/>
- </xsl:copy>
-</xsl:template>
-
-<xsl:template match="commit" mode="commit">
- <xsl:copy>
- <xsl:attribute name="repository">
- <xsl:value-of select="../@handle"/>
- </xsl:attribute>
-
- <xsl:apply-templates select="@* | node()" mode="commit"/>
- </xsl:copy>
-</xsl:template>
-
-<xsl:template match="title | message | date | author | link | text()" mode="commit"/>
-
-</xsl:stylesheet>