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

[PATCH v2 10/16] write_shared_index(): use tempfile module

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Aug 10, 2015, 09:47 UTC
Message-ID
<b3c03fa2da76ef5e968115c6b2a73f6033aecf8c.1439198011.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1439198011.git.mhagger@alum.mit.edu>
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 read-cache.c | 38 ++++++--------------------------------
 1 file changed, 6 insertions(+), 32 deletions(-)
diff --git a/read-cache.c b/read-cache.c
index 96cb9a3..89be226 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -5,6 +5,7 @@
  */
 #define NO_THE_INDEX_COMPATIBILITY_MACROS
 #include "cache.h"
+#include "tempfile.h"
 #include "lockfile.h"
 #include "cache-tree.h"
 #include "refs.h"
@@ -2136,54 +2137,27 @@ static int write_split_index(struct index_state *istate,
 	return ret;
 }
 
-static char *temporary_sharedindex;
-
-static void remove_temporary_sharedindex(void)
-{
-	if (temporary_sharedindex) {
-		unlink_or_warn(temporary_sharedindex);
-		free(temporary_sharedindex);
-		temporary_sharedindex = NULL;
-	}
-}
-
-static void remove_temporary_sharedindex_on_signal(int signo)
-{
-	remove_temporary_sharedindex();
-	sigchain_pop(signo);
-	raise(signo);
-}
+static struct tempfile temporary_sharedindex;
 
 static int write_shared_index(struct index_state *istate,
 			      struct lock_file *lock, unsigned flags)
 {
 	struct split_index *si = istate->split_index;
-	static int installed_handler;
 	int fd, ret;
 
-	temporary_sharedindex = git_pathdup("sharedindex_XXXXXX");
-	fd = mkstemp(temporary_sharedindex);
+	fd = mks_tempfile(&temporary_sharedindex, git_path("sharedindex_XXXXXX"));
 	if (fd < 0) {
-		free(temporary_sharedindex);
-		temporary_sharedindex = NULL;
 		hashclr(si->base_sha1);
 		return do_write_locked_index(istate, lock, flags);
 	}
-	if (!installed_handler) {
-		atexit(remove_temporary_sharedindex);
-		sigchain_push_common(remove_temporary_sharedindex_on_signal);
-	}
 	move_cache_to_base_index(istate);
 	ret = do_write_index(si->base, fd, 1);
-	close(fd);
 	if (ret) {
-		remove_temporary_sharedindex();
+		delete_tempfile(&temporary_sharedindex);
 		return ret;
 	}
-	ret = rename(temporary_sharedindex,
-		     git_path("sharedindex.%s", sha1_to_hex(si->base->sha1)));
-	free(temporary_sharedindex);
-	temporary_sharedindex = NULL;
+	ret = rename_tempfile(&temporary_sharedindex,
+			      git_path("sharedindex.%s", sha1_to_hex(si->base->sha1)));
 	if (!ret)
 		hashcpy(si->base_sha1, si->base->sha1);
 	return ret;
-- 
2.5.0
Previous: Michael HaggertyNext: Michael Haggerty
Message 15 of 29 in “Introduce a tempfile module”
  1. 00/16 Introduce a tempfile moduleMichael Haggerty, Aug 10, 2015
  2. 01/16 Move lockfile documentation to lockfile.h and lockfile.cMichael Haggerty, Aug 10, 2015
  3. Junio C HamanoAug 11, 2015
  4. 02/16 create_bundle(): duplicate file descriptor to avoid closing it twiceMichael Haggerty, Aug 10, 2015
  5. 03/16 lockfile: add accessors get_lock_file_fd() and get_lock_file_fp()Michael Haggerty, Aug 10, 2015
  6. Junio C HamanoAug 11, 2015
  7. 04/16 lockfile: add accessor get_lock_file_path()Michael Haggerty, Aug 10, 2015
  8. Junio C HamanoAug 11, 2015
  9. 05/16 commit_lock_file(): use get_locked_file_path()Michael Haggerty, Aug 10, 2015
  10. 06/16 tempfile: a new module for handling temporary filesMichael Haggerty, Aug 10, 2015
  11. 07/16 prepare_tempfile_object(): new function, extracted from create_tempfile()Michael Haggerty, Aug 10, 2015
  12. Junio C HamanoAug 11, 2015
  13. 08/16 tempfile: add several functions for creating temporary filesMichael Haggerty, Aug 10, 2015
  14. 09/16 register_tempfile(): new function to handle an existing temporary fileMichael Haggerty, Aug 10, 2015
  15. 10/16 write_shared_index(): use tempfile moduleMichael Haggerty, Aug 10, 2015
  16. 11/16 setup_temporary_shallow(): use tempfile moduleMichael Haggerty, Aug 10, 2015
  17. 12/16 diff: use tempfile moduleMichael Haggerty, Aug 10, 2015
  18. Junio C HamanoAug 11, 2015
  19. Michael HaggertyAug 12, 2015
  20. Junio C HamanoAug 12, 2015
  21. 12/16 diff: use tempfile moduleMichael Haggerty, Aug 12, 2015
  22. 13/16 lock_repo_for_gc(): compute the path to "gc.pid" only onceMichael Haggerty, Aug 10, 2015
  23. Junio C HamanoAug 11, 2015
  24. Junio C HamanoAug 11, 2015
  25. 14/16 gc: use tempfile module to handle gc.pid fileMichael Haggerty, Aug 10, 2015
  26. 15/16 credential-cache--daemon: delete socket from main()Michael Haggerty, Aug 10, 2015
  27. 16/16 credential-cache--daemon: use tempfile moduleMichael Haggerty, Aug 10, 2015
  28. Junio C HamanoAug 11, 2015
  29. Michael HaggertyAug 12, 2015

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.