Skip to content

Commit 44ac60d

Browse files
committed
test(babel): cover shebang and tangle-mode file permissions
Add Plenary specs to verify shebang prepending, default 0755 behavior, and :tangle-mode parsing/override (octal, chmod, ls styles).
1 parent bee0bee commit 44ac60d

1 file changed

Lines changed: 102 additions & 0 deletions

File tree

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
local helpers = require('tests.plenary.helpers')
2+
3+
local function stat_mode(path)
4+
local st = vim.uv.fs_stat(path)
5+
assert.is_not_nil(st)
6+
-- libuv returns st.mode containing type bits + permission bits
7+
return bit.band(st.mode, 0x1FF)
8+
end
9+
10+
describe('Tangle (shebang & mode)', function()
11+
it('should prepend shebang and default to 0755 when :shebang is set', function()
12+
local file = helpers.create_file({
13+
'#+property: header-args :tangle yes',
14+
'* Headline',
15+
"#+begin_src sh :shebang '#!/usr/bin/env bash'",
16+
'echo "hi"',
17+
'#+end_src',
18+
})
19+
20+
vim.cmd('norm ,obt')
21+
22+
local tangled_file = vim.fn.fnamemodify(file.filename, ':r') .. '.sh'
23+
assert.is.Not.Nil(vim.uv.fs_stat(tangled_file))
24+
assert.are.same({
25+
'#!/usr/bin/env bash',
26+
'echo "hi"',
27+
}, vim.fn.readfile(tangled_file))
28+
29+
assert.are.equal(tonumber("0755", 8), stat_mode(tangled_file))
30+
end)
31+
32+
it('should apply :tangle-mode octal form (o644) when provided', function()
33+
local file = helpers.create_file({
34+
'#+property: header-args :tangle yes',
35+
'* Headline',
36+
"#+begin_src lua :tangle-mode 'o644'",
37+
'print("hi")',
38+
'#+end_src',
39+
})
40+
41+
vim.cmd('norm ,obt')
42+
43+
local tangled_file = vim.fn.fnamemodify(file.filename, ':r') .. '.lua'
44+
assert.is.Not.Nil(vim.uv.fs_stat(tangled_file))
45+
assert.are.equal(tonumber("0644", 8), stat_mode(tangled_file))
46+
end)
47+
48+
it('should apply :tangle-mode chmod style (u=rw,go=r) when provided', function()
49+
local file = helpers.create_file({
50+
'#+property: header-args :tangle yes',
51+
'* Headline',
52+
"#+begin_src lua :tangle-mode 'u=rw,go=r'",
53+
'print("hi")',
54+
'#+end_src',
55+
})
56+
57+
vim.cmd('norm ,obt')
58+
59+
local tangled_file = vim.fn.fnamemodify(file.filename, ':r') .. '.lua'
60+
assert.is.Not.Nil(vim.uv.fs_stat(tangled_file))
61+
assert.are.equal(tonumber("0644", 8), stat_mode(tangled_file))
62+
end)
63+
64+
it('should apply :tangle-mode ls style (rwxr-x---) when provided', function()
65+
local file = helpers.create_file({
66+
'#+property: header-args :tangle yes',
67+
'* Headline',
68+
"#+begin_src lua :tangle-mode 'rwxr-x---'",
69+
'print("hi")',
70+
'#+end_src',
71+
})
72+
73+
vim.cmd('norm ,obt')
74+
75+
local tangled_file = vim.fn.fnamemodify(file.filename, ':r') .. '.lua'
76+
assert.is.Not.Nil(vim.uv.fs_stat(tangled_file))
77+
assert.are.equal(tonumber("0750", 8), stat_mode(tangled_file))
78+
end)
79+
80+
it('should keep 0755 when :shebang is set even if :tangle-mode is also set (mode is overridden if :tangle-mode present)', function()
81+
local file = helpers.create_file({
82+
'#+property: header-args :tangle yes',
83+
'* Headline',
84+
"#+begin_src sh :shebang '#!/usr/bin/env bash' :tangle-mode 'o700'",
85+
'echo "hi"',
86+
'#+end_src',
87+
})
88+
89+
vim.cmd('norm ,obt')
90+
91+
local tangled_file = vim.fn.fnamemodify(file.filename, ':r') .. '.sh'
92+
assert.is.Not.Nil(vim.uv.fs_stat(tangled_file))
93+
94+
assert.are.same({
95+
'#!/usr/bin/env bash',
96+
'echo "hi"',
97+
}, vim.fn.readfile(tangled_file))
98+
99+
-- :tangle-mode should override the shebang default
100+
assert.are.equal(tonumber("0700", 8), stat_mode(tangled_file))
101+
end)
102+
end)

0 commit comments

Comments
 (0)