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

[PATCH] Add remove_path: a function to remove as much as possible of a path

From
Alex Riesen <raa.lkml@gmail.com>
Date
Sep 26, 2008, 22:56 UTC
Message-ID
<20080926225645.GA13412@blimp.localhost>
In-Reply-To
<20080926152823.GA17470@spearce.org>

The function has two potential users which both managed to get wrong their implementations (the one in builtin-rm.c one has a memleak, and builtin-merge-recursive.c scribles over its const argument).

Signed-off-by: Alex Riesen <raa.lkml@gmail.com>
---
Shawn O. Pearce, Fri, Sep 26, 2008 17:28:23 +0200:
Show 12 quoted lines
> Alex Riesen <raa.lkml@gmail.com> wrote:
> > It is the same as in merge-recursive, but they're so small so unless
> > we get a special file with such random routines there is no much point
> > exporting it. Actually, we do seem to have such a file: dir.c. It is
> > already plagued by file_exists kind of things, why not remove_path...
> 
> Yea.  I'm thinking remove_path should migrate to dir.c.  Hell,
> we already have rm -rf as remove_dir_recursively() in dir.c.
> remove_path is its long-lost soul mate.  I'm not applying this
> builtin-rm fix, and am hoping you'll rewrite it around a move
> of remove_path to dir.c...  ;-)
>  

Okay :) The next one is on top of the previous fix in merge-recursive (removes ENOENT conditional)

 dir.c |   20 ++++++++++++++++++++
 dir.h |    3 +++
 2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/dir.c b/dir.c
index acf1001..1c3c501 100644
--- a/dir.c
+++ b/dir.c
@@ -831,3 +831,23 @@ void setup_standard_excludes(struct dir_struct *dir)
 	if (excludes_file && !access(excludes_file, R_OK))
 		add_excludes_from_file(dir, excludes_file);
 }
+
+int remove_path(const char *name)
+{
+	char *slash;
+
+	if (unlink(name) && errno != ENOENT)
+		return -1;
+
+	slash = strrchr(name, '/');
+	if (slash) {
+		char *dirs = xstrdup(name);
+		slash = dirs + (slash - name);
+		do {
+			*slash = '\0';
+		} while (rmdir(dirs) && (slash = strrchr(dirs, '/')));
+		free(dirs);
+	}
+	return 0;
+}
+
diff --git a/dir.h b/dir.h
index 2df15de..278ee42 100644
--- a/dir.h
+++ b/dir.h
@@ -81,4 +81,7 @@ extern int is_inside_dir(const char *dir);
 extern void setup_standard_excludes(struct dir_struct *dir);
 extern int remove_dir_recursively(struct strbuf *path, int only_empty);
 
+/* tries to remove the path with empty directories along it, ignores ENOENT */
+extern int remove_path(const char *path);
+
 #endif
-- 
1.6.0.2.328.g14651
Previous: Shawn O. PearceNext: Alex Riesen
Message 6 of 10 in “[BUG] git merge does not prune empty directories”
  1. Anders MelchiorsenSep 24, 2008
  2. Remove empty directories in recursive mergeAlex Riesen, Sep 25, 2008
  3. Cleanup remove_pathAlex Riesen, Sep 25, 2008
  4. Fix memleak and the implementation of remove_file in builtin-rm.cAlex Riesen, Sep 25, 2008
  5. Shawn O. PearceSep 26, 2008
  6. Add remove_path: a function to remove as much as possible of a pathAlex Riesen, Sep 26, 2008
  7. Use remove_path from dir.c instead of own implementationAlex Riesen, Sep 26, 2008
  8. Alex RiesenSep 25, 2008
  9. Shawn O. PearceSep 26, 2008
  10. Johannes SixtSep 26, 2008

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.