git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 1/2] t: add a test helper to truncate files

From
brian m. carlson <sandals@crustytoothpaste.net>
Date
Oct 12, 2023, 16:09 UTC
Message-ID
<20231012160930.330618-2-sandals@crustytoothpaste.net>
In-Reply-To
<20231012160930.330618-1-sandals@crustytoothpaste.net>
From: "brian m. carlson" <bk2204@github.com>

In a future commit, we're going to work with some large files which will be at least 4 GiB in size. To take advantage of the sparseness functionality on most Unix systems and avoid running the system out of disk, it would be convenient to use truncate(2) to simply create a sparse file of sufficient size.

However, the GNU truncate(1) utility isn't portable, so let's write a tiny test helper that does the work for us.

Signed-off-by: brian m. carlson <bk2204@github.com>
---
 Makefile                 |  1 +
 t/helper/test-tool.c     |  1 +
 t/helper/test-tool.h     |  1 +
 t/helper/test-truncate.c | 27 +++++++++++++++++++++++++++
 4 files changed, 30 insertions(+)
 create mode 100644 t/helper/test-truncate.c
diff --git a/Makefile b/Makefile
index 9c6a2f125f..03adcb5a48 100644
--- a/Makefile
+++ b/Makefile
@@ -852,6 +852,7 @@ TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o
 TEST_BUILTINS_OBJS += test-submodule.o
 TEST_BUILTINS_OBJS += test-subprocess.o
 TEST_BUILTINS_OBJS += test-trace2.o
+TEST_BUILTINS_OBJS += test-truncate.o
 TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
 TEST_BUILTINS_OBJS += test-userdiff.o
 TEST_BUILTINS_OBJS += test-wildmatch.o
diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c
index 9010ac6de7..876cd2dc31 100644
--- a/t/helper/test-tool.c
+++ b/t/helper/test-tool.c
@@ -86,6 +86,7 @@ static struct test_cmd cmds[] = {
 	{ "submodule-nested-repo-config", cmd__submodule_nested_repo_config },
 	{ "subprocess", cmd__subprocess },
 	{ "trace2", cmd__trace2 },
+	{ "truncate", cmd__truncate },
 	{ "userdiff", cmd__userdiff },
 	{ "urlmatch-normalization", cmd__urlmatch_normalization },
 	{ "xml-encode", cmd__xml_encode },
diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h
index f134f96b97..70dd4eba11 100644
--- a/t/helper/test-tool.h
+++ b/t/helper/test-tool.h
@@ -79,6 +79,7 @@ int cmd__submodule_config(int argc, const char **argv);
 int cmd__submodule_nested_repo_config(int argc, const char **argv);
 int cmd__subprocess(int argc, const char **argv);
 int cmd__trace2(int argc, const char **argv);
+int cmd__truncate(int argc, const char **argv);
 int cmd__userdiff(int argc, const char **argv);
 int cmd__urlmatch_normalization(int argc, const char **argv);
 int cmd__xml_encode(int argc, const char **argv);
diff --git a/t/helper/test-truncate.c b/t/helper/test-truncate.c
new file mode 100644
index 0000000000..bd3fde364b
--- /dev/null
+++ b/t/helper/test-truncate.c
@@ -0,0 +1,27 @@
+#include "test-tool.h"
+#include "git-compat-util.h"
+
+/*
+ * Truncate a file to the given size.
+ */
+int cmd__truncate(int argc, const char **argv)
+{
+	char *p = NULL;
+	uintmax_t sz = 0;
+	int fd = -1;
+
+	if (argc != 3)
+		die("expected filename and size");
+
+	sz = strtoumax(argv[2], &p, 0);
+	if (*p)
+		die("invalid size");
+
+	fd = open(argv[1], O_WRONLY | O_CREAT, 0600);
+	if (fd < 0)
+		die_errno("failed to open file %s", argv[1]);
+
+	if (ftruncate(fd, (off_t) sz) < 0)
+		die_errno("failed to truncate file");
+	return 0;
+}
Previous: brian m. carlsonNext: Eric Sunshine
Message 2 of 16 in “Prevent re-reading 4 GiB files on every status”
  1. 0/2 Prevent re-reading 4 GiB files on every statusbrian m. carlson, Oct 12, 2023
  2. 1/2 t: add a test helper to truncate filesbrian m. carlson, Oct 12, 2023
  3. Eric SunshineOct 12, 2023
  4. brian m. carlsonOct 13, 2023
  5. Junio C HamanoOct 12, 2023
  6. brian m. carlsonOct 13, 2023
  7. Junio C HamanoOct 13, 2023
  8. Jeff KingOct 16, 2023
  9. 2/2 Prevent git from rehashing 4GiB filesbrian m. carlson, Oct 12, 2023
  10. Junio C HamanoOct 12, 2023
  11. brian m. carlsonOct 12, 2023
  12. Junio C HamanoOct 12, 2023
  13. Jeff KingOct 17, 2023
  14. Jason HattonOct 17, 2023
  15. Junio C HamanoOct 17, 2023
  16. brian m. carlsonOct 18, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.