git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Johannes Schindelin <Johannes.Schindelin@gmx.de>
To: Tomash Brechko <tomash.brechko@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: [RFC PATCH] Re: Empty directories...
Date: Thu, 19 Jul 2007 13:16:26 +0100 (BST)	[thread overview]
Message-ID: <Pine.LNX.4.64.0707191310430.14781@racer.site> (raw)
In-Reply-To: <20070719105105.GA4929@moonlight.home>

Hi,

On Thu, 19 Jul 2007, Tomash Brechko wrote:

> A year or so ago I too would strongly advocate the need of tracking 
> empty directories, permissions et al., it seemed so "natural" and "plain 
> obvious" to me back then.  But since that time I learned to appreciate 
> the "contents tracking" approach, and now view directories (paths in 
> general) only as the means for Git to know where to put the contents on 
> checkout.  This, BTW, is consistent with how Git figures container 
> copies/renames.

Thank you.  It is my impression, too, that after a while it becomes 
obvious what is good and what is not.

FWIW I just whipped up a proof-of-concept patch (so at least _I_ cannot be 
accused of chickening out of writing code):

This adds the command line option "--add-empty-dirs" to "git add", which 
does the only sane thing: putting a placeholder into that directory, and 
adding that.  Since ".gitignore" is already a reserved file name in git, 
it is used as the name of this place holder.

---

	It is probably not fool-proof yet, needs documentation and a test 
	case.  But I am really sick and tired of this discussion.

 builtin-add.c |   25 +++++++++++++++++++++----
 dir.c         |   16 +++++++++++++++-
 dir.h         |    3 ++-
 3 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/builtin-add.c b/builtin-add.c
index 7345479..1294840 100644
--- a/builtin-add.c
+++ b/builtin-add.c
@@ -47,7 +47,7 @@ static void prune_directory(struct dir_struct *dir, const char **pathspec, int p
 }
 
 static void fill_directory(struct dir_struct *dir, const char **pathspec,
-		int ignored_too)
+		int ignored_too, int substitute_empty_dirs)
 {
 	const char *path, *base;
 	int baselen;
@@ -63,6 +63,7 @@ static void fill_directory(struct dir_struct *dir, const char **pathspec,
 		if (!access(excludes_file, R_OK))
 			add_excludes_from_file(dir, excludes_file);
 	}
+	dir->substitute_empty_directories = substitute_empty_dirs;
 
 	/*
 	 * Calculate common prefix for the pathspec, and
@@ -143,7 +144,8 @@ static const char ignore_warning[] =
 int cmd_add(int argc, const char **argv, const char *prefix)
 {
 	int i, newfd;
-	int verbose = 0, show_only = 0, ignored_too = 0;
+	int verbose = 0, show_only = 0, ignored_too = 0,
+		substitute_empty_dirs = 0;
 	const char **pathspec;
 	struct dir_struct dir;
 	int add_interactive = 0;
@@ -191,6 +193,10 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 			take_worktree_changes = 1;
 			continue;
 		}
+		if (!strcmp(arg, "--add-empty-dirs")) {
+			substitute_empty_dirs = 1;
+			continue;
+		}
 		usage(builtin_add_usage);
 	}
 
@@ -206,7 +212,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 	}
 	pathspec = get_pathspec(prefix, argv + i);
 
-	fill_directory(&dir, pathspec, ignored_too);
+	fill_directory(&dir, pathspec, ignored_too, substitute_empty_dirs);
 
 	if (show_only) {
 		const char *sep = "", *eof = "";
@@ -231,8 +237,19 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 		exit(1);
 	}
 
-	for (i = 0; i < dir.nr; i++)
+	for (i = 0; i < dir.nr; i++) {
+		const char *name = dir.entries[i]->name;
+		const char *slash;
+		if (substitute_empty_dirs && (slash = strrchr(name, '/')) &&
+				!strcmp(slash, "/.gitignore") &&
+				access(name, R_OK)) {
+			int fd = open(name, O_WRONLY | O_CREAT | O_EXCL, 0666);
+			if (fd < 0)
+				return error("Could not create %s", name);
+			close(fd);
+		}
 		add_file_to_cache(dir.entries[i]->name, verbose);
+	}
 
  finish:
 	if (active_cache_changed) {
diff --git a/dir.c b/dir.c
index 8d8faf5..b0b4628 100644
--- a/dir.c
+++ b/dir.c
@@ -456,11 +456,11 @@ static int read_directory_recursive(struct dir_struct *dir, const char *path, co
 {
 	DIR *fdir = opendir(path);
 	int contents = 0;
+	char fullname[PATH_MAX + 1];
 
 	if (fdir) {
 		int exclude_stk;
 		struct dirent *de;
-		char fullname[PATH_MAX + 1];
 		memcpy(fullname, base, baselen);
 
 		exclude_stk = push_exclude_per_directory(dir, base, baselen);
@@ -536,6 +536,20 @@ exit_early:
 		pop_exclude_per_directory(dir, exclude_stk);
 	}
 
+	if (!contents && dir->substitute_empty_directories) {
+		const char *name = ".gitignore";
+		int len = strlen(name);
+		/* Ignore overly long pathnames! */
+		if (len + baselen + 8 > sizeof(fullname))
+			return 0;
+		memcpy(fullname + baselen, name, len+1);
+		if (simplify_away(fullname, baselen + len, simplify)
+				|| excluded(dir, fullname))
+			return 0;
+		dir_add_name(dir, fullname, baselen + len);
+		return 1;
+	}
+
 	return contents;
 }
 
diff --git a/dir.h b/dir.h
index ec0e8ab..0099718 100644
--- a/dir.h
+++ b/dir.h
@@ -34,7 +34,8 @@ struct dir_struct {
 		     show_other_directories:1,
 		     hide_empty_directories:1,
 		     no_gitlinks:1,
-		     collect_ignored:1;
+		     collect_ignored:1,
+		     substitute_empty_directories:1;
 	struct dir_entry **entries;
 	struct dir_entry **ignored;
 

  parent reply	other threads:[~2007-07-19 12:16 UTC|newest]

Thread overview: 137+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-07-18  0:13 Empty directories David Kastrup
2007-07-18  0:35 ` Johannes Schindelin
2007-07-18  6:07   ` David Kastrup
2007-07-18 10:26     ` Johannes Schindelin
     [not found]       ` <86tzs2m1h7.fsf@lola.quinscape.zz>
2007-07-18 11:24         ` Johannes Schindelin
2007-07-18 11:40           ` Matthieu Moy
2007-07-18 12:12             ` David Kastrup
2007-07-18 16:23     ` Linus Torvalds
2007-07-18 16:33       ` Linus Torvalds
2007-07-18 17:38         ` David Kastrup
2007-07-18 18:05           ` Linus Torvalds
2007-07-18 16:39       ` Matthieu Moy
2007-07-18 17:06         ` Linus Torvalds
2007-07-18 21:37           ` David Kastrup
2007-07-18 21:45             ` Linus Torvalds
2007-07-18 23:13               ` David Kastrup
2007-07-18 23:16               ` [RFC PATCH] " Linus Torvalds
2007-07-18 23:40                 ` Linus Torvalds
2007-07-18 23:42                 ` David Kastrup
2007-07-19  0:22                   ` Linus Torvalds
2007-07-19  5:28                     ` Junio C Hamano
2007-07-19  5:38                       ` Shawn O. Pearce
2007-07-19  6:08                         ` David Kastrup
2007-07-19  7:10                           ` Geoff Russell
2007-07-19  6:09                         ` Shawn O. Pearce
2007-07-19  8:13                           ` Matthieu Moy
2007-07-19 10:51                             ` Tomash Brechko
2007-07-19 11:31                               ` David Kastrup
2007-07-19 12:32                                 ` Tomash Brechko
2007-07-19 12:46                                   ` David Kastrup
2007-07-23 20:18                                     ` Nix
2007-07-23 20:49                                       ` David Kastrup
2007-07-23 21:49                                         ` Nix
2007-07-23 22:05                                           ` Nix
2007-07-23 22:52                                             ` Jakub Narebski
2007-07-25 22:43                                               ` Nix
2007-07-23 22:16                                           ` David Kastrup
2007-07-23 22:31                                             ` Linus Torvalds
2007-07-23 23:32                                               ` Nix
2007-07-23 23:57                                                 ` Linus Torvalds
     [not found]                                               ` <86ps2ithyl.fsf@lola.quinscape.zz>
2007-07-24  6:56                                                 ` Nix
2007-07-19 12:38                                 ` David Kastrup
2007-07-19 13:21                                   ` David Kastrup
2007-07-19 12:16                               ` Johannes Schindelin [this message]
2007-07-19 12:24                                 ` David Kastrup
2007-07-19 14:44                                   ` Brian Gernhardt
2007-07-19 15:43                                     ` Johannes Schindelin
2007-07-19 16:06                                       ` Brian Gernhardt
2007-07-19 16:17                                         ` Johannes Schindelin
2007-07-19 16:28                                           ` David Kastrup
2007-07-19 16:34                                           ` Brian Gernhardt
2007-07-19 17:30                                             ` Johannes Schindelin
     [not found]                                             ` <Pine.LNX.4.64.070719 1829530.14781@racer.site>
2007-07-19 17:47                                               ` David Kastrup
2007-07-19 16:17                                       ` Matthieu Moy
2007-07-19 16:21                                       ` David Kastrup
     [not found]                         ` <9436820E-53D1-425D-922E-D4C76578E40A@silverinsanity.com>
     [not found]                           ` <863azk78yp.fsf@lola.quinscape.zz>
2007-07-19 15:08                             ` Brian Gernhardt
2007-07-19 15:27                               ` David Kastrup
2007-07-19 15:50                                 ` Brian Gernhardt
2007-07-20  0:01                               ` Junio C Hamano
2007-07-20  0:15                                 ` Linus Torvalds
2007-07-20  0:33                                   ` Linus Torvalds
2007-07-20  2:24                                     ` Junio C Hamano
2007-07-20  2:31                                       ` Linus Torvalds
2007-07-20  5:55                                         ` David Kastrup
2007-07-20  5:58                                       ` David Kastrup
2007-07-20 15:31                                         ` Linus Torvalds
2007-07-20  5:35                                     ` David Kastrup
2007-07-20  9:27                                       ` Simon 'corecode' Schubert
2007-07-20 10:11                                         ` David Kastrup
2007-07-20 10:34                                         ` Junio C Hamano
2007-07-20 13:23                                           ` David Kastrup
2007-07-20 19:24                                           ` Linus Torvalds
2007-07-20 21:02                                             ` Johan Herland
2007-07-20 21:48                                               ` Linus Torvalds
2007-07-20 22:36                                                 ` Julian Phillips
2007-07-21  0:18                                                   ` Linus Torvalds
2007-07-21  1:23                                                     ` David Kastrup
2007-07-21  3:54                                                       ` David Kastrup
     [not found]                                     ` <7vir8f24o2.fsf@assigned -by-dhcp.cox.net>
2007-07-20  5:53                                       ` David Kastrup
2007-07-20 10:19                                   ` Olivier Galibert
2007-07-19  5:59                       ` David Kastrup
2007-07-19  9:54                         ` David Kastrup
     [not found]                   ` <?= =?ISO-8859-1?Q?alpine.LFD.0.999?= =?ISO-8859-1?Q?.070718=041710271.?= =?ISO-8859-1?Q?27353@woody.linu?= =?ISO-8859-1?Q?x-foundation.org?= =?ISO-8859-1?Q?>
2007-07-22 21:08                     ` David Kastrup
2007-07-21  4:29                 ` David Kastrup
2007-07-21  4:51                   ` Linus Torvalds
2007-07-21  5:08                     ` Linus Torvalds
2007-07-21  5:28                       ` David Kastrup
2007-07-21 15:53                         ` Linus Torvalds
2007-07-21 17:38                           ` David Kastrup
2007-07-21 17:52                             ` Simon 'corecode' Schubert
2007-07-21 18:08                               ` David Kastrup
2007-07-21 23:50                             ` Linus Torvalds
2007-07-22  0:18                               ` David Kastrup
2007-07-22  0:37                                 ` Linus Torvalds
2007-07-22  1:05                                   ` David Kastrup
2007-07-22  1:41                                     ` Linus Torvalds
2007-07-22  2:39                                       ` David Kastrup
2007-07-22  3:43                                         ` Linus Torvalds
2007-07-22  4:28                                           ` David Kastrup
2007-07-22  6:38                                             ` david
2007-07-22  9:08                                               ` David Kastrup
2007-07-22 17:30                                                 ` Linus Torvalds
2007-07-22 17:59                                                   ` David Kastrup
2007-07-22 17:28                                             ` Linus Torvalds
2007-07-22 17:33                                             ` Linus Torvalds
     [not found]                                             ` <alpine.L FD.0.999.0707221031050.3607@woody.linux-foundation.org>
2007-07-22 18:58                                               ` David Kastrup
2007-07-22  1:16                                 ` Jakub Narebski
2007-07-22  1:39                                   ` David Kastrup
2007-07-22 12:06                                     ` Jakub Narebski
2007-07-22 13:53                                       ` David Kastrup
2007-07-22 20:26                                         ` Jakub Narebski
2007-07-22 22:57                                           ` David Kastrup
2007-07-23  6:05                                             ` David Kastrup
2007-07-23  7:45                                               ` David Kastrup
2007-07-22  0:34                               ` David Kastrup
2007-07-22  4:00                             ` Brian Gernhardt
2007-07-28  8:44                       ` David Kastrup
     [not found]                   ` <?= =?ISO-8859-1?Q?alpine.LFD.0.999?= =?ISO-8859-1?Q?.07072=0402135450.?= =?ISO-8859-1?Q?27249@woody.linu?= =?ISO-8859-1?Q?x-foundation.org?= =?ISO-8859-1?Q?>
2007-07-21  5:15                     ` David Kastrup
2007-07-18 17:34       ` David Kastrup
2007-07-18  0:39 ` Matthieu Moy
2007-07-18  6:16   ` David Kastrup
2007-07-18  6:30     ` Shawn O. Pearce
2007-07-18  2:23 ` Junio C Hamano
2007-07-18  5:56   ` David Kastrup
2007-07-18  6:34     ` Wincent Colaiuta
2007-07-18  6:53     ` Junio C Hamano
     [not found]       ` <867ioyqhgc.fsf@lola.quinscape.zz>
2007-07-18 23:34         ` Junio C Hamano
2007-07-20  8:29       ` Johan Herland
2007-07-20  8:41         ` David Kastrup
2007-07-20 10:20           ` Johan Herland
2007-07-20 10:54             ` David Kastrup
2007-07-20 12:18               ` Johan Herland
     [not found]                 ` <86odi7utdj.fsf@lola.quinscape.zz>
2007-07-20 13:20                   ` Johan Herland
2007-07-20 13:33                     ` David Kastrup
2007-07-22 21:35       ` David Kastrup
2007-07-26 23:33 ` Robin Rosenberg
2007-07-27  5:22   ` David Kastrup

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.64.0707191310430.14781@racer.site \
    --to=johannes.schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=tomash.brechko@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).