int git_reference__read_head( git_reference **out, git_repository *repo, const char *path) { git_buf reference = GIT_BUF_INIT; char *name = NULL; int error; if ((error = git_futils_readbuffer(&reference, path)) < 0) goto out; git_buf_rtrim(&reference); if (git__strncmp(reference.ptr, GIT_SYMREF, strlen(GIT_SYMREF)) == 0) { git_buf_consume(&reference, reference.ptr + strlen(GIT_SYMREF)); name = git_path_basename(path); if ((*out = git_reference__alloc_symbolic(name, reference.ptr)) == NULL) { error = -1; goto out; } } else { if ((error = git_reference_lookup(out, repo, reference.ptr)) < 0) goto out; } out: git__free(name); git_buf_free(&reference); return error; }
static char *get_filename(const char *in) { char *search_dirname, *search_filename, *filename = NULL; git_buf out = GIT_BUF_INIT; DIR *dir; struct dirent *de; cl_assert(search_dirname = git_path_dirname(in)); cl_assert(search_filename = git_path_basename(in)); cl_assert(dir = opendir(search_dirname)); while ((de = readdir(dir))) { if (strcasecmp(de->d_name, search_filename) == 0) { git_buf_join(&out, '/', search_dirname, de->d_name); filename = git_buf_detach(&out); break; } } closedir(dir); git__free(search_dirname); git__free(search_filename); git_buf_dispose(&out); return filename; }
static char *get_filename(const char *in) { #ifdef GIT_WIN32 HANDLE fh; HMODULE kerneldll; char *filename; typedef DWORD (__stdcall *getfinalpathname)(HANDLE, LPSTR, DWORD, DWORD); getfinalpathname getfinalpathfn; cl_assert(filename = malloc(MAX_PATH)); cl_assert(kerneldll = LoadLibrary("kernel32.dll")); cl_assert(getfinalpathfn = (getfinalpathname)GetProcAddress(kerneldll, "GetFinalPathNameByHandleA")); cl_assert(fh = CreateFileA(in, FILE_READ_ATTRIBUTES | STANDARD_RIGHTS_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL)); cl_win32_pass(getfinalpathfn(fh, filename, MAX_PATH, VOLUME_NAME_DOS)); CloseHandle(fh); git_path_mkposix(filename); return filename; #else char *search_dirname, *search_filename, *filename = NULL; git_buf out = GIT_BUF_INIT; DIR *dir; struct dirent *de; cl_assert(search_dirname = git_path_dirname(in)); cl_assert(search_filename = git_path_basename(in)); cl_assert(dir = opendir(search_dirname)); while ((de = readdir(dir))) { if (strcasecmp(de->d_name, search_filename) == 0) { git_buf_join(&out, '/', search_dirname, de->d_name); filename = git_buf_detach(&out); break; } } closedir(dir); git__free(search_dirname); git__free(search_filename); git_buf_free(&out); return filename; #endif }
static void check_basename(const char *A, const char *B) { git_buf base = GIT_BUF_INIT; char *base2; cl_assert(git_path_basename_r(&base, A) >= 0); cl_assert_equal_s(B, base.ptr); git_buf_dispose(&base); cl_assert((base2 = git_path_basename(A)) != NULL); cl_assert_equal_s(B, base2); git__free(base2); }