266 lines
7.5 KiB
Diff
266 lines
7.5 KiB
Diff
From 04810fdebbf3cfd509cec1e7103de502e3193970 Mon Sep 17 00:00:00 2001
|
|
From: Elijah Newren <newren@gmail.com>
|
|
Date: Thu, 27 May 2021 04:53:56 +0000
|
|
Subject: [PATCH] dir: introduce readdir_skip_dot_and_dotdot() helper
|
|
|
|
Many places in the code were doing
|
|
while ((d = readdir(dir)) != NULL) {
|
|
if (is_dot_or_dotdot(d->d_name))
|
|
continue;
|
|
...process d...
|
|
}
|
|
Introduce a readdir_skip_dot_and_dotdot() helper to make that a one-liner:
|
|
while ((d = readdir_skip_dot_and_dotdot(dir)) != NULL) {
|
|
...process d...
|
|
}
|
|
|
|
This helper particularly simplifies checks for empty directories.
|
|
|
|
Also use this helper in read_cached_dir() so that our statistics are
|
|
consistent across platforms. (In other words, read_cached_dir() should
|
|
have been using is_dot_or_dotdot() and skipping such entries, but did
|
|
not and left it to treat_path() to detect and mark such entries as
|
|
path_none.)
|
|
|
|
Signed-off-by: Elijah Newren <newren@gmail.com>
|
|
Signed-off-by: Junio C Hamano <gitster@pobox.com>
|
|
Signed-off-by: qiaojijun <qiaojijun@kylinos.cn>
|
|
---
|
|
builtin/clean.c | 4 +---
|
|
builtin/worktree.c | 4 +---
|
|
diff-no-index.c | 5 ++---
|
|
dir.c | 25 ++++++++++++++++---------
|
|
dir.h | 2 ++
|
|
entry.c | 5 +----
|
|
notes-merge.c | 5 +----
|
|
packfile.c | 5 +----
|
|
rerere.c | 4 +---
|
|
worktree.c | 12 +++---------
|
|
10 files changed, 29 insertions(+), 42 deletions(-)
|
|
|
|
diff --git a/builtin/clean.c b/builtin/clean.c
|
|
index 4ca12bc..e9d4021 100644
|
|
--- a/builtin/clean.c
|
|
+++ b/builtin/clean.c
|
|
@@ -189,10 +189,8 @@ static int remove_dirs(struct strbuf *path, const char *prefix, int force_flag,
|
|
strbuf_complete(path, '/');
|
|
|
|
len = path->len;
|
|
- while ((e = readdir(dir)) != NULL) {
|
|
+ while ((e = readdir_skip_dot_and_dotdot(dir)) != NULL) {
|
|
struct stat st;
|
|
- if (is_dot_or_dotdot(e->d_name))
|
|
- continue;
|
|
|
|
strbuf_setlen(path, len);
|
|
strbuf_addstr(path, e->d_name);
|
|
diff --git a/builtin/worktree.c b/builtin/worktree.c
|
|
index d99db35..3be644e 100644
|
|
--- a/builtin/worktree.c
|
|
+++ b/builtin/worktree.c
|
|
@@ -140,9 +140,7 @@ static void prune_worktrees(void)
|
|
struct dirent *d;
|
|
if (!dir)
|
|
return;
|
|
- while ((d = readdir(dir)) != NULL) {
|
|
- if (is_dot_or_dotdot(d->d_name))
|
|
- continue;
|
|
+ while ((d = readdir_skip_dot_and_dotdot(dir)) != NULL) {
|
|
strbuf_reset(&reason);
|
|
if (!prune_worktree(d->d_name, &reason))
|
|
continue;
|
|
diff --git a/diff-no-index.c b/diff-no-index.c
|
|
index 7814eab..e5cc878 100644
|
|
--- a/diff-no-index.c
|
|
+++ b/diff-no-index.c
|
|
@@ -26,9 +26,8 @@ static int read_directory_contents(const char *path, struct string_list *list)
|
|
if (!(dir = opendir(path)))
|
|
return error("Could not open directory %s", path);
|
|
|
|
- while ((e = readdir(dir)))
|
|
- if (!is_dot_or_dotdot(e->d_name))
|
|
- string_list_insert(list, e->d_name);
|
|
+ while ((e = readdir_skip_dot_and_dotdot(dir)))
|
|
+ string_list_insert(list, e->d_name);
|
|
|
|
closedir(dir);
|
|
return 0;
|
|
diff --git a/dir.c b/dir.c
|
|
index d97e955..bc7a6df 100644
|
|
--- a/dir.c
|
|
+++ b/dir.c
|
|
@@ -54,6 +54,17 @@ static enum path_treatment read_directory_recursive(struct dir_struct *dir,
|
|
static int resolve_dtype(int dtype, struct index_state *istate,
|
|
const char *path, int len);
|
|
|
|
+struct dirent *readdir_skip_dot_and_dotdot(DIR *dirp)
|
|
+{
|
|
+ struct dirent *e;
|
|
+
|
|
+ while ((e = readdir(dirp)) != NULL) {
|
|
+ if (!is_dot_or_dotdot(e->d_name))
|
|
+ break;
|
|
+ }
|
|
+ return e;
|
|
+}
|
|
+
|
|
int count_slashes(const char *s)
|
|
{
|
|
int cnt = 0;
|
|
@@ -2287,7 +2298,7 @@ static int read_cached_dir(struct cached_dir *cdir)
|
|
struct dirent *de;
|
|
|
|
if (cdir->fdir) {
|
|
- de = readdir(cdir->fdir);
|
|
+ de = readdir_skip_dot_and_dotdot(cdir->fdir);
|
|
if (!de) {
|
|
cdir->d_name = NULL;
|
|
cdir->d_type = DT_UNKNOWN;
|
|
@@ -2856,11 +2867,9 @@ int is_empty_dir(const char *path)
|
|
if (!dir)
|
|
return 0;
|
|
|
|
- while ((e = readdir(dir)) != NULL)
|
|
- if (!is_dot_or_dotdot(e->d_name)) {
|
|
- ret = 0;
|
|
- break;
|
|
- }
|
|
+ e = readdir_skip_dot_and_dotdot(dir);
|
|
+ if (e)
|
|
+ ret = 0;
|
|
|
|
closedir(dir);
|
|
return ret;
|
|
@@ -2900,10 +2909,8 @@ static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up)
|
|
strbuf_complete(path, '/');
|
|
|
|
len = path->len;
|
|
- while ((e = readdir(dir)) != NULL) {
|
|
+ while ((e = readdir_skip_dot_and_dotdot(dir)) != NULL) {
|
|
struct stat st;
|
|
- if (is_dot_or_dotdot(e->d_name))
|
|
- continue;
|
|
|
|
strbuf_setlen(path, len);
|
|
strbuf_addstr(path, e->d_name);
|
|
diff --git a/dir.h b/dir.h
|
|
index 5855c06..8c12d1f 100644
|
|
--- a/dir.h
|
|
+++ b/dir.h
|
|
@@ -339,6 +339,8 @@ struct dir_struct {
|
|
unsigned unmanaged_exclude_files;
|
|
};
|
|
|
|
+struct dirent *readdir_skip_dot_and_dotdot(DIR *dirp);
|
|
+
|
|
/*Count the number of slashes for string s*/
|
|
int count_slashes(const char *s);
|
|
|
|
diff --git a/entry.c b/entry.c
|
|
index 00b4903..365ece0 100644
|
|
--- a/entry.c
|
|
+++ b/entry.c
|
|
@@ -56,12 +56,9 @@ static void remove_subtree(struct strbuf *path)
|
|
|
|
if (!dir)
|
|
die_errno("cannot opendir '%s'", path->buf);
|
|
- while ((de = readdir(dir)) != NULL) {
|
|
+ while ((de = readdir_skip_dot_and_dotdot(dir)) != NULL) {
|
|
struct stat st;
|
|
|
|
- if (is_dot_or_dotdot(de->d_name))
|
|
- continue;
|
|
-
|
|
strbuf_addch(path, '/');
|
|
strbuf_addstr(path, de->d_name);
|
|
if (lstat(path->buf, &st))
|
|
diff --git a/notes-merge.c b/notes-merge.c
|
|
index 2fe724f..efd2014 100644
|
|
--- a/notes-merge.c
|
|
+++ b/notes-merge.c
|
|
@@ -695,13 +695,10 @@ int notes_merge_commit(struct notes_merge_options *o,
|
|
|
|
strbuf_addch(&path, '/');
|
|
baselen = path.len;
|
|
- while ((e = readdir(dir)) != NULL) {
|
|
+ while ((e = readdir_skip_dot_and_dotdot(dir)) != NULL) {
|
|
struct stat st;
|
|
struct object_id obj_oid, blob_oid;
|
|
|
|
- if (is_dot_or_dotdot(e->d_name))
|
|
- continue;
|
|
-
|
|
if (get_oid_hex(e->d_name, &obj_oid)) {
|
|
if (o->verbosity >= 3)
|
|
printf("Skipping non-SHA1 entry '%s%s'\n",
|
|
diff --git a/packfile.c b/packfile.c
|
|
index f4e7529..45ff52e 100644
|
|
--- a/packfile.c
|
|
+++ b/packfile.c
|
|
@@ -817,10 +817,7 @@ void for_each_file_in_pack_dir(const char *objdir,
|
|
}
|
|
strbuf_addch(&path, '/');
|
|
dirnamelen = path.len;
|
|
- while ((de = readdir(dir)) != NULL) {
|
|
- if (is_dot_or_dotdot(de->d_name))
|
|
- continue;
|
|
-
|
|
+ while ((de = readdir_skip_dot_and_dotdot(dir)) != NULL) {
|
|
strbuf_setlen(&path, dirnamelen);
|
|
strbuf_addstr(&path, de->d_name);
|
|
|
|
diff --git a/rerere.c b/rerere.c
|
|
index 9281131..26fb967 100644
|
|
--- a/rerere.c
|
|
+++ b/rerere.c
|
|
@@ -1198,13 +1198,11 @@ void rerere_gc(struct repository *r, struct string_list *rr)
|
|
if (!dir)
|
|
die_errno(_("unable to open rr-cache directory"));
|
|
/* Collect stale conflict IDs ... */
|
|
- while ((e = readdir(dir))) {
|
|
+ while ((e = readdir_skip_dot_and_dotdot(dir))) {
|
|
struct rerere_dir *rr_dir;
|
|
struct rerere_id id;
|
|
int now_empty;
|
|
|
|
- if (is_dot_or_dotdot(e->d_name))
|
|
- continue;
|
|
rr_dir = find_rerere_dir(e->d_name);
|
|
if (!rr_dir)
|
|
continue; /* or should we remove e->d_name? */
|
|
diff --git a/worktree.c b/worktree.c
|
|
index ee82235..45c2912 100644
|
|
--- a/worktree.c
|
|
+++ b/worktree.c
|
|
@@ -146,10 +146,8 @@ struct worktree **get_worktrees(unsigned flags)
|
|
dir = opendir(path.buf);
|
|
strbuf_release(&path);
|
|
if (dir) {
|
|
- while ((d = readdir(dir)) != NULL) {
|
|
+ while ((d = readdir_skip_dot_and_dotdot(dir)) != NULL) {
|
|
struct worktree *linked = NULL;
|
|
- if (is_dot_or_dotdot(d->d_name))
|
|
- continue;
|
|
|
|
if ((linked = get_linked_worktree(d->d_name))) {
|
|
ALLOC_GROW(list, counter + 1, alloc);
|
|
@@ -492,13 +490,9 @@ int submodule_uses_worktrees(const char *path)
|
|
if (!dir)
|
|
return 0;
|
|
|
|
- while ((d = readdir(dir)) != NULL) {
|
|
- if (is_dot_or_dotdot(d->d_name))
|
|
- continue;
|
|
-
|
|
+ d = readdir_skip_dot_and_dotdot(dir);
|
|
+ if (d != NULL)
|
|
ret = 1;
|
|
- break;
|
|
- }
|
|
closedir(dir);
|
|
return ret;
|
|
}
|
|
--
|
|
2.20.1
|
|
|