From: Junio C Hamano <gitster@pobox.com>
To: git@vger.kernel.org
Subject: [PATCH] checkout: most of the time we have good leading directories
Date: Thu, 07 Nov 2013 16:30:14 -0800 [thread overview]
Message-ID: <xmqqy54zohux.fsf@gitster.dls.corp.google.com> (raw)
When "git checkout" wants to create a path, e.g. a/b/c/d/e, after
seeing if the entire thing already exists (in which case we check if
that is up-to-date and do not bother to check it out, or we unlink
and recreate it), we validate that the leading directory path is
without funny symlinks by seeing a/, a/b/, a/b/c/ and then a/b/c/d/
are all without funny symlinks, by calling has_dirs_only_path() in
this order.
When we are checking out many files (imagine: initial checkout),
however, it is likely that an earlier checkout would have already
made sure that the leading directory a/b/c/d/ is in good order; by
first checking the whole path a/b/c/d/ first, we can often bypass
calls to has_dirs_only_path() for leading part.
This cuts down the number of calls to has_dirs_only_path() for
checking out Linux kernel sources afresh from 190k down to 98k.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
* Just a random experimental change I was playing with today,
looking for low hanging fruits before having to thread the entire
checkout codepath.
entry.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/entry.c b/entry.c
index 7b7aa81..e2c0ac6 100644
--- a/entry.c
+++ b/entry.c
@@ -6,9 +6,17 @@
static void create_directories(const char *path, int path_len,
const struct checkout *state)
{
- char *buf = xmalloc(path_len + 1);
- int len = 0;
+ char *buf;
+ int len;
+
+ for (len = path_len - 1; 0 <= len; len--)
+ if (path[len] == '/')
+ break;
+ if (has_dirs_only_path(path, len, state->base_dir_len))
+ return; /* ok, we have the whole leading directory */
+ buf = xmalloc(path_len + 1);
+ len = 0;
while (len < path_len) {
do {
buf[len] = path[len];
next reply other threads:[~2013-11-08 0:30 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-08 0:30 Junio C Hamano [this message]
2013-11-09 14:24 ` [PATCH] checkout: most of the time we have good leading directories Thomas Rast
2013-11-09 20:09 ` Junio C Hamano
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=xmqqy54zohux.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.