From aa378acdf51daf235c7e721cfa646d115d8708f0 Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Fri, 8 Aug 2014 16:25:33 +0200 Subject: fileinfo: implement os_fileinfo_size this replaces os_get_file_size and file_info.stat.st_size --- test/unit/os/fs_spec.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index 4cea8f55f1..c92c1513b7 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -597,6 +597,20 @@ describe('fs function', function() end) end) + describe('os_fileinfo_size', function() + it('returns the correct size of a file', function() + local path = 'unit-test-directory/test.file' + local file = io.open(path, 'w') + file:write('some bytes to get filesize != 0') + file:flush() + file:close() + local size = lfs.attributes(path, 'size') + local file_info = file_info_new() + assert.is_true(fs.os_get_file_info(path, file_info)) + eq(size, fs.os_fileinfo_size(file_info)) + end) + end) + describe('os_get_file_id', function() it('returns false if given an non-existing file', function() local file_id = file_id_new() -- cgit From e85fe0957d40080f43cbfcbe9eb8864475325b09 Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Fri, 8 Aug 2014 16:53:03 +0200 Subject: fileinfo: implement os_fileinfo_hardlinks --- test/unit/os/fs_spec.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index c92c1513b7..9f6d110e8f 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -47,6 +47,7 @@ describe('fs function', function() os.remove('unit-test-directory/test.file') os.remove('unit-test-directory/test_2.file') os.remove('unit-test-directory/test_link.file') + os.remove('unit-test-directory/test_hlink.file') lfs.rmdir('unit-test-directory') end) @@ -611,6 +612,19 @@ describe('fs function', function() end) end) + describe('os_fileinfo_hardlinks', function() + it('returns the correct number of hardlinks', function() + local path = 'unit-test-directory/test.file' + local path_link = 'unit-test-directory/test_hlink.file' + local file_info = file_info_new() + assert.is_true(fs.os_get_file_info(path, file_info)) + eq(1, fs.os_fileinfo_hardlinks(file_info)) + lfs.link(path, path_link) + assert.is_true(fs.os_get_file_info(path, file_info)) + eq(2, fs.os_fileinfo_hardlinks(file_info)) + end) + end) + describe('os_get_file_id', function() it('returns false if given an non-existing file', function() local file_id = file_id_new() -- cgit From 9ee1c3604c0cc8a3ec1bac32fb33e9c0d0887155 Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Sat, 9 Aug 2014 14:59:52 +0200 Subject: fileinfo: implement os_fileinfo_blocksize --- test/unit/os/fs_spec.lua | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index 9f6d110e8f..696e6f15cc 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -625,6 +625,27 @@ describe('fs function', function() end) end) + describe('os_fileinfo_blocksize', function() + it('returns the correct blocksize of a file', function() + local path = 'unit-test-directory/test.file' + -- there is a bug in luafilesystem where + -- `lfs.attributes path, 'blksize'` returns the worng value: + -- https://github.com/keplerproject/luafilesystem/pull/44 + -- using this workaround for now: + local blksize = lfs.attributes(path).blksize + local file_info = file_info_new() + assert.is_true(fs.os_get_file_info(path, file_info)) + if blksize then + eq(blksize, fs.os_fileinfo_blocksize(file_info)) + else + -- luafs dosn't support blksize on windows + -- libuv on windows returns a constant value as blocksize + -- checking for this constant value should be enough + eq(2048, fs.os_fileinfo_blocksize(file_info)) + end + end) + end) + describe('os_get_file_id', function() it('returns false if given an non-existing file', function() local file_id = file_id_new() -- cgit From 5d074a0aa6b307a11ee572db6bf48ca17c3a8a23 Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Wed, 27 Aug 2014 19:14:44 +0200 Subject: fileinfo: rename os_get_file_info{,_link,_fd} --- test/unit/os/fs_spec.lua | 50 ++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index 696e6f15cc..f11137b1ed 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -483,63 +483,63 @@ describe('fs function', function() return file_info end - describe('os_get_file_info', function() + describe('os_fileinfo', function() it('returns false if given a non-existing file', function() local file_info = file_info_new() - assert.is_false((fs.os_get_file_info('/non-existent', file_info))) + assert.is_false((fs.os_fileinfo('/non-existent', file_info))) end) it('returns true if given an existing file and fills file_info', function() local file_info = file_info_new() local path = 'unit-test-directory/test.file' - assert.is_true((fs.os_get_file_info(path, file_info))) + assert.is_true((fs.os_fileinfo(path, file_info))) assert.is_true((is_file_info_filled(file_info))) end) it('returns the file info of the linked file, not the link', function() local file_info = file_info_new() local path = 'unit-test-directory/test_link.file' - assert.is_true((fs.os_get_file_info(path, file_info))) + assert.is_true((fs.os_fileinfo(path, file_info))) assert.is_true((is_file_info_filled(file_info))) local mode = tonumber(file_info[0].stat.st_mode) return eq(ffi.C.kS_IFREG, (bit.band(mode, ffi.C.kS_IFMT))) end) end) - describe('os_get_file_info_link', function() + describe('os_fileinfo_link', function() it('returns false if given a non-existing file', function() local file_info = file_info_new() - assert.is_false((fs.os_get_file_info_link('/non-existent', file_info))) + assert.is_false((fs.os_fileinfo_link('/non-existent', file_info))) end) it('returns true if given an existing file and fills file_info', function() local file_info = file_info_new() local path = 'unit-test-directory/test.file' - assert.is_true((fs.os_get_file_info_link(path, file_info))) + assert.is_true((fs.os_fileinfo_link(path, file_info))) assert.is_true((is_file_info_filled(file_info))) end) it('returns the file info of the link, not the linked file', function() local file_info = file_info_new() local path = 'unit-test-directory/test_link.file' - assert.is_true((fs.os_get_file_info_link(path, file_info))) + assert.is_true((fs.os_fileinfo_link(path, file_info))) assert.is_true((is_file_info_filled(file_info))) local mode = tonumber(file_info[0].stat.st_mode) eq(ffi.C.kS_IFLNK, (bit.band(mode, ffi.C.kS_IFMT))) end) end) - describe('os_get_file_info_fd', function() + describe('os_fileinfo_fd', function() it('returns false if given an invalid file descriptor', function() local file_info = file_info_new() - assert.is_false((fs.os_get_file_info_fd(-1, file_info))) + assert.is_false((fs.os_fileinfo_fd(-1, file_info))) end) it('returns true if given a file descriptor and fills file_info', function() local file_info = file_info_new() local path = 'unit-test-directory/test.file' local fd = ffi.C.open(path, 0) - assert.is_true((fs.os_get_file_info_fd(fd, file_info))) + assert.is_true((fs.os_fileinfo_fd(fd, file_info))) assert.is_true((is_file_info_filled(file_info))) ffi.C.close(fd) end) @@ -551,8 +551,8 @@ describe('fs function', function() local file_info_2 = file_info_new() local path_1 = 'unit-test-directory/test.file' local path_2 = 'unit-test-directory/test_2.file' - assert.is_true((fs.os_get_file_info(path_1, file_info_1))) - assert.is_true((fs.os_get_file_info(path_2, file_info_2))) + assert.is_true((fs.os_fileinfo(path_1, file_info_1))) + assert.is_true((fs.os_fileinfo(path_2, file_info_2))) assert.is_false((fs.os_file_info_id_equal(file_info_1, file_info_2))) end) @@ -560,8 +560,8 @@ describe('fs function', function() local file_info_1 = file_info_new() local file_info_2 = file_info_new() local path = 'unit-test-directory/test.file' - assert.is_true((fs.os_get_file_info(path, file_info_1))) - assert.is_true((fs.os_get_file_info(path, file_info_2))) + assert.is_true((fs.os_fileinfo(path, file_info_1))) + assert.is_true((fs.os_fileinfo(path, file_info_2))) assert.is_true((fs.os_file_info_id_equal(file_info_1, file_info_2))) end) @@ -570,8 +570,8 @@ describe('fs function', function() local file_info_2 = file_info_new() local path_1 = 'unit-test-directory/test.file' local path_2 = 'unit-test-directory/test_link.file' - assert.is_true((fs.os_get_file_info(path_1, file_info_1))) - assert.is_true((fs.os_get_file_info(path_2, file_info_2))) + assert.is_true((fs.os_fileinfo(path_1, file_info_1))) + assert.is_true((fs.os_fileinfo(path_2, file_info_2))) assert.is_true((fs.os_file_info_id_equal(file_info_1, file_info_2))) end) end) @@ -581,7 +581,7 @@ describe('fs function', function() local file_info = file_info_new() local file_id = file_id_new() local path = 'unit-test-directory/test.file' - assert.is_true((fs.os_get_file_info(path, file_info))) + assert.is_true((fs.os_fileinfo(path, file_info))) fs.os_file_info_get_id(file_info, file_id) eq(file_info[0].stat.st_ino, file_id[0].inode) eq(file_info[0].stat.st_dev, file_id[0].device_id) @@ -592,7 +592,7 @@ describe('fs function', function() it('returns the inode from file_info', function() local file_info = file_info_new() local path = 'unit-test-directory/test.file' - assert.is_true((fs.os_get_file_info(path, file_info))) + assert.is_true((fs.os_fileinfo(path, file_info))) local inode = fs.os_file_info_get_inode(file_info) eq(file_info[0].stat.st_ino, inode) end) @@ -607,7 +607,7 @@ describe('fs function', function() file:close() local size = lfs.attributes(path, 'size') local file_info = file_info_new() - assert.is_true(fs.os_get_file_info(path, file_info)) + assert.is_true(fs.os_fileinfo(path, file_info)) eq(size, fs.os_fileinfo_size(file_info)) end) end) @@ -617,10 +617,10 @@ describe('fs function', function() local path = 'unit-test-directory/test.file' local path_link = 'unit-test-directory/test_hlink.file' local file_info = file_info_new() - assert.is_true(fs.os_get_file_info(path, file_info)) + assert.is_true(fs.os_fileinfo(path, file_info)) eq(1, fs.os_fileinfo_hardlinks(file_info)) lfs.link(path, path_link) - assert.is_true(fs.os_get_file_info(path, file_info)) + assert.is_true(fs.os_fileinfo(path, file_info)) eq(2, fs.os_fileinfo_hardlinks(file_info)) end) end) @@ -634,7 +634,7 @@ describe('fs function', function() -- using this workaround for now: local blksize = lfs.attributes(path).blksize local file_info = file_info_new() - assert.is_true(fs.os_get_file_info(path, file_info)) + assert.is_true(fs.os_fileinfo(path, file_info)) if blksize then eq(blksize, fs.os_fileinfo_blocksize(file_info)) else @@ -686,7 +686,7 @@ describe('fs function', function() local file_info = file_info_new() local path = 'unit-test-directory/test.file' assert.is_true((fs.os_get_file_id(path, file_id))) - assert.is_true((fs.os_get_file_info(path, file_info))) + assert.is_true((fs.os_fileinfo(path, file_info))) assert.is_true((fs.os_file_id_equal_file_info(file_id, file_info))) end) @@ -696,7 +696,7 @@ describe('fs function', function() local path_1 = 'unit-test-directory/test.file' local path_2 = 'unit-test-directory/test_2.file' assert.is_true((fs.os_get_file_id(path_1, file_id))) - assert.is_true((fs.os_get_file_info(path_2, file_info))) + assert.is_true((fs.os_fileinfo(path_2, file_info))) assert.is_false((fs.os_file_id_equal_file_info(file_id, file_info))) end) end) -- cgit From edcc1a97327c68c7ae1353281784c47e026d6674 Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Wed, 27 Aug 2014 19:53:31 +0200 Subject: fileinfo: rename os_file_info_id_equal --- test/unit/os/fs_spec.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index f11137b1ed..54baf55155 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -545,7 +545,7 @@ describe('fs function', function() end) end) - describe('os_file_info_id_equal', function() + describe('os_fileinfo_id_equal', function() it('returns false if file infos represent different files', function() local file_info_1 = file_info_new() local file_info_2 = file_info_new() @@ -553,7 +553,7 @@ describe('fs function', function() local path_2 = 'unit-test-directory/test_2.file' assert.is_true((fs.os_fileinfo(path_1, file_info_1))) assert.is_true((fs.os_fileinfo(path_2, file_info_2))) - assert.is_false((fs.os_file_info_id_equal(file_info_1, file_info_2))) + assert.is_false((fs.os_fileinfo_id_equal(file_info_1, file_info_2))) end) it('returns true if file infos represent the same file', function() @@ -562,7 +562,7 @@ describe('fs function', function() local path = 'unit-test-directory/test.file' assert.is_true((fs.os_fileinfo(path, file_info_1))) assert.is_true((fs.os_fileinfo(path, file_info_2))) - assert.is_true((fs.os_file_info_id_equal(file_info_1, file_info_2))) + assert.is_true((fs.os_fileinfo_id_equal(file_info_1, file_info_2))) end) it('returns true if file infos represent the same file (symlink)', function() @@ -572,7 +572,7 @@ describe('fs function', function() local path_2 = 'unit-test-directory/test_link.file' assert.is_true((fs.os_fileinfo(path_1, file_info_1))) assert.is_true((fs.os_fileinfo(path_2, file_info_2))) - assert.is_true((fs.os_file_info_id_equal(file_info_1, file_info_2))) + assert.is_true((fs.os_fileinfo_id_equal(file_info_1, file_info_2))) end) end) -- cgit From 6e3dce144a849166a02a3633f005d8d61d1eb19d Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Wed, 27 Aug 2014 19:56:49 +0200 Subject: fileinfo: rename os_file_info_get_id --- test/unit/os/fs_spec.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index 54baf55155..5bac112867 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -576,13 +576,13 @@ describe('fs function', function() end) end) - describe('os_file_info_get_id', function() + describe('os_fileinfo_id', function() it('extracts ino/dev from file_info into file_id', function() local file_info = file_info_new() local file_id = file_id_new() local path = 'unit-test-directory/test.file' assert.is_true((fs.os_fileinfo(path, file_info))) - fs.os_file_info_get_id(file_info, file_id) + fs.os_fileinfo_id(file_info, file_id) eq(file_info[0].stat.st_ino, file_id[0].inode) eq(file_info[0].stat.st_dev, file_id[0].device_id) end) -- cgit From 8a66f4f2453be3385c65d298609c282eeab08af8 Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Wed, 27 Aug 2014 20:04:03 +0200 Subject: fileinfo: rename os_file_info_get_inode --- test/unit/os/fs_spec.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index 5bac112867..f56f6f768f 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -588,12 +588,12 @@ describe('fs function', function() end) end) - describe('os_file_info_get_inode', function() + describe('os_fileinfo_inode', function() it('returns the inode from file_info', function() local file_info = file_info_new() local path = 'unit-test-directory/test.file' assert.is_true((fs.os_fileinfo(path, file_info))) - local inode = fs.os_file_info_get_inode(file_info) + local inode = fs.os_fileinfo_inode(file_info) eq(file_info[0].stat.st_ino, inode) end) end) -- cgit From 4e43095ab20d2b03b206f1b019570873af35c68c Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Wed, 27 Aug 2014 20:09:39 +0200 Subject: fileid: rename os_get_file_id --- test/unit/os/fs_spec.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index f56f6f768f..240359b805 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -646,16 +646,16 @@ describe('fs function', function() end) end) - describe('os_get_file_id', function() + describe('os_fileid', function() it('returns false if given an non-existing file', function() local file_id = file_id_new() - assert.is_false((fs.os_get_file_id('/non-existent', file_id))) + assert.is_false((fs.os_fileid('/non-existent', file_id))) end) it('returns true if given an existing file and fills file_id', function() local file_id = file_id_new() local path = 'unit-test-directory/test.file' - assert.is_true((fs.os_get_file_id(path, file_id))) + assert.is_true((fs.os_fileid(path, file_id))) assert.is_true(0 < file_id[0].inode) assert.is_true(0 < file_id[0].device_id) end) @@ -665,7 +665,7 @@ describe('fs function', function() it('returns true if two FileIDs are equal', function() local file_id = file_id_new() local path = 'unit-test-directory/test.file' - assert.is_true((fs.os_get_file_id(path, file_id))) + assert.is_true((fs.os_fileid(path, file_id))) assert.is_true((fs.os_file_id_equal(file_id, file_id))) end) @@ -674,8 +674,8 @@ describe('fs function', function() local file_id_2 = file_id_new() local path_1 = 'unit-test-directory/test.file' local path_2 = 'unit-test-directory/test_2.file' - assert.is_true((fs.os_get_file_id(path_1, file_id_1))) - assert.is_true((fs.os_get_file_id(path_2, file_id_2))) + assert.is_true((fs.os_fileid(path_1, file_id_1))) + assert.is_true((fs.os_fileid(path_2, file_id_2))) assert.is_false((fs.os_file_id_equal(file_id_1, file_id_2))) end) end) @@ -685,7 +685,7 @@ describe('fs function', function() local file_id = file_id_new() local file_info = file_info_new() local path = 'unit-test-directory/test.file' - assert.is_true((fs.os_get_file_id(path, file_id))) + assert.is_true((fs.os_fileid(path, file_id))) assert.is_true((fs.os_fileinfo(path, file_info))) assert.is_true((fs.os_file_id_equal_file_info(file_id, file_info))) end) @@ -695,7 +695,7 @@ describe('fs function', function() local file_info = file_info_new() local path_1 = 'unit-test-directory/test.file' local path_2 = 'unit-test-directory/test_2.file' - assert.is_true((fs.os_get_file_id(path_1, file_id))) + assert.is_true((fs.os_fileid(path_1, file_id))) assert.is_true((fs.os_fileinfo(path_2, file_info))) assert.is_false((fs.os_file_id_equal_file_info(file_id, file_info))) end) -- cgit From 3cf7a17a4452cc8ae42104459992a8e73963084e Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Wed, 27 Aug 2014 20:12:11 +0200 Subject: fileid: rename os_file_id_equal --- test/unit/os/fs_spec.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index 240359b805..ad90b17e56 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -661,12 +661,12 @@ describe('fs function', function() end) end) - describe('os_file_id_equal', function() + describe('os_fileid_equal', function() it('returns true if two FileIDs are equal', function() local file_id = file_id_new() local path = 'unit-test-directory/test.file' assert.is_true((fs.os_fileid(path, file_id))) - assert.is_true((fs.os_file_id_equal(file_id, file_id))) + assert.is_true((fs.os_fileid_equal(file_id, file_id))) end) it('returns false if two FileIDs are not equal', function() @@ -676,18 +676,18 @@ describe('fs function', function() local path_2 = 'unit-test-directory/test_2.file' assert.is_true((fs.os_fileid(path_1, file_id_1))) assert.is_true((fs.os_fileid(path_2, file_id_2))) - assert.is_false((fs.os_file_id_equal(file_id_1, file_id_2))) + assert.is_false((fs.os_fileid_equal(file_id_1, file_id_2))) end) end) - describe('os_file_id_equal_file_info', function() + describe('os_fileid_equal_file_info', function() it('returns true if file_id and file_info represent the same file', function() local file_id = file_id_new() local file_info = file_info_new() local path = 'unit-test-directory/test.file' assert.is_true((fs.os_fileid(path, file_id))) assert.is_true((fs.os_fileinfo(path, file_info))) - assert.is_true((fs.os_file_id_equal_file_info(file_id, file_info))) + assert.is_true((fs.os_fileid_equal_file_info(file_id, file_info))) end) it('returns false if file_id and file_info represent different files', function() @@ -697,7 +697,7 @@ describe('fs function', function() local path_2 = 'unit-test-directory/test_2.file' assert.is_true((fs.os_fileid(path_1, file_id))) assert.is_true((fs.os_fileinfo(path_2, file_info))) - assert.is_false((fs.os_file_id_equal_file_info(file_id, file_info))) + assert.is_false((fs.os_fileid_equal_file_info(file_id, file_info))) end) end) end) -- cgit From 10813ce38c6588664e1decc8ba35424923cfb2e4 Mon Sep 17 00:00:00 2001 From: Stefan Hoffmann Date: Wed, 27 Aug 2014 20:14:39 +0200 Subject: fileid: rename os_file_id_equal_file_info --- test/unit/os/fs_spec.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'test') diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index ad90b17e56..9233ce02c7 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -680,14 +680,14 @@ describe('fs function', function() end) end) - describe('os_fileid_equal_file_info', function() + describe('os_fileid_equal_fileinfo', function() it('returns true if file_id and file_info represent the same file', function() local file_id = file_id_new() local file_info = file_info_new() local path = 'unit-test-directory/test.file' assert.is_true((fs.os_fileid(path, file_id))) assert.is_true((fs.os_fileinfo(path, file_info))) - assert.is_true((fs.os_fileid_equal_file_info(file_id, file_info))) + assert.is_true((fs.os_fileid_equal_fileinfo(file_id, file_info))) end) it('returns false if file_id and file_info represent different files', function() @@ -697,7 +697,7 @@ describe('fs function', function() local path_2 = 'unit-test-directory/test_2.file' assert.is_true((fs.os_fileid(path_1, file_id))) assert.is_true((fs.os_fileinfo(path_2, file_info))) - assert.is_false((fs.os_fileid_equal_file_info(file_id, file_info))) + assert.is_false((fs.os_fileid_equal_fileinfo(file_id, file_info))) end) end) end) -- cgit