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

[PATCH 2/8] Add functions get_relative_cwd() and is_inside_dir()

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jul 27, 2007, 18:56 UTC
Message-ID
<Pine.LNX.4.64.0707271956140.14781@racer.site>
In-Reply-To
<Pine.LNX.4.64.0707271851370.14781@racer.site>

The function get_relative_cwd() works just as getcwd(), only that it takes an absolute path as additional parameter, returning the prefix of the current working directory relative to the given path. If the cwd is no subdirectory of the given path, it returns NULL.

is_inside_dir() is just a trivial wrapper over get_relative_cwd().
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
	This patch should be the same as I sent out earlier.  Just to
	make sure that you get the correct version, I send it again.
 dir.c |   30 ++++++++++++++++++++++++++++++
 dir.h |    3 +++
 2 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/dir.c b/dir.c
index 8d8faf5..c16a004 100644
--- a/dir.c
+++ b/dir.c
@@ -642,3 +642,33 @@ file_exists(const char *f)
   struct stat sb;
   return stat(f, &sb) == 0;
 }
+
+char *get_relative_cwd(char *buffer, int size, const char *dir)
+{
+	char *cwd = buffer;
+
+	if (!dir)
+		return 0;
+
+	if (!getcwd(buffer, PATH_MAX))
+		return 0;
+
+	if (!is_absolute_path(dir))
+		dir = make_absolute_path(dir);
+
+	while (*dir && *dir == *cwd) {
+		dir++;
+		cwd++;
+	}
+	if (*dir)
+		return NULL;
+	if (*cwd == '/')
+		return cwd + 1;
+	return cwd;
+}
+
+int is_inside_dir(const char *dir)
+{
+	char buffer[PATH_MAX];
+	return get_relative_cwd(buffer, sizeof(buffer), dir) != NULL;
+}
diff --git a/dir.h b/dir.h
index ec0e8ab..f55a87b 100644
--- a/dir.h
+++ b/dir.h
@@ -61,4 +61,7 @@ extern void add_exclude(const char *string, const char *base,
 extern int file_exists(const char *);
 extern struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int len);
 
+extern char *get_relative_cwd(char *buffer, int size, const char *dir);
+extern int is_inside_dir(const char *dir);
+
 #endif
-- 
1.5.3.rc3.18.g49a1
Previous: Johannes SchindelinNext: Junio C Hamano
Message 5 of 30 in “work-tree cleanups”
  1. 0/8 work-tree cleanupsJohannes Schindelin, Jul 27, 2007
  2. 1/8 Add is_absolute_path() and make_absolute_path()Johannes Schindelin, Jul 27, 2007
  3. Junio C HamanoJul 27, 2007
  4. Johannes SchindelinJul 28, 2007
  5. 2/8 Add functions get_relative_cwd() and is_inside_dir()Johannes Schindelin, Jul 27, 2007
  6. Junio C HamanoJul 27, 2007
  7. Johannes SchindelinJul 28, 2007
  8. 3/8 Clean up work-tree handlingJohannes Schindelin, Jul 27, 2007
  9. Junio C HamanoJul 27, 2007
  10. Johannes SchindelinJul 28, 2007
  11. Junio C HamanoJul 28, 2007
  12. Johannes SchindelinJul 28, 2007
  13. Junio C HamanoJul 28, 2007
  14. Johannes SchindelinJul 28, 2007
  15. Junio C HamanoJul 28, 2007
  16. Johannes SchindelinJul 28, 2007
  17. Johannes SchindelinJul 29, 2007
  18. Junio C HamanoJul 29, 2007
  19. Johannes SchindelinJul 29, 2007
  20. 4/8 Add set_git_dir() functionJohannes Schindelin, Jul 27, 2007
  21. 5/8 work-trees are allowed inside a git-dirJohannes Schindelin, Jul 27, 2007
  22. Junio C HamanoJul 27, 2007
  23. Johannes SchindelinJul 28, 2007
  24. Junio C HamanoJul 28, 2007
  25. Johannes SchindelinJul 28, 2007
  26. 6/8 init: use get_git_work_tree() instead of rolling our ownJohannes Schindelin, Jul 27, 2007
  27. 7/8 Make t1501 a little saner, and fix itJohannes Schindelin, Jul 27, 2007
  28. 8/8 Fix t1500 for sane work-tree behaviorJohannes Schindelin, Jul 27, 2007
  29. Junio C HamanoJul 27, 2007
  30. Johannes SchindelinJul 28, 2007

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.