From ce574100441c099a78053493ed7891c9f47eabd9 Mon Sep 17 00:00:00 2001 From: Petr Date: Thu, 25 Jun 2026 21:50:17 +0200 Subject: [PATCH] fix: Store#save writes non-default language posts into lang subdirectory default_path_for now routes posts whose lang differs from default_lang into content_dir//.md, matching the documented multi-language layout and preventing same-slug posts in different languages from overwriting each other. --- lib/volumen/store.rb | 4 +++- test/store_test.rb | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/volumen/store.rb b/lib/volumen/store.rb index 67ebaf0..3b37092 100644 --- a/lib/volumen/store.rb +++ b/lib/volumen/store.rb @@ -97,7 +97,9 @@ module Volumen end def default_path_for(post) - target = File.join(@content_dir, "#{post.slug}.md") + dir = @content_dir + dir = File.join(dir, post.lang) if post.lang && post.lang != @default_lang + target = File.join(dir, "#{post.slug}.md") unless File.expand_path(target).start_with?(File.expand_path(@content_dir) + File::SEPARATOR) raise ArgumentError, "slug escapes content directory" end diff --git a/test/store_test.rb b/test/store_test.rb index d21698c..c85d604 100644 --- a/test/store_test.rb +++ b/test/store_test.rb @@ -55,4 +55,19 @@ class StoreTest < Minitest::Test post = Volumen::Post.new(metadata: { "slug" => "../../etc/passwd" }, body: "x") assert_raises(ArgumentError, "slug escapes content directory") { store.save(post) } end + + def test_save_uses_lang_subdirectory_for_non_default_language + store = Volumen::Store.new(@dir, default_lang: "en") + post = Volumen::Post.new(metadata: { "slug" => "bonjour", "lang" => "fr" }, body: "x") + store.save(post) + assert File.exist?(File.join(@dir, "fr", "bonjour.md")) + end + + def test_save_uses_root_for_default_language + store = Volumen::Store.new(@dir, default_lang: "en") + post = Volumen::Post.new(metadata: { "slug" => "hello-new", "lang" => "en" }, body: "x") + store.save(post) + assert File.exist?(File.join(@dir, "hello-new.md")) + refute File.exist?(File.join(@dir, "en", "hello-new.md")) + end end