зеркало из https://github.com/microsoft/git.git
Introduce the function strip_path_suffix()
The function strip_path_suffix() will try to strip a given suffix from a given path. The suffix must start at a directory boundary (i.e. "core" is not a path suffix of "libexec/git-core", but "git-core" is). Arbitrary runs of directory separators ("slashes") are assumed identical. Example: strip_path_suffix("C:\\msysgit/\\libexec\\git-core", "libexec///git-core", &prefix) will set prefix to "C:\\msysgit" and return 0. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Acked-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
25487f8e2a
Коммит
4fcc86b07d
1
cache.h
1
cache.h
|
@ -626,6 +626,7 @@ const char *make_nonrelative_path(const char *path);
|
|||
const char *make_relative_path(const char *abs, const char *base);
|
||||
int normalize_path_copy(char *dst, const char *src);
|
||||
int longest_ancestor_length(const char *path, const char *prefix_list);
|
||||
char *strip_path_suffix(const char *path, const char *suffix);
|
||||
|
||||
/* Read and unpack a sha1 file into memory, write memory to a sha1 file */
|
||||
extern int sha1_object_info(const unsigned char *, unsigned long *);
|
||||
|
|
36
path.c
36
path.c
|
@ -499,3 +499,39 @@ int longest_ancestor_length(const char *path, const char *prefix_list)
|
|||
|
||||
return max_len;
|
||||
}
|
||||
|
||||
/* strip arbitrary amount of directory separators at end of path */
|
||||
static inline int chomp_trailing_dir_sep(const char *path, int len)
|
||||
{
|
||||
while (len && is_dir_sep(path[len - 1]))
|
||||
len--;
|
||||
return len;
|
||||
}
|
||||
|
||||
/*
|
||||
* If path ends with suffix (complete path components), returns the
|
||||
* part before suffix (sans trailing directory separators).
|
||||
* Otherwise returns NULL.
|
||||
*/
|
||||
char *strip_path_suffix(const char *path, const char *suffix)
|
||||
{
|
||||
int path_len = strlen(path), suffix_len = strlen(suffix);
|
||||
|
||||
while (suffix_len) {
|
||||
if (!path_len)
|
||||
return NULL;
|
||||
|
||||
if (is_dir_sep(path[path_len - 1])) {
|
||||
if (!is_dir_sep(suffix[suffix_len - 1]))
|
||||
return NULL;
|
||||
path_len = chomp_trailing_dir_sep(path, path_len);
|
||||
suffix_len = chomp_trailing_dir_sep(suffix, suffix_len);
|
||||
}
|
||||
else if (path[--path_len] != suffix[--suffix_len])
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (path_len && !is_dir_sep(path[path_len - 1]))
|
||||
return NULL;
|
||||
return xstrndup(path, chomp_trailing_dir_sep(path, path_len));
|
||||
}
|
||||
|
|
|
@ -85,4 +85,8 @@ ancestor /foo/bar :://foo/.:: 4
|
|||
ancestor /foo/bar //foo/./::/bar 4
|
||||
ancestor /foo/bar ::/bar -1
|
||||
|
||||
test_expect_success 'strip_path_suffix' '
|
||||
test c:/msysgit = $(test-path-utils strip_path_suffix \
|
||||
c:/msysgit/libexec//git-core libexec/git-core)
|
||||
'
|
||||
test_done
|
||||
|
|
|
@ -26,6 +26,12 @@ int main(int argc, char **argv)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (argc == 4 && !strcmp(argv[1], "strip_path_suffix")) {
|
||||
char *prefix = strip_path_suffix(argv[2], argv[3]);
|
||||
printf("%s\n", prefix ? prefix : "(null)");
|
||||
return 0;
|
||||
}
|
||||
|
||||
fprintf(stderr, "%s: unknown function name: %s\n", argv[0],
|
||||
argv[1] ? argv[1] : "(there was none)");
|
||||
return 1;
|
||||
|
|
Загрузка…
Ссылка в новой задаче