資源簡介
git-2.2.1.tar.gz
代碼片段和文件信息
#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;
- 上一篇:The Little SAS Book第四版中文版
- 下一篇:紅外目標跟蹤測試視頻
評論
共有 條評論