path: move validate_headref()
to its only user
While `validate_headref()` is only called from `is_git_directory()` in "setup.c", it is currently implemented in "path.c". Move it over such that it becomes clear that it is only really used during setup in order to discover repositories. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
a0851cece5
commit
0c6bd2b81d
53
path.c
53
path.c
@ -5,7 +5,6 @@
|
|||||||
#include "abspath.h"
|
#include "abspath.h"
|
||||||
#include "environment.h"
|
#include "environment.h"
|
||||||
#include "gettext.h"
|
#include "gettext.h"
|
||||||
#include "hex.h"
|
|
||||||
#include "repository.h"
|
#include "repository.h"
|
||||||
#include "strbuf.h"
|
#include "strbuf.h"
|
||||||
#include "string-list.h"
|
#include "string-list.h"
|
||||||
@ -647,58 +646,6 @@ void strbuf_git_common_path(struct strbuf *sb,
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
int validate_headref(const char *path)
|
|
||||||
{
|
|
||||||
struct stat st;
|
|
||||||
char buffer[256];
|
|
||||||
const char *refname;
|
|
||||||
struct object_id oid;
|
|
||||||
int fd;
|
|
||||||
ssize_t len;
|
|
||||||
|
|
||||||
if (lstat(path, &st) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* Make sure it is a "refs/.." symlink */
|
|
||||||
if (S_ISLNK(st.st_mode)) {
|
|
||||||
len = readlink(path, buffer, sizeof(buffer)-1);
|
|
||||||
if (len >= 5 && !memcmp("refs/", buffer, 5))
|
|
||||||
return 0;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Anything else, just open it and try to see if it is a symbolic ref.
|
|
||||||
*/
|
|
||||||
fd = open(path, O_RDONLY);
|
|
||||||
if (fd < 0)
|
|
||||||
return -1;
|
|
||||||
len = read_in_full(fd, buffer, sizeof(buffer)-1);
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
if (len < 0)
|
|
||||||
return -1;
|
|
||||||
buffer[len] = '\0';
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Is it a symbolic ref?
|
|
||||||
*/
|
|
||||||
if (skip_prefix(buffer, "ref:", &refname)) {
|
|
||||||
while (isspace(*refname))
|
|
||||||
refname++;
|
|
||||||
if (starts_with(refname, "refs/"))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Is this a detached HEAD?
|
|
||||||
*/
|
|
||||||
if (get_oid_hex_any(buffer, &oid) != GIT_HASH_UNKNOWN)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct passwd *getpw_str(const char *username, size_t len)
|
static struct passwd *getpw_str(const char *username, size_t len)
|
||||||
{
|
{
|
||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
|
1
path.h
1
path.h
@ -173,7 +173,6 @@ const char *git_path_fetch_head(struct repository *r);
|
|||||||
const char *git_path_shallow(struct repository *r);
|
const char *git_path_shallow(struct repository *r);
|
||||||
|
|
||||||
int ends_with_path_components(const char *path, const char *components);
|
int ends_with_path_components(const char *path, const char *components);
|
||||||
int validate_headref(const char *ref);
|
|
||||||
|
|
||||||
int calc_shared_perm(int mode);
|
int calc_shared_perm(int mode);
|
||||||
int adjust_shared_perm(const char *path);
|
int adjust_shared_perm(const char *path);
|
||||||
|
53
setup.c
53
setup.c
@ -4,6 +4,7 @@
|
|||||||
#include "environment.h"
|
#include "environment.h"
|
||||||
#include "exec-cmd.h"
|
#include "exec-cmd.h"
|
||||||
#include "gettext.h"
|
#include "gettext.h"
|
||||||
|
#include "hex.h"
|
||||||
#include "object-name.h"
|
#include "object-name.h"
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "repository.h"
|
#include "repository.h"
|
||||||
@ -341,6 +342,58 @@ int get_common_dir_noenv(struct strbuf *sb, const char *gitdir)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int validate_headref(const char *path)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
char buffer[256];
|
||||||
|
const char *refname;
|
||||||
|
struct object_id oid;
|
||||||
|
int fd;
|
||||||
|
ssize_t len;
|
||||||
|
|
||||||
|
if (lstat(path, &st) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Make sure it is a "refs/.." symlink */
|
||||||
|
if (S_ISLNK(st.st_mode)) {
|
||||||
|
len = readlink(path, buffer, sizeof(buffer)-1);
|
||||||
|
if (len >= 5 && !memcmp("refs/", buffer, 5))
|
||||||
|
return 0;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Anything else, just open it and try to see if it is a symbolic ref.
|
||||||
|
*/
|
||||||
|
fd = open(path, O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
return -1;
|
||||||
|
len = read_in_full(fd, buffer, sizeof(buffer)-1);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
if (len < 0)
|
||||||
|
return -1;
|
||||||
|
buffer[len] = '\0';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Is it a symbolic ref?
|
||||||
|
*/
|
||||||
|
if (skip_prefix(buffer, "ref:", &refname)) {
|
||||||
|
while (isspace(*refname))
|
||||||
|
refname++;
|
||||||
|
if (starts_with(refname, "refs/"))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Is this a detached HEAD?
|
||||||
|
*/
|
||||||
|
if (get_oid_hex_any(buffer, &oid) != GIT_HASH_UNKNOWN)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Test if it looks like we're at a git directory.
|
* Test if it looks like we're at a git directory.
|
||||||
* We want to see:
|
* We want to see:
|
||||||
|
Reference in New Issue
Block a user