• 大小: 5.46MB
    文件类型: .gz
    金币: 1
    下载: 0 次
    发布日期: 2023-09-18
  • 语言: 其他
  • 标签: git  

资源简介

git-2.7.2

资源截图

代码片段和文件信息

#include “cache.h“

/*
 * Do not use this for inspecting *tracked* content.  When path is a
 * symlink to a directory we do not want to say it is a directory when
 * dealing with tracked content in the working tree.
 */
int is_directory(const char *path)
{
struct stat st;
return (!stat(path &st) && S_ISDIR(st.st_mode));
}

/* We allow “recursive“ symbolic links. Only within reason though. */
#define MAXDEPTH 5

/*
 * Return the real path (i.e. absolute path with symlinks resolved
 * and extra slashes removed) equivalent to the specified path.  (If
 * you want an absolute path but don‘t mind links use
 * absolute_path().)  The return value is a pointer to a static
 * buffer.
 *
 * The input and all intermediate paths must be shorter than MAX_PATH.
 * The directory part of path (i.e. everything up to the last
 * dir_sep) must denote a valid existing directory but the last
 * component need not exist.  If die_on_error is set then die with an
 * informative error message if there is a problem.  Otherwise return
 * NULL on errors (without generating any output).
 *
 * If path is our buffer then return path as it‘s already what the
 * user wants.
 */
static const char *real_path_internal(const char *path int die_on_error)
{
static struct strbuf sb = STRBUF_INIT;
char *retval = NULL;

/*
 * If we have to temporarily chdir() store the original CWD
 * here so that we can chdir() back to it at the end of the
 * function:
 */
struct strbuf cwd = STRBUF_INIT;

int depth = MAXDEPTH;
char *last_elem = NULL;
struct stat st;

/* We‘ve already done it */
if (path == sb.buf)
return path;

if (!*path) {
if (die_on_error)
die(“The empty string is not a valid path“);
else
goto error_out;
}

strbuf_reset(&sb);
strbuf_addstr(&sb path);

while (depth--) {
if (!is_directory(sb.buf)) {
char *last_slash = find_last_dir_sep(sb.buf);
if (last_slash) {
last_elem = xstrdup(last_slash + 1);
strbuf_setlen(&sb last_slash - sb.buf + 1);
} else {
last_elem = xmemdupz(sb.buf sb.len);
strbuf_reset(&sb);
}
}

if (sb.len) {
if (!cwd.len && strbuf_getcwd(&cwd)) {
if (die_on_error)
die_errno(“Could not get current working directory“);
else
goto error_out;
}

if (chdir(sb.buf)) {
if (die_on_error)
die_errno(“Could not switch to ‘%s‘“
  sb.buf);
else
goto error_out;
}
}
if (strbuf_getcwd(&sb)) {
if (die_on_error)
die_errno(“Could not get current working directory“);
else
goto error_out;
}

if (last_elem) {
if (sb.len && !is_dir_sep(sb.buf[sb.len - 1]))
strbuf_addch(&sb ‘/‘);
strbuf_addstr(&sb last_elem);
free(last_elem);
last_elem = NULL;
}

if (!lstat(sb.buf &st) && S_ISLNK(st.st_mode)) {
struct strbuf next_sb = STRBUF_INIT;
ssize_t len = strbuf_readlink(&next_sb sb.buf 0);
if (len < 0) {
if (die_on_error)
die_errno(“Invalid symlink ‘%s‘“
  sb.buf);
else
goto error_out;

评论

共有 条评论