Skip to content

Commit 36adbeb

Browse files
Copy symbolic links in the assets as actual files (#1967)
1 parent 5ab94c8 commit 36adbeb

File tree

4 files changed

+26
-11
lines changed

4 files changed

+26
-11
lines changed

Diff for: lib/ex_doc/formatter/html.ex

+1-1
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ defmodule ExDoc.Formatter.HTML do
306306

307307
is_binary(dir_or_files) and File.dir?(dir_or_files) ->
308308
dir_or_files
309-
|> File.cp_r!(target_dir)
309+
|> File.cp_r!(target_dir, dereference_symlinks: true)
310310
|> Enum.map(&Path.relative_to(&1, output))
311311

312312
is_binary(dir_or_files) ->

Diff for: lib/ex_doc/formatter/html/templates.ex

+1-2
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,7 @@ defmodule ExDoc.Formatter.HTML.Templates do
203203
end
204204

205205
def module_summary(module_node) do
206-
entries =
207-
docs_groups(module_node.docs_groups, module_node.docs ++ module_node.typespecs)
206+
entries = docs_groups(module_node.docs_groups, module_node.docs ++ module_node.typespecs)
208207

209208
Enum.reject(entries, fn {_type, nodes} -> nodes == [] end)
210209
end

Diff for: lib/ex_doc/retriever.ex

+4-8
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,7 @@ defmodule ExDoc.Retriever do
247247
metadata
248248
)
249249

250-
source_url =
251-
source_link(function_data[:source_file], source, function_data.source_line)
250+
source_url = source_link(function_data[:source_file], source, function_data.source_line)
252251

253252
annotations =
254253
annotations_for_docs.(metadata) ++
@@ -260,8 +259,7 @@ defmodule ExDoc.Retriever do
260259
(source_doc && doc_ast(content_type, source_doc, file: doc_file, line: doc_line + 1)) ||
261260
function_data.doc_fallback.()
262261

263-
group =
264-
GroupMatcher.match_function(groups_for_docs, metadata)
262+
group = GroupMatcher.match_function(groups_for_docs, metadata)
265263

266264
%ExDoc.FunctionNode{
267265
id: nil_or_name(name, arity),
@@ -325,8 +323,7 @@ defmodule ExDoc.Retriever do
325323
doc_file = anno_file(anno, source)
326324
doc_line = anno_line(anno)
327325

328-
source_url =
329-
source_link(callback_data[:source_file], source, callback_data.source_line)
326+
source_url = source_link(callback_data[:source_file], source, callback_data.source_line)
330327

331328
metadata =
332329
Map.merge(
@@ -393,8 +390,7 @@ defmodule ExDoc.Retriever do
393390
metadata
394391
)
395392

396-
source_url =
397-
source_link(type_data[:source_file], source, type_data.source_line)
393+
source_url = source_link(type_data[:source_file], source, type_data.source_line)
398394

399395
signature = signature(type_data.signature)
400396

Diff for: test/ex_doc/formatter/html_test.exs

+20
Original file line numberDiff line numberDiff line change
@@ -816,4 +816,24 @@ defmodule ExDoc.Formatter.HTMLTest do
816816
after
817817
File.rm_rf!("test/tmp/html_assets")
818818
end
819+
820+
test "symbolic links in the assets should be resolved and copied as actual files",
821+
%{tmp_dir: tmp_dir} = context do
822+
File.mkdir_p!("test/tmp/html_assets/hello")
823+
File.touch!("test/tmp/html_assets/hello/world")
824+
825+
File.ln_s("world", "test/tmp/html_assets/hello/symlink_world")
826+
827+
generate_docs(
828+
doc_config(context,
829+
assets: %{"test/tmp/html_assets" => "assets"}
830+
)
831+
)
832+
833+
assert File.regular?(tmp_dir <> "/html/assets/hello/world")
834+
assert File.exists?(tmp_dir <> "/html/assets/hello/symlink_world")
835+
assert File.read_link(tmp_dir <> "/html/assets/hello/symlink_world") == {:error, :einval}
836+
after
837+
File.rm_rf!("test/tmp/html_assets")
838+
end
819839
end

0 commit comments

Comments
 (0)