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;
next prev 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).