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

Re: [PATCH 20/24] update-index: test the system before enabling untracked cache

From
Duy Nguyen <pclouds@gmail.com>
Date
Jan 22, 2015, 10:26 UTC
Message-ID
<20150122102624.GA25892@lanh>
In-Reply-To
<xmqqvbk0vug9.fsf@gitster.dls.corp.google.com>
On Wed, Jan 21, 2015 at 10:51:02AM -0800, Junio C Hamano wrote:
Show 11 quoted lines
> >> It appears that this hijacks a fixed name dir-mtime-test at the root
> >> level of every project managed by Git.  Is that intended?
> >
> > I did think about filename clash, but I chose a fixed name anyway for
> > simplicity, otherwise we would need to reconstruct paths
> > "dir-mtime-test/..." in many places.
> 
> If you stuff the name of test directory (default "dir-mtime-test")
> in a strbuf and formulate test paths by chomping to the original and
> then appending "/..." at the end, like your remove_test_directory()
> already does, wouldn't that be sufficient?
It looks actually good. How about this on top?
-- 8< --
diff --git a/builtin/update-index.c b/builtin/update-index.c
index f23ec83..f5f6689 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c
@@ -32,6 +32,7 @@ static int mark_valid_only;
 static int mark_skip_worktree_only;
 #define MARK_FLAG 1
 #define UNMARK_FLAG 2
+static struct strbuf mtime_dir = STRBUF_INIT;
 
 __attribute__((format (printf, 1, 2)))
 static void report(const char *fmt, ...)
@@ -49,28 +50,37 @@ static void report(const char *fmt, ...)
 
 static void remove_test_directory(void)
 {
-	struct strbuf sb = STRBUF_INIT;
-	strbuf_addstr(&sb, "dir-mtime-test");
-	remove_dir_recursively(&sb, 0);
-	strbuf_release(&sb);
+	if (mtime_dir.len)
+		remove_dir_recursively(&mtime_dir, 0);
+}
+
+static const char *get_mtime_path(const char *path)
+{
+	static struct strbuf sb = STRBUF_INIT;
+	strbuf_reset(&sb);
+	strbuf_addf(&sb, "%s/%s", mtime_dir.buf, path);
+	return sb.buf;
 }
 
 static void xmkdir(const char *path)
 {
+	path = get_mtime_path(path);
 	if (mkdir(path, 0700))
 		die_errno(_("failed to create directory %s"), path);
 }
 
-static int xstat(const char *path, struct stat *st)
+static int xstat_mtime_dir(struct stat *st)
 {
-	if (stat(path, st))
-		die_errno(_("failed to stat %s"), path);
+	if (stat(mtime_dir.buf, st))
+		die_errno(_("failed to stat %s"), mtime_dir.buf);
 	return 0;
 }
 
 static int create_file(const char *path)
 {
-	int fd = open(path, O_CREAT | O_RDWR, 0644);
+	int fd;
+	path = get_mtime_path(path);
+	fd = open(path, O_CREAT | O_RDWR, 0644);
 	if (fd < 0)
 		die_errno(_("failed to create file %s"), path);
 	return fd;
@@ -78,12 +88,14 @@ static int create_file(const char *path)
 
 static void xunlink(const char *path)
 {
+	path = get_mtime_path(path);
 	if (unlink(path))
 		die_errno(_("failed to delete file %s"), path);
 }
 
 static void xrmdir(const char *path)
 {
+	path = get_mtime_path(path);
 	if (rmdir(path))
 		die_errno(_("failed to delete directory %s"), path);
 }
@@ -102,37 +114,40 @@ static int test_if_untracked_cache_is_supported(void)
 {
 	struct stat st;
 	struct stat_data base;
-	int fd;
+	int fd, ret = 0;
+
+	strbuf_addstr(&mtime_dir, "mtime-test-XXXXXX");
+	if (!mkdtemp(mtime_dir.buf))
+		die_errno("Could not make temporary directory");
 
 	fprintf(stderr, _("Testing "));
-	xmkdir("dir-mtime-test");
 	atexit(remove_test_directory);
-	xstat("dir-mtime-test", &st);
+	xstat_mtime_dir(&st);
 	fill_stat_data(&base, &st);
 	fputc('.', stderr);
 
 	avoid_racy();
-	fd = create_file("dir-mtime-test/newfile");
-	xstat("dir-mtime-test", &st);
+	fd = create_file("newfile");
+	xstat_mtime_dir(&st);
 	if (!match_stat_data(&base, &st)) {
 		close(fd);
 		fputc('\n', stderr);
 		fprintf_ln(stderr,_("directory stat info does not "
 				    "change after adding a new file"));
-		return 0;
+		goto done;
 	}
 	fill_stat_data(&base, &st);
 	fputc('.', stderr);
 
 	avoid_racy();
-	xmkdir("dir-mtime-test/new-dir");
-	xstat("dir-mtime-test", &st);
+	xmkdir("new-dir");
+	xstat_mtime_dir(&st);
 	if (!match_stat_data(&base, &st)) {
 		close(fd);
 		fputc('\n', stderr);
 		fprintf_ln(stderr, _("directory stat info does not change "
 				     "after adding a new directory"));
-		return 0;
+		goto done;
 	}
 	fill_stat_data(&base, &st);
 	fputc('.', stderr);
@@ -140,52 +155,57 @@ static int test_if_untracked_cache_is_supported(void)
 	avoid_racy();
 	write_or_die(fd, "data", 4);
 	close(fd);
-	xstat("dir-mtime-test", &st);
+	xstat_mtime_dir(&st);
 	if (match_stat_data(&base, &st)) {
 		fputc('\n', stderr);
 		fprintf_ln(stderr, _("directory stat info changes "
 				     "after updating a file"));
-		return 0;
+		goto done;
 	}
 	fputc('.', stderr);
 
 	avoid_racy();
-	close(create_file("dir-mtime-test/new-dir/new"));
-	xstat("dir-mtime-test", &st);
+	close(create_file("new-dir/new"));
+	xstat_mtime_dir(&st);
 	if (match_stat_data(&base, &st)) {
 		fputc('\n', stderr);
 		fprintf_ln(stderr, _("directory stat info changes after "
 				     "adding a file inside subdirectory"));
-		return 0;
+		goto done;
 	}
 	fputc('.', stderr);
 
 	avoid_racy();
-	xunlink("dir-mtime-test/newfile");
-	xstat("dir-mtime-test", &st);
+	xunlink("newfile");
+	xstat_mtime_dir(&st);
 	if (!match_stat_data(&base, &st)) {
 		fputc('\n', stderr);
 		fprintf_ln(stderr, _("directory stat info does not "
 				     "change after deleting a file"));
-		return 0;
+		goto done;
 	}
 	fill_stat_data(&base, &st);
 	fputc('.', stderr);
 
 	avoid_racy();
-	xunlink("dir-mtime-test/new-dir/new");
-	xrmdir("dir-mtime-test/new-dir");
-	xstat("dir-mtime-test", &st);
+	xunlink("new-dir/new");
+	xrmdir("new-dir");
+	xstat_mtime_dir(&st);
 	if (!match_stat_data(&base, &st)) {
 		fputc('\n', stderr);
 		fprintf_ln(stderr, _("directory stat info does not "
 				     "change after deleting a directory"));
-		return 0;
+		goto done;
 	}
 
-	xrmdir("dir-mtime-test");
+	if (rmdir(mtime_dir.buf))
+		die_errno(_("failed to delete directory %s"), mtime_dir.buf);
 	fprintf_ln(stderr, _(" OK"));
-	return 1;
+	ret = 1;
+
+done:
+	strbuf_release(&mtime_dir);
+	return ret;
 }
 
 static int mark_ce_flags(const char *path, int flag, int mark)
-- 8< --
Previous: Junio C HamanoNext: Junio C Hamano
Message 25 of 34 in “nd/untracked-cache update”
  1. 00/24 nd/untracked-cache updateNguyễn Thái Ngọc Duy, Jan 20, 2015
  2. 01/24 dir.c: optionally compute sha-1 of a .gitignore fileNguyễn Thái Ngọc Duy, Jan 20, 2015
  3. 02/24 untracked cache: record .gitignore information and dir hierarchyNguyễn Thái Ngọc Duy, Jan 20, 2015
  4. 03/24 untracked cache: initial untracked cache validationNguyễn Thái Ngọc Duy, Jan 20, 2015
  5. 04/24 untracked cache: invalidate dirs recursively if .gitignore changesNguyễn Thái Ngọc Duy, Jan 20, 2015
  6. 05/24 untracked cache: make a wrapper around {open,read,close}dir()Nguyễn Thái Ngọc Duy, Jan 20, 2015
  7. 06/24 untracked cache: record/validate dir mtime and reuse cached outputNguyễn Thái Ngọc Duy, Jan 20, 2015
  8. 07/24 untracked cache: mark what dirs should be recursed/savedNguyễn Thái Ngọc Duy, Jan 20, 2015
  9. 08/24 untracked cache: don't open non-existent .gitignoreNguyễn Thái Ngọc Duy, Jan 20, 2015
  10. 09/24 ewah: add convenient wrapper ewah_serialize_strbuf()Nguyễn Thái Ngọc Duy, Jan 20, 2015
  11. 10/24 untracked cache: save to an index extensionNguyễn Thái Ngọc Duy, Jan 20, 2015
  12. 11/24 untracked cache: load from UNTR index extensionNguyễn Thái Ngọc Duy, Jan 20, 2015
  13. 12/24 untracked cache: invalidate at index addition or removalNguyễn Thái Ngọc Duy, Jan 20, 2015
  14. 13/24 read-cache.c: split racy stat test to a separate functionNguyễn Thái Ngọc Duy, Jan 20, 2015
  15. 14/24 untracked cache: avoid racy timestampsNguyễn Thái Ngọc Duy, Jan 20, 2015
  16. 15/24 untracked cache: print stats with $GIT_TRACE_UNTRACKED_STATSNguyễn Thái Ngọc Duy, Jan 20, 2015
  17. 16/24 untracked cache: mark index dirty if untracked cache is updatedNguyễn Thái Ngọc Duy, Jan 20, 2015
  18. 17/24 untracked-cache: temporarily disable with $GIT_DISABLE_UNTRACKED_CACHENguyễn Thái Ngọc Duy, Jan 20, 2015
  19. 18/24 status: enable untracked cacheNguyễn Thái Ngọc Duy, Jan 20, 2015
  20. 19/24 update-index: manually enable or disable untracked cacheNguyễn Thái Ngọc Duy, Jan 20, 2015
  21. 20/24 update-index: test the system before enabling untracked cacheNguyễn Thái Ngọc Duy, Jan 20, 2015
  22. Junio C HamanoJan 21, 2015
  23. Duy NguyenJan 21, 2015
  24. Junio C HamanoJan 21, 2015
  25. Duy NguyenJan 22, 2015
  26. Junio C HamanoJan 22, 2015
  27. Duy NguyenJan 24, 2015
  28. 21/24 t7063: tests for untracked cacheNguyễn Thái Ngọc Duy, Jan 20, 2015
  29. 22/24 mingw32: add uname()Nguyễn Thái Ngọc Duy, Jan 20, 2015
  30. 23/24 untracked cache: guard and disable on system changesNguyễn Thái Ngọc Duy, Jan 20, 2015
  31. 24/24 git-status.txt: advertisement for untracked cacheNguyễn Thái Ngọc Duy, Jan 20, 2015
  32. brian m. carlsonJan 22, 2015
  33. Torsten BögershausenJan 20, 2015
  34. Duy NguyenJan 21, 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.