[Pkg-owncloud-commits] [owncloud-client] 114/484: csync_exclude: Optimize
Sandro Knauß
hefee-guest at moszumanska.debian.org
Wed Dec 16 00:37:24 UTC 2015
This is an automated email from the git hooks/post-receive script.
hefee-guest pushed a commit to branch master
in repository owncloud-client.
commit de5de7acc57875e70997f7aff16a396ee9c5c6ad
Author: Olivier Goffart <ogoffart at woboq.com>
Date: Tue Oct 20 16:46:27 2015 +0200
csync_exclude: Optimize
Avoid alocations as much as possible
---
csync/src/csync_exclude.c | 64 ++++++++++++++++++++++++++++-------------------
1 file changed, 38 insertions(+), 26 deletions(-)
diff --git a/csync/src/csync_exclude.c b/csync/src/csync_exclude.c
index c673aff..9e1c80b 100644
--- a/csync/src/csync_exclude.c
+++ b/csync/src/csync_exclude.c
@@ -264,40 +264,41 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(c_strlist_t *excludes, const ch
goto out;
}
- /* Build a list of path components to check. */
- c_strlist_t *path_components = c_strlist_new(32);
- char *path_split = strdup(path);
- size_t len = strlen(path_split);
- for (i = len; ; --i) {
- // read backwards until a path separator is found
- if (i != 0 && path_split[i-1] != '/') {
- continue;
- }
+ c_strlist_t *path_components = NULL;
+ if (check_leading_dirs) {
+ /* Build a list of path components to check. */
+ path_components = c_strlist_new(32);
+ char *path_split = strdup(path);
+ size_t len = strlen(path_split);
+ for (i = len; ; --i) {
+ // read backwards until a path separator is found
+ if (i != 0 && path_split[i-1] != '/') {
+ continue;
+ }
- // check 'basename', i.e. for "/foo/bar/fi" we'd check 'fi', 'bar', 'foo'
- if (path_split[i] != 0) {
- c_strlist_add_grow(&path_components, path_split + i);
- }
+ // check 'basename', i.e. for "/foo/bar/fi" we'd check 'fi', 'bar', 'foo'
+ if (path_split[i] != 0) {
+ c_strlist_add_grow(&path_components, path_split + i);
+ }
- if (i == 0 || !check_leading_dirs) {
- break;
- }
+ if (i == 0) {
+ break;
+ }
- // check 'dirname', i.e. for "/foo/bar/fi" we'd check '/foo/bar', '/foo'
- path_split[i-1] = '\0';
- c_strlist_add_grow(&path_components, path_split);
+ // check 'dirname', i.e. for "/foo/bar/fi" we'd check '/foo/bar', '/foo'
+ path_split[i-1] = '\0';
+ c_strlist_add_grow(&path_components, path_split);
+ }
+ SAFE_FREE(path_split);
}
- SAFE_FREE(path_split);
/* Loop over all exclude patterns and evaluate the given path */
for (i = 0; match == CSYNC_NOT_EXCLUDED && i < excludes->count; i++) {
bool match_dirs_only = false;
- char *pattern_stored = c_strdup(excludes->vector[i]);
- char* pattern = pattern_stored;
+ char *pattern = excludes->vector[i];
type = CSYNC_FILE_EXCLUDE_LIST;
- if (strlen(pattern) < 1) {
- SAFE_FREE(pattern_stored);
+ if (!pattern[0]) { /* empty pattern */
continue;
}
/* Excludes starting with ']' means it can be cleanup */
@@ -309,6 +310,9 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(c_strlist_t *excludes, const ch
}
/* Check if the pattern applies to pathes only. */
if (pattern[strlen(pattern)-1] == '/') {
+ if (!check_leading_dirs && filetype == CSYNC_FTW_TYPE_FILE) {
+ continue;
+ }
match_dirs_only = true;
pattern[strlen(pattern)-1] = '\0'; /* Cut off the slash */
}
@@ -326,7 +330,7 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(c_strlist_t *excludes, const ch
}
/* if still not excluded, check each component and leading directory of the path */
- if (match == CSYNC_NOT_EXCLUDED) {
+ if (match == CSYNC_NOT_EXCLUDED && check_leading_dirs) {
size_t j = 0;
if (match_dirs_only && filetype == CSYNC_FTW_TYPE_FILE) {
j = 1; // skip the first entry, which is bname
@@ -338,8 +342,16 @@ static CSYNC_EXCLUDE_TYPE _csync_excluded_common(c_strlist_t *excludes, const ch
break;
}
}
+ } else if (match == CSYNC_NOT_EXCLUDED && !check_leading_dirs) {
+ rc = csync_fnmatch(pattern, bname, 0);
+ if (rc == 0) {
+ match = type;
+ }
+ }
+ if (match_dirs_only) {
+ /* restore the '/' */
+ pattern[strlen(pattern)] = '/';
}
- SAFE_FREE(pattern_stored);
}
c_strlist_destroy(path_components);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-owncloud/owncloud-client.git
More information about the Pkg-owncloud-commits
mailing list