From c49b039bdd7ac1942176009a966ada8f693d2df7 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:08 +0100 Subject: struct ref_entry: document name member Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index f5cb297..669782f 100644 --- a/refs.c +++ b/refs.c @@ -11,6 +11,7 @@ struct ref_entry { unsigned char flag; /* ISSYMREF? ISPACKED? */ unsigned char sha1[20]; unsigned char peeled[20]; + /* The full name of the reference (e.g., "refs/heads/master"): */ char name[FLEX_ARRAY]; }; -- cgit v0.10.2-6-g49f6 From dfefa935ae050d859022017bf9d5d23f4238a7e5 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:09 +0100 Subject: refs: rename "refname" variables Try to consistently use the variable name "refname" when referring to a string that names a reference. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/cache.h b/cache.h index 8c98d05..e1644b1 100644 --- a/cache.h +++ b/cache.h @@ -831,9 +831,9 @@ static inline int get_sha1_with_context(const char *str, unsigned char *sha1, st extern int get_sha1_hex(const char *hex, unsigned char *sha1); extern char *sha1_to_hex(const unsigned char *sha1); /* static buffer result! */ -extern int read_ref_full(const char *filename, unsigned char *sha1, +extern int read_ref_full(const char *refname, unsigned char *sha1, int reading, int *flags); -extern int read_ref(const char *filename, unsigned char *sha1); +extern int read_ref(const char *refname, unsigned char *sha1); /* * Resolve a reference, recursively following symbolic refererences. @@ -865,7 +865,7 @@ extern int read_ref(const char *filename, unsigned char *sha1); * * errno is sometimes set on errors, but not always. */ -extern const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *flag); +extern const char *resolve_ref(const char *refname, unsigned char *sha1, int reading, int *flag); extern int dwim_ref(const char *str, int len, unsigned char *sha1, char **ref); extern int dwim_log(const char *str, int len, unsigned char *sha1, char **ref); diff --git a/refs.c b/refs.c index 669782f..8ddd874 100644 --- a/refs.c +++ b/refs.c @@ -48,7 +48,7 @@ static const char *parse_ref_line(char *line, unsigned char *sha1) return line; } -static void add_ref(const char *name, const unsigned char *sha1, +static void add_ref(const char *refname, const unsigned char *sha1, int flag, int check_name, struct ref_array *refs, struct ref_entry **new_entry) { @@ -56,14 +56,14 @@ static void add_ref(const char *name, const unsigned char *sha1, struct ref_entry *entry; /* Allocate it and add it in.. */ - len = strlen(name) + 1; + len = strlen(refname) + 1; entry = xmalloc(sizeof(struct ref_entry) + len); hashcpy(entry->sha1, sha1); hashclr(entry->peeled); if (check_name && - check_refname_format(name, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT)) - die("Reference has invalid format: '%s'", name); - memcpy(entry->name, name, len); + check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT)) + die("Reference has invalid format: '%s'", refname); + memcpy(entry->name, refname, len); entry->flag = flag; if (new_entry) *new_entry = entry; @@ -106,20 +106,20 @@ static void sort_ref_array(struct ref_array *array) array->nr = i + 1; } -static struct ref_entry *search_ref_array(struct ref_array *array, const char *name) +static struct ref_entry *search_ref_array(struct ref_array *array, const char *refname) { struct ref_entry *e, **r; int len; - if (name == NULL) + if (refname == NULL) return NULL; if (!array->nr) return NULL; - len = strlen(name) + 1; + len = strlen(refname) + 1; e = xmalloc(sizeof(struct ref_entry) + len); - memcpy(e->name, name, len); + memcpy(e->name, refname, len); r = bsearch(&e, array->refs, array->nr, sizeof(*array->refs), ref_entry_cmp); @@ -223,7 +223,7 @@ static void read_packed_refs(FILE *f, struct ref_array *array) while (fgets(refline, sizeof(refline), f)) { unsigned char sha1[20]; - const char *name; + const char *refname; static const char header[] = "# pack-refs with:"; if (!strncmp(refline, header, sizeof(header)-1)) { @@ -234,9 +234,9 @@ static void read_packed_refs(FILE *f, struct ref_array *array) continue; } - name = parse_ref_line(refline, sha1); - if (name) { - add_ref(name, sha1, flag, 1, array, &last); + refname = parse_ref_line(refline, sha1); + if (refname) { + add_ref(refname, sha1, flag, 1, array, &last); continue; } if (last && @@ -249,9 +249,9 @@ static void read_packed_refs(FILE *f, struct ref_array *array) sort_ref_array(array); } -void add_extra_ref(const char *name, const unsigned char *sha1, int flag) +void add_extra_ref(const char *refname, const unsigned char *sha1, int flag) { - add_ref(name, sha1, flag, 0, &extra_refs, NULL); + add_ref(refname, sha1, flag, 0, &extra_refs, NULL); } void clear_extra_refs(void) @@ -298,11 +298,11 @@ static void get_ref_dir(const char *submodule, const char *base, if (dir) { struct dirent *de; int baselen = strlen(base); - char *ref = xmalloc(baselen + 257); + char *refname = xmalloc(baselen + 257); - memcpy(ref, base, baselen); + memcpy(refname, base, baselen); if (baselen && base[baselen-1] != '/') - ref[baselen++] = '/'; + refname[baselen++] = '/'; while ((de = readdir(dir)) != NULL) { unsigned char sha1[20]; @@ -318,30 +318,30 @@ static void get_ref_dir(const char *submodule, const char *base, continue; if (has_extension(de->d_name, ".lock")) continue; - memcpy(ref + baselen, de->d_name, namelen+1); + memcpy(refname + baselen, de->d_name, namelen+1); refdir = submodule - ? git_path_submodule(submodule, "%s", ref) - : git_path("%s", ref); + ? git_path_submodule(submodule, "%s", refname) + : git_path("%s", refname); if (stat(refdir, &st) < 0) continue; if (S_ISDIR(st.st_mode)) { - get_ref_dir(submodule, ref, array); + get_ref_dir(submodule, refname, array); continue; } if (submodule) { hashclr(sha1); flag = 0; - if (resolve_gitlink_ref(submodule, ref, sha1) < 0) { + if (resolve_gitlink_ref(submodule, refname, sha1) < 0) { hashclr(sha1); flag |= REF_ISBROKEN; } - } else if (read_ref_full(ref, sha1, 1, &flag)) { + } else if (read_ref_full(refname, sha1, 1, &flag)) { hashclr(sha1); flag |= REF_ISBROKEN; } - add_ref(ref, sha1, flag, 1, array, NULL); + add_ref(refname, sha1, flag, 1, array, NULL); } - free(ref); + free(refname); closedir(dir); } } @@ -401,7 +401,8 @@ static struct ref_array *get_loose_refs(const char *submodule) * from "name", which is "module/.git/". Find in * the packed-refs file for the submodule. */ -static int resolve_gitlink_packed_ref(char *name, int pathlen, const char *refname, unsigned char *result) +static int resolve_gitlink_packed_ref(char *name, int pathlen, + const char *refname, unsigned char *result) { int retval = -1; struct ref_entry *ref; @@ -420,7 +421,9 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen, const char *refna return retval; } -static int resolve_gitlink_ref_recursive(char *name, int pathlen, const char *refname, unsigned char *result, int recursion) +static int resolve_gitlink_ref_recursive(char *name, int pathlen, + const char *refname, unsigned char *result, + int recursion) { int fd, len = strlen(refname); char buffer[128], *p; @@ -487,10 +490,10 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re * Try to read ref from the packed references. On success, set sha1 * and return 0; otherwise, return -1. */ -static int get_packed_ref(const char *ref, unsigned char *sha1) +static int get_packed_ref(const char *refname, unsigned char *sha1) { struct ref_array *packed = get_packed_refs(NULL); - struct ref_entry *entry = search_ref_array(packed, ref); + struct ref_entry *entry = search_ref_array(packed, refname); if (entry) { hashcpy(sha1, entry->sha1); return 0; @@ -498,17 +501,17 @@ static int get_packed_ref(const char *ref, unsigned char *sha1) return -1; } -const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *flag) +const char *resolve_ref(const char *refname, unsigned char *sha1, int reading, int *flag) { int depth = MAXDEPTH; ssize_t len; char buffer[256]; - static char ref_buffer[256]; + static char refname_buffer[256]; if (flag) *flag = 0; - if (check_refname_format(ref, REFNAME_ALLOW_ONELEVEL)) + if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) return NULL; for (;;) { @@ -520,7 +523,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * if (--depth < 0) return NULL; - git_snpath(path, sizeof(path), "%s", ref); + git_snpath(path, sizeof(path), "%s", refname); if (lstat(path, &st) < 0) { if (errno != ENOENT) @@ -529,17 +532,17 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * * The loose reference file does not exist; * check for a packed reference. */ - if (!get_packed_ref(ref, sha1)) { + if (!get_packed_ref(refname, sha1)) { if (flag) *flag |= REF_ISPACKED; - return ref; + return refname; } /* The reference is not a packed reference, either. */ if (reading) { return NULL; } else { hashclr(sha1); - return ref; + return refname; } } @@ -551,8 +554,8 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * buffer[len] = 0; if (!prefixcmp(buffer, "refs/") && !check_refname_format(buffer, 0)) { - strcpy(ref_buffer, buffer); - ref = ref_buffer; + strcpy(refname_buffer, buffer); + refname = refname_buffer; if (flag) *flag |= REF_ISSYMREF; continue; @@ -595,7 +598,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * *flag |= REF_ISBROKEN; return NULL; } - ref = strcpy(ref_buffer, buf); + refname = strcpy(refname_buffer, buf); } /* Please note that FETCH_HEAD has a second line containing other data. */ if (get_sha1_hex(buffer, sha1) || (buffer[40] != '\0' && !isspace(buffer[40]))) { @@ -603,7 +606,7 @@ const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int * *flag |= REF_ISBROKEN; return NULL; } - return ref; + return refname; } /* The argument to filter_refs */ @@ -613,16 +616,16 @@ struct ref_filter { void *cb_data; }; -int read_ref_full(const char *ref, unsigned char *sha1, int reading, int *flags) +int read_ref_full(const char *refname, unsigned char *sha1, int reading, int *flags) { - if (resolve_ref(ref, sha1, reading, flags)) + if (resolve_ref(refname, sha1, reading, flags)) return 0; return -1; } -int read_ref(const char *ref, unsigned char *sha1) +int read_ref(const char *refname, unsigned char *sha1) { - return read_ref_full(ref, sha1, 1, NULL); + return read_ref_full(refname, sha1, 1, NULL); } #define DO_FOR_EACH_INCLUDE_BROKEN 01 @@ -644,23 +647,23 @@ static int do_one_ref(const char *base, each_ref_fn fn, int trim, return fn(entry->name + trim, entry->sha1, entry->flag, cb_data); } -static int filter_refs(const char *ref, const unsigned char *sha, int flags, - void *data) +static int filter_refs(const char *refname, const unsigned char *sha, int flags, + void *data) { struct ref_filter *filter = (struct ref_filter *)data; - if (fnmatch(filter->pattern, ref, 0)) + if (fnmatch(filter->pattern, refname, 0)) return 0; - return filter->fn(ref, sha, flags, filter->cb_data); + return filter->fn(refname, sha, flags, filter->cb_data); } -int peel_ref(const char *ref, unsigned char *sha1) +int peel_ref(const char *refname, unsigned char *sha1) { int flag; unsigned char base[20]; struct object *o; - if (current_ref && (current_ref->name == ref - || !strcmp(current_ref->name, ref))) { + if (current_ref && (current_ref->name == refname + || !strcmp(current_ref->name, refname))) { if (current_ref->flag & REF_KNOWS_PEELED) { hashcpy(sha1, current_ref->peeled); return 0; @@ -669,12 +672,12 @@ int peel_ref(const char *ref, unsigned char *sha1) goto fallback; } - if (read_ref_full(ref, base, 1, &flag)) + if (read_ref_full(refname, base, 1, &flag)) return -1; if ((flag & REF_ISPACKED)) { struct ref_array *array = get_packed_refs(NULL); - struct ref_entry *r = search_ref_array(array, ref); + struct ref_entry *r = search_ref_array(array, refname); if (r != NULL && r->flag & REF_KNOWS_PEELED) { hashcpy(sha1, r->peeled); @@ -685,7 +688,7 @@ int peel_ref(const char *ref, unsigned char *sha1) fallback: o = parse_object(base); if (o && o->type == OBJ_TAG) { - o = deref_tag(o, ref, 0); + o = deref_tag(o, refname, 0); if (o) { hashcpy(sha1, o->sha1); return 0; @@ -915,16 +918,16 @@ static inline int bad_ref_char(int ch) } /* - * Try to read one refname component from the front of ref. Return + * Try to read one refname component from the front of refname. Return * the length of the component found, or -1 if the component is not * legal. */ -static int check_refname_component(const char *ref, int flags) +static int check_refname_component(const char *refname, int flags) { const char *cp; char last = '\0'; - for (cp = ref; ; cp++) { + for (cp = refname; ; cp++) { char ch = *cp; if (ch == '\0' || ch == '/') break; @@ -936,34 +939,34 @@ static int check_refname_component(const char *ref, int flags) return -1; /* Refname contains "@{". */ last = ch; } - if (cp == ref) + if (cp == refname) return -1; /* Component has zero length. */ - if (ref[0] == '.') { + if (refname[0] == '.') { if (!(flags & REFNAME_DOT_COMPONENT)) return -1; /* Component starts with '.'. */ /* * Even if leading dots are allowed, don't allow "." * as a component (".." is prevented by a rule above). */ - if (ref[1] == '\0') + if (refname[1] == '\0') return -1; /* Component equals ".". */ } - if (cp - ref >= 5 && !memcmp(cp - 5, ".lock", 5)) + if (cp - refname >= 5 && !memcmp(cp - 5, ".lock", 5)) return -1; /* Refname ends with ".lock". */ - return cp - ref; + return cp - refname; } -int check_refname_format(const char *ref, int flags) +int check_refname_format(const char *refname, int flags) { int component_len, component_count = 0; while (1) { /* We are at the start of a path component. */ - component_len = check_refname_component(ref, flags); + component_len = check_refname_component(refname, flags); if (component_len < 0) { if ((flags & REFNAME_REFSPEC_PATTERN) && - ref[0] == '*' && - (ref[1] == '\0' || ref[1] == '/')) { + refname[0] == '*' && + (refname[1] == '\0' || refname[1] == '/')) { /* Accept one wildcard as a full refname component. */ flags &= ~REFNAME_REFSPEC_PATTERN; component_len = 1; @@ -972,13 +975,13 @@ int check_refname_format(const char *ref, int flags) } } component_count++; - if (ref[component_len] == '\0') + if (refname[component_len] == '\0') break; /* Skip to next component. */ - ref += component_len + 1; + refname += component_len + 1; } - if (ref[component_len - 1] == '.') + if (refname[component_len - 1] == '.') return -1; /* Refname ends with '.'. */ if (!(flags & REFNAME_ALLOW_ONELEVEL) && component_count < 2) return -1; /* Refname has only one component. */ @@ -1054,22 +1057,22 @@ static int remove_empty_directories(const char *file) return result; } -static int is_refname_available(const char *ref, const char *oldref, +static int is_refname_available(const char *refname, const char *oldrefname, struct ref_array *array, int quiet) { - int i, namlen = strlen(ref); /* e.g. 'foo/bar' */ + int i, namlen = strlen(refname); /* e.g. 'foo/bar' */ for (i = 0; i < array->nr; i++ ) { struct ref_entry *entry = array->refs[i]; /* entry->name could be 'foo' or 'foo/bar/baz' */ - if (!oldref || strcmp(oldref, entry->name)) { + if (!oldrefname || strcmp(oldrefname, entry->name)) { int len = strlen(entry->name); int cmplen = (namlen < len) ? namlen : len; - const char *lead = (namlen < len) ? entry->name : ref; - if (!strncmp(ref, entry->name, cmplen) && + const char *lead = (namlen < len) ? entry->name : refname; + if (!strncmp(refname, entry->name, cmplen) && lead[cmplen] == '/') { if (!quiet) error("'%s' exists; cannot create '%s'", - entry->name, ref); + entry->name, refname); return 0; } } @@ -1165,10 +1168,12 @@ int dwim_log(const char *str, int len, unsigned char *sha1, char **log) return logs_found; } -static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char *old_sha1, int flags, int *type_p) +static struct ref_lock *lock_ref_sha1_basic(const char *refname, + const unsigned char *old_sha1, + int flags, int *type_p) { char *ref_file; - const char *orig_ref = ref; + const char *orig_refname = refname; struct ref_lock *lock; int last_errno = 0; int type, lflags; @@ -1178,27 +1183,27 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char lock = xcalloc(1, sizeof(struct ref_lock)); lock->lock_fd = -1; - ref = resolve_ref(ref, lock->old_sha1, mustexist, &type); - if (!ref && errno == EISDIR) { + refname = resolve_ref(refname, lock->old_sha1, mustexist, &type); + if (!refname && errno == EISDIR) { /* we are trying to lock foo but we used to * have foo/bar which now does not exist; * it is normal for the empty directory 'foo' * to remain. */ - ref_file = git_path("%s", orig_ref); + ref_file = git_path("%s", orig_refname); if (remove_empty_directories(ref_file)) { last_errno = errno; - error("there are still refs under '%s'", orig_ref); + error("there are still refs under '%s'", orig_refname); goto error_return; } - ref = resolve_ref(orig_ref, lock->old_sha1, mustexist, &type); + refname = resolve_ref(orig_refname, lock->old_sha1, mustexist, &type); } if (type_p) *type_p = type; - if (!ref) { + if (!refname) { last_errno = errno; error("unable to resolve reference %s: %s", - orig_ref, strerror(errno)); + orig_refname, strerror(errno)); goto error_return; } missing = is_null_sha1(lock->old_sha1); @@ -1208,7 +1213,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char * name is a proper prefix of our refname. */ if (missing && - !is_refname_available(ref, NULL, get_packed_refs(NULL), 0)) { + !is_refname_available(refname, NULL, get_packed_refs(NULL), 0)) { last_errno = ENOTDIR; goto error_return; } @@ -1217,12 +1222,12 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char lflags = LOCK_DIE_ON_ERROR; if (flags & REF_NODEREF) { - ref = orig_ref; + refname = orig_refname; lflags |= LOCK_NODEREF; } - lock->ref_name = xstrdup(ref); - lock->orig_ref_name = xstrdup(orig_ref); - ref_file = git_path("%s", ref); + lock->ref_name = xstrdup(refname); + lock->orig_ref_name = xstrdup(orig_refname); + ref_file = git_path("%s", refname); if (missing) lock->force_write = 1; if ((flags & REF_NODEREF) && (type & REF_ISSYMREF)) @@ -1243,20 +1248,21 @@ static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char return NULL; } -struct ref_lock *lock_ref_sha1(const char *ref, const unsigned char *old_sha1) +struct ref_lock *lock_ref_sha1(const char *refname, const unsigned char *old_sha1) { char refpath[PATH_MAX]; - if (check_refname_format(ref, 0)) + if (check_refname_format(refname, 0)) return NULL; - strcpy(refpath, mkpath("refs/%s", ref)); + strcpy(refpath, mkpath("refs/%s", refname)); return lock_ref_sha1_basic(refpath, old_sha1, 0, NULL); } -struct ref_lock *lock_any_ref_for_update(const char *ref, const unsigned char *old_sha1, int flags) +struct ref_lock *lock_any_ref_for_update(const char *refname, + const unsigned char *old_sha1, int flags) { - if (check_refname_format(ref, REFNAME_ALLOW_ONELEVEL)) + if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) return NULL; - return lock_ref_sha1_basic(ref, old_sha1, flags, NULL); + return lock_ref_sha1_basic(refname, old_sha1, flags, NULL); } static struct lock_file packlock; @@ -1342,97 +1348,97 @@ int delete_ref(const char *refname, const unsigned char *sha1, int delopt) */ #define TMP_RENAMED_LOG "logs/refs/.tmp-renamed-log" -int rename_ref(const char *oldref, const char *newref, const char *logmsg) +int rename_ref(const char *oldrefname, const char *newrefname, const char *logmsg) { unsigned char sha1[20], orig_sha1[20]; int flag = 0, logmoved = 0; struct ref_lock *lock; struct stat loginfo; - int log = !lstat(git_path("logs/%s", oldref), &loginfo); + int log = !lstat(git_path("logs/%s", oldrefname), &loginfo); const char *symref = NULL; if (log && S_ISLNK(loginfo.st_mode)) - return error("reflog for %s is a symlink", oldref); + return error("reflog for %s is a symlink", oldrefname); - symref = resolve_ref(oldref, orig_sha1, 1, &flag); + symref = resolve_ref(oldrefname, orig_sha1, 1, &flag); if (flag & REF_ISSYMREF) return error("refname %s is a symbolic ref, renaming it is not supported", - oldref); + oldrefname); if (!symref) - return error("refname %s not found", oldref); + return error("refname %s not found", oldrefname); - if (!is_refname_available(newref, oldref, get_packed_refs(NULL), 0)) + if (!is_refname_available(newrefname, oldrefname, get_packed_refs(NULL), 0)) return 1; - if (!is_refname_available(newref, oldref, get_loose_refs(NULL), 0)) + if (!is_refname_available(newrefname, oldrefname, get_loose_refs(NULL), 0)) return 1; - if (log && rename(git_path("logs/%s", oldref), git_path(TMP_RENAMED_LOG))) + if (log && rename(git_path("logs/%s", oldrefname), git_path(TMP_RENAMED_LOG))) return error("unable to move logfile logs/%s to "TMP_RENAMED_LOG": %s", - oldref, strerror(errno)); + oldrefname, strerror(errno)); - if (delete_ref(oldref, orig_sha1, REF_NODEREF)) { - error("unable to delete old %s", oldref); + if (delete_ref(oldrefname, orig_sha1, REF_NODEREF)) { + error("unable to delete old %s", oldrefname); goto rollback; } - if (!read_ref_full(newref, sha1, 1, &flag) && - delete_ref(newref, sha1, REF_NODEREF)) { + if (!read_ref_full(newrefname, sha1, 1, &flag) && + delete_ref(newrefname, sha1, REF_NODEREF)) { if (errno==EISDIR) { - if (remove_empty_directories(git_path("%s", newref))) { - error("Directory not empty: %s", newref); + if (remove_empty_directories(git_path("%s", newrefname))) { + error("Directory not empty: %s", newrefname); goto rollback; } } else { - error("unable to delete existing %s", newref); + error("unable to delete existing %s", newrefname); goto rollback; } } - if (log && safe_create_leading_directories(git_path("logs/%s", newref))) { - error("unable to create directory for %s", newref); + if (log && safe_create_leading_directories(git_path("logs/%s", newrefname))) { + error("unable to create directory for %s", newrefname); goto rollback; } retry: - if (log && rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", newref))) { + if (log && rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", newrefname))) { if (errno==EISDIR || errno==ENOTDIR) { /* * rename(a, b) when b is an existing * directory ought to result in ISDIR, but * Solaris 5.8 gives ENOTDIR. Sheesh. */ - if (remove_empty_directories(git_path("logs/%s", newref))) { - error("Directory not empty: logs/%s", newref); + if (remove_empty_directories(git_path("logs/%s", newrefname))) { + error("Directory not empty: logs/%s", newrefname); goto rollback; } goto retry; } else { error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s", - newref, strerror(errno)); + newrefname, strerror(errno)); goto rollback; } } logmoved = log; - lock = lock_ref_sha1_basic(newref, NULL, 0, NULL); + lock = lock_ref_sha1_basic(newrefname, NULL, 0, NULL); if (!lock) { - error("unable to lock %s for update", newref); + error("unable to lock %s for update", newrefname); goto rollback; } lock->force_write = 1; hashcpy(lock->old_sha1, orig_sha1); if (write_ref_sha1(lock, orig_sha1, logmsg)) { - error("unable to write current sha1 into %s", newref); + error("unable to write current sha1 into %s", newrefname); goto rollback; } return 0; rollback: - lock = lock_ref_sha1_basic(oldref, NULL, 0, NULL); + lock = lock_ref_sha1_basic(oldrefname, NULL, 0, NULL); if (!lock) { - error("unable to lock %s for rollback", oldref); + error("unable to lock %s for rollback", oldrefname); goto rollbacklog; } @@ -1440,17 +1446,17 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg) flag = log_all_ref_updates; log_all_ref_updates = 0; if (write_ref_sha1(lock, orig_sha1, NULL)) - error("unable to write current sha1 into %s", oldref); + error("unable to write current sha1 into %s", oldrefname); log_all_ref_updates = flag; rollbacklog: - if (logmoved && rename(git_path("logs/%s", newref), git_path("logs/%s", oldref))) + if (logmoved && rename(git_path("logs/%s", newrefname), git_path("logs/%s", oldrefname))) error("unable to restore logfile %s from %s: %s", - oldref, newref, strerror(errno)); + oldrefname, newrefname, strerror(errno)); if (!logmoved && log && - rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", oldref))) + rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", oldrefname))) error("unable to restore logfile %s from "TMP_RENAMED_LOG": %s", - oldref, strerror(errno)); + oldrefname, strerror(errno)); return 1; } @@ -1507,16 +1513,16 @@ static int copy_msg(char *buf, const char *msg) return cp - buf; } -int log_ref_setup(const char *ref_name, char *logfile, int bufsize) +int log_ref_setup(const char *refname, char *logfile, int bufsize) { int logfd, oflags = O_APPEND | O_WRONLY; - git_snpath(logfile, bufsize, "logs/%s", ref_name); + git_snpath(logfile, bufsize, "logs/%s", refname); if (log_all_ref_updates && - (!prefixcmp(ref_name, "refs/heads/") || - !prefixcmp(ref_name, "refs/remotes/") || - !prefixcmp(ref_name, "refs/notes/") || - !strcmp(ref_name, "HEAD"))) { + (!prefixcmp(refname, "refs/heads/") || + !prefixcmp(refname, "refs/remotes/") || + !prefixcmp(refname, "refs/notes/") || + !strcmp(refname, "HEAD"))) { if (safe_create_leading_directories(logfile) < 0) return error("unable to create directory for %s", logfile); @@ -1546,7 +1552,7 @@ int log_ref_setup(const char *ref_name, char *logfile, int bufsize) return 0; } -static int log_ref_write(const char *ref_name, const unsigned char *old_sha1, +static int log_ref_write(const char *refname, const unsigned char *old_sha1, const unsigned char *new_sha1, const char *msg) { int logfd, result, written, oflags = O_APPEND | O_WRONLY; @@ -1559,7 +1565,7 @@ static int log_ref_write(const char *ref_name, const unsigned char *old_sha1, if (log_all_ref_updates < 0) log_all_ref_updates = !is_bare_repository(); - result = log_ref_setup(ref_name, log_file, sizeof(log_file)); + result = log_ref_setup(refname, log_file, sizeof(log_file)); if (result) return result; @@ -1730,7 +1736,9 @@ static char *ref_msg(const char *line, const char *endp) return xmemdupz(line, ep - line); } -int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1, char **msg, unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt) +int read_ref_at(const char *refname, unsigned long at_time, int cnt, + unsigned char *sha1, char **msg, + unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt) { const char *logfile, *logdata, *logend, *rec, *lastgt, *lastrec; char *tz_c; @@ -1741,7 +1749,7 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char * void *log_mapped; size_t mapsz; - logfile = git_path("logs/%s", ref); + logfile = git_path("logs/%s", refname); logfd = open(logfile, O_RDONLY, 0); if (logfd < 0) die_errno("Unable to read log '%s'", logfile); @@ -1834,14 +1842,14 @@ int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char * return 1; } -int for_each_recent_reflog_ent(const char *ref, each_reflog_ent_fn fn, long ofs, void *cb_data) +int for_each_recent_reflog_ent(const char *refname, each_reflog_ent_fn fn, long ofs, void *cb_data) { const char *logfile; FILE *logfp; struct strbuf sb = STRBUF_INIT; int ret = 0; - logfile = git_path("logs/%s", ref); + logfile = git_path("logs/%s", refname); logfp = fopen(logfile, "r"); if (!logfp) return -1; @@ -1892,9 +1900,9 @@ int for_each_recent_reflog_ent(const char *ref, each_reflog_ent_fn fn, long ofs, return ret; } -int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data) +int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data) { - return for_each_recent_reflog_ent(ref, fn, 0, cb_data); + return for_each_recent_reflog_ent(refname, fn, 0, cb_data); } static int do_for_each_reflog(const char *base, each_ref_fn fn, void *cb_data) @@ -2014,7 +2022,7 @@ static void gen_scanf_fmt(char *scanf_fmt, const char *rule) return; } -char *shorten_unambiguous_ref(const char *ref, int strict) +char *shorten_unambiguous_ref(const char *refname, int strict) { int i; static char **scanf_fmts; @@ -2043,10 +2051,10 @@ char *shorten_unambiguous_ref(const char *ref, int strict) /* bail out if there are no rules */ if (!nr_rules) - return xstrdup(ref); + return xstrdup(refname); - /* buffer for scanf result, at most ref must fit */ - short_name = xstrdup(ref); + /* buffer for scanf result, at most refname must fit */ + short_name = xstrdup(refname); /* skip first rule, it will always match */ for (i = nr_rules - 1; i > 0 ; --i) { @@ -2054,7 +2062,7 @@ char *shorten_unambiguous_ref(const char *ref, int strict) int rules_to_fail = i; int short_name_len; - if (1 != sscanf(ref, scanf_fmts[i], short_name)) + if (1 != sscanf(refname, scanf_fmts[i], short_name)) continue; short_name_len = strlen(short_name); @@ -2098,5 +2106,5 @@ char *shorten_unambiguous_ref(const char *ref, int strict) } free(short_name); - return xstrdup(ref); + return xstrdup(refname); } diff --git a/refs.h b/refs.h index 3fd5536..e36bd03 100644 --- a/refs.h +++ b/refs.h @@ -60,14 +60,16 @@ extern void add_extra_ref(const char *refname, const unsigned char *sha1, int fl extern void clear_extra_refs(void); extern int ref_exists(const char *); -extern int peel_ref(const char *, unsigned char *); +extern int peel_ref(const char *refname, unsigned char *sha1); /** Locks a "refs/" ref returning the lock on success and NULL on failure. **/ -extern struct ref_lock *lock_ref_sha1(const char *ref, const unsigned char *old_sha1); +extern struct ref_lock *lock_ref_sha1(const char *refname, const unsigned char *old_sha1); /** Locks any ref (for 'HEAD' type refs). */ #define REF_NODEREF 0x01 -extern struct ref_lock *lock_any_ref_for_update(const char *ref, const unsigned char *old_sha1, int flags); +extern struct ref_lock *lock_any_ref_for_update(const char *refname, + const unsigned char *old_sha1, + int flags); /** Close the file descriptor owned by a lock and return the status */ extern int close_ref(struct ref_lock *lock); @@ -93,12 +95,14 @@ extern void invalidate_ref_cache(const char *submodule); int log_ref_setup(const char *ref_name, char *logfile, int bufsize); /** Reads log for the value of ref during at_time. **/ -extern int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1, char **msg, unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt); +extern int read_ref_at(const char *refname, unsigned long at_time, int cnt, + unsigned char *sha1, char **msg, + unsigned long *cutoff_time, int *cutoff_tz, int *cutoff_cnt); /* iterate over reflog entries */ typedef int each_reflog_ent_fn(unsigned char *osha1, unsigned char *nsha1, const char *, unsigned long, int, const char *, void *); -int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data); -int for_each_recent_reflog_ent(const char *ref, each_reflog_ent_fn fn, long, void *cb_data); +int for_each_reflog_ent(const char *refname, each_reflog_ent_fn fn, void *cb_data); +int for_each_recent_reflog_ent(const char *refname, each_reflog_ent_fn fn, long, void *cb_data); /* * Calls the specified function for each reflog file until it returns nonzero, @@ -111,9 +115,9 @@ extern int for_each_reflog(each_ref_fn, void *); #define REFNAME_DOT_COMPONENT 4 /* - * Return 0 iff ref has the correct format for a refname according to - * the rules described in Documentation/git-check-ref-format.txt. If - * REFNAME_ALLOW_ONELEVEL is set in flags, then accept one-level + * Return 0 iff refname has the correct format for a refname according + * to the rules described in Documentation/git-check-ref-format.txt. + * If REFNAME_ALLOW_ONELEVEL is set in flags, then accept one-level * reference names. If REFNAME_REFSPEC_PATTERN is set in flags, then * allow a "*" wildcard character in place of one of the name * components. No leading or repeated slashes are accepted. If @@ -121,10 +125,10 @@ extern int for_each_reflog(each_ref_fn, void *); * components to start with "." (but not a whole component equal to * "." or ".."). */ -extern int check_refname_format(const char *ref, int flags); +extern int check_refname_format(const char *refname, int flags); extern const char *prettify_refname(const char *refname); -extern char *shorten_unambiguous_ref(const char *ref, int strict); +extern char *shorten_unambiguous_ref(const char *refname, int strict); /** rename ref, return 0 on success **/ extern int rename_ref(const char *oldref, const char *newref, const char *logmsg); -- cgit v0.10.2-6-g49f6 From 85be1fe34ab6bf67d232b1deb524c4af34d87222 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:10 +0100 Subject: refs: rename parameters result -> sha1 Try consistently to use the name "sha1" for parameters to which a SHA1 will be stored. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index 8ddd874..9f7a5ec 100644 --- a/refs.c +++ b/refs.c @@ -402,7 +402,7 @@ static struct ref_array *get_loose_refs(const char *submodule) * the packed-refs file for the submodule. */ static int resolve_gitlink_packed_ref(char *name, int pathlen, - const char *refname, unsigned char *result) + const char *refname, unsigned char *sha1) { int retval = -1; struct ref_entry *ref; @@ -415,14 +415,14 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen, array = get_packed_refs(name); ref = search_ref_array(array, refname); if (ref != NULL) { - memcpy(result, ref->sha1, 20); + memcpy(sha1, ref->sha1, 20); retval = 0; } return retval; } static int resolve_gitlink_ref_recursive(char *name, int pathlen, - const char *refname, unsigned char *result, + const char *refname, unsigned char *sha1, int recursion) { int fd, len = strlen(refname); @@ -433,7 +433,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen, memcpy(name + pathlen, refname, len+1); fd = open(name, O_RDONLY); if (fd < 0) - return resolve_gitlink_packed_ref(name, pathlen, refname, result); + return resolve_gitlink_packed_ref(name, pathlen, refname, sha1); len = read(fd, buffer, sizeof(buffer)-1); close(fd); @@ -444,7 +444,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen, buffer[len] = 0; /* Was it a detached head or an old-fashioned symlink? */ - if (!get_sha1_hex(buffer, result)) + if (!get_sha1_hex(buffer, sha1)) return 0; /* Symref? */ @@ -454,10 +454,10 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen, while (isspace(*p)) p++; - return resolve_gitlink_ref_recursive(name, pathlen, p, result, recursion+1); + return resolve_gitlink_ref_recursive(name, pathlen, p, sha1, recursion+1); } -int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *result) +int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1) { int len = strlen(path), retval; char *gitdir; @@ -481,7 +481,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *re } gitdir[len] = '/'; gitdir[++len] = '\0'; - retval = resolve_gitlink_ref_recursive(gitdir, len, refname, result, 0); + retval = resolve_gitlink_ref_recursive(gitdir, len, refname, sha1, 0); free(gitdir); return retval; } @@ -647,13 +647,13 @@ static int do_one_ref(const char *base, each_ref_fn fn, int trim, return fn(entry->name + trim, entry->sha1, entry->flag, cb_data); } -static int filter_refs(const char *refname, const unsigned char *sha, int flags, +static int filter_refs(const char *refname, const unsigned char *sha1, int flags, void *data) { struct ref_filter *filter = (struct ref_filter *)data; if (fnmatch(filter->pattern, refname, 0)) return 0; - return filter->fn(refname, sha, flags, filter->cb_data); + return filter->fn(refname, sha1, flags, filter->cb_data); } int peel_ref(const char *refname, unsigned char *sha1) diff --git a/refs.h b/refs.h index e36bd03..4c5d570 100644 --- a/refs.h +++ b/refs.h @@ -134,7 +134,7 @@ extern char *shorten_unambiguous_ref(const char *refname, int strict); extern int rename_ref(const char *oldref, const char *newref, const char *logmsg); /** resolve ref in nested "gitlink" repository */ -extern int resolve_gitlink_ref(const char *name, const char *refname, unsigned char *result); +extern int resolve_gitlink_ref(const char *name, const char *refname, unsigned char *sha1); /** lock a ref and then write its file */ enum action_on_err { MSG_ON_ERR, DIE_ON_ERR, QUIET_ON_ERR }; -- cgit v0.10.2-6-g49f6 From 7c59511ed54aec999c7df3bd8e79b1eb33b92fa6 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:11 +0100 Subject: clear_ref_array(): rename from free_ref_array() Rename the function since it doesn't actually free the array object that is passed to it. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index 9f7a5ec..7be91d1 100644 --- a/refs.c +++ b/refs.c @@ -149,7 +149,7 @@ static struct ref_entry *current_ref; static struct ref_array extra_refs; -static void free_ref_array(struct ref_array *array) +static void clear_ref_array(struct ref_array *array) { int i; for (i = 0; i < array->nr; i++) @@ -162,14 +162,14 @@ static void free_ref_array(struct ref_array *array) static void clear_packed_ref_cache(struct ref_cache *refs) { if (refs->did_packed) - free_ref_array(&refs->packed); + clear_ref_array(&refs->packed); refs->did_packed = 0; } static void clear_loose_ref_cache(struct ref_cache *refs) { if (refs->did_loose) - free_ref_array(&refs->loose); + clear_ref_array(&refs->loose); refs->did_loose = 0; } @@ -256,7 +256,7 @@ void add_extra_ref(const char *refname, const unsigned char *sha1, int flag) void clear_extra_refs(void) { - free_ref_array(&extra_refs); + clear_ref_array(&extra_refs); } static struct ref_array *get_packed_refs(const char *submodule) -- cgit v0.10.2-6-g49f6 From 19b68b1e632ba989dc62d0956b7fd06978347370 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:12 +0100 Subject: is_refname_available(): remove the "quiet" argument quiet was always set to 0, so get rid of it. Add a function docstring for good measure. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index 7be91d1..d7d422f 100644 --- a/refs.c +++ b/refs.c @@ -1057,8 +1057,15 @@ static int remove_empty_directories(const char *file) return result; } +/* + * Return true iff a reference named refname could be created without + * conflicting with the name of an existing reference. If oldrefname + * is non-NULL, ignore potential conflicts with oldrefname (e.g., + * because oldrefname is scheduled for deletion in the same + * operation). + */ static int is_refname_available(const char *refname, const char *oldrefname, - struct ref_array *array, int quiet) + struct ref_array *array) { int i, namlen = strlen(refname); /* e.g. 'foo/bar' */ for (i = 0; i < array->nr; i++ ) { @@ -1070,9 +1077,8 @@ static int is_refname_available(const char *refname, const char *oldrefname, const char *lead = (namlen < len) ? entry->name : refname; if (!strncmp(refname, entry->name, cmplen) && lead[cmplen] == '/') { - if (!quiet) - error("'%s' exists; cannot create '%s'", - entry->name, refname); + error("'%s' exists; cannot create '%s'", + entry->name, refname); return 0; } } @@ -1213,7 +1219,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, * name is a proper prefix of our refname. */ if (missing && - !is_refname_available(refname, NULL, get_packed_refs(NULL), 0)) { + !is_refname_available(refname, NULL, get_packed_refs(NULL))) { last_errno = ENOTDIR; goto error_return; } @@ -1367,10 +1373,10 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms if (!symref) return error("refname %s not found", oldrefname); - if (!is_refname_available(newrefname, oldrefname, get_packed_refs(NULL), 0)) + if (!is_refname_available(newrefname, oldrefname, get_packed_refs(NULL))) return 1; - if (!is_refname_available(newrefname, oldrefname, get_loose_refs(NULL), 0)) + if (!is_refname_available(newrefname, oldrefname, get_loose_refs(NULL))) return 1; if (log && rename(git_path("logs/%s", oldrefname), git_path(TMP_RENAMED_LOG))) -- cgit v0.10.2-6-g49f6 From fbd09e41d571fb45ae702027f74bec345887749d Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:13 +0100 Subject: parse_ref_line(): add docstring Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index d7d422f..1975792 100644 --- a/refs.c +++ b/refs.c @@ -20,6 +20,11 @@ struct ref_array { struct ref_entry **refs; }; +/* + * Parse one line from a packed-refs file. Write the SHA1 to sha1. + * Return a pointer to the refname within the line (null-terminated), + * or NULL if there was a problem. + */ static const char *parse_ref_line(char *line, unsigned char *sha1) { /* -- cgit v0.10.2-6-g49f6 From 6af1038beef46b46077a873f66e6742d3c0fe99f Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:14 +0100 Subject: add_ref(): add docstring Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index 1975792..2252c66 100644 --- a/refs.c +++ b/refs.c @@ -53,6 +53,7 @@ static const char *parse_ref_line(char *line, unsigned char *sha1) return line; } +/* Add a ref_entry to the end of the ref_array (unsorted). */ static void add_ref(const char *refname, const unsigned char *sha1, int flag, int check_name, struct ref_array *refs, struct ref_entry **new_entry) -- cgit v0.10.2-6-g49f6 From 202a56a92414a2142cd92f0c3fa89bfb29149388 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:15 +0100 Subject: is_dup_ref(): extract function from sort_ref_array() Giving the function a name makes the code easier to understand. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index 2252c66..ea058c1 100644 --- a/refs.c +++ b/refs.c @@ -84,9 +84,28 @@ static int ref_entry_cmp(const void *a, const void *b) return strcmp(one->name, two->name); } +/* + * Emit a warning and return true iff ref1 and ref2 have the same name + * and the same sha1. Die if they have the same name but different + * sha1s. + */ +static int is_dup_ref(const struct ref_entry *ref1, const struct ref_entry *ref2) +{ + if (!strcmp(ref1->name, ref2->name)) { + /* Duplicate name; make sure that the SHA1s match: */ + if (hashcmp(ref1->sha1, ref2->sha1)) + die("Duplicated ref, and SHA1s don't match: %s", + ref1->name); + warning("Duplicated ref: %s", ref1->name); + return 1; + } else { + return 0; + } +} + static void sort_ref_array(struct ref_array *array) { - int i = 0, j = 1; + int i, j; /* Nothing to sort unless there are at least two entries */ if (array->nr < 2) @@ -95,19 +114,13 @@ static void sort_ref_array(struct ref_array *array) qsort(array->refs, array->nr, sizeof(*array->refs), ref_entry_cmp); /* Remove any duplicates from the ref_array */ - for (; j < array->nr; j++) { - struct ref_entry *a = array->refs[i]; - struct ref_entry *b = array->refs[j]; - if (!strcmp(a->name, b->name)) { - if (hashcmp(a->sha1, b->sha1)) - die("Duplicated ref, and SHA1s don't match: %s", - a->name); - warning("Duplicated ref: %s", a->name); - free(b); + i = 0; + for (j = 1; j < array->nr; j++) { + if (is_dup_ref(array->refs[i], array->refs[j])) { + free(array->refs[j]); continue; } - i++; - array->refs[i] = array->refs[j]; + array->refs[++i] = array->refs[j]; } array->nr = i + 1; } -- cgit v0.10.2-6-g49f6 From 316b097ac138c3c5232ce9bbaede83d68fb686ea Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:16 +0100 Subject: refs: change signatures of get_packed_refs() and get_loose_refs() Change get_packed_refs() and get_loose_refs() to take a (struct ref_cache *) instead of the name of the submodule. Change get_ref_dir() to take a submodule name (i.e., "" for the main module) rather than a submodule pointer (i.e., NULL for the main module) so that refs->name can be used as its argument. (In a moment this function will also be changed to take a (struct ref_cache *), too.) Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index ea058c1..c62c682 100644 --- a/refs.c +++ b/refs.c @@ -278,16 +278,14 @@ void clear_extra_refs(void) clear_ref_array(&extra_refs); } -static struct ref_array *get_packed_refs(const char *submodule) +static struct ref_array *get_packed_refs(struct ref_cache *refs) { - struct ref_cache *refs = get_ref_cache(submodule); - if (!refs->did_packed) { const char *packed_refs_file; FILE *f; - if (submodule) - packed_refs_file = git_path_submodule(submodule, "packed-refs"); + if (*refs->name) + packed_refs_file = git_path_submodule(refs->name, "packed-refs"); else packed_refs_file = git_path("packed-refs"); f = fopen(packed_refs_file, "r"); @@ -306,7 +304,7 @@ static void get_ref_dir(const char *submodule, const char *base, DIR *dir; const char *path; - if (submodule) + if (*submodule) path = git_path_submodule(submodule, "%s", base); else path = git_path("%s", base); @@ -399,12 +397,10 @@ void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname) for_each_rawref(warn_if_dangling_symref, &data); } -static struct ref_array *get_loose_refs(const char *submodule) +static struct ref_array *get_loose_refs(struct ref_cache *refs) { - struct ref_cache *refs = get_ref_cache(submodule); - if (!refs->did_loose) { - get_ref_dir(submodule, "refs", &refs->loose); + get_ref_dir(refs->name, "refs", &refs->loose); sort_ref_array(&refs->loose); refs->did_loose = 1; } @@ -431,7 +427,7 @@ static int resolve_gitlink_packed_ref(char *name, int pathlen, if (pathlen < 6 || memcmp(name + pathlen - 6, "/.git/", 6)) die("Oops"); name[pathlen - 6] = '\0'; /* make it path to the submodule */ - array = get_packed_refs(name); + array = get_packed_refs(get_ref_cache(name)); ref = search_ref_array(array, refname); if (ref != NULL) { memcpy(sha1, ref->sha1, 20); @@ -511,7 +507,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh */ static int get_packed_ref(const char *refname, unsigned char *sha1) { - struct ref_array *packed = get_packed_refs(NULL); + struct ref_array *packed = get_packed_refs(get_ref_cache(NULL)); struct ref_entry *entry = search_ref_array(packed, refname); if (entry) { hashcpy(sha1, entry->sha1); @@ -695,7 +691,7 @@ int peel_ref(const char *refname, unsigned char *sha1) return -1; if ((flag & REF_ISPACKED)) { - struct ref_array *array = get_packed_refs(NULL); + struct ref_array *array = get_packed_refs(get_ref_cache(NULL)); struct ref_entry *r = search_ref_array(array, refname); if (r != NULL && r->flag & REF_KNOWS_PEELED) { @@ -720,8 +716,9 @@ static int do_for_each_ref(const char *submodule, const char *base, each_ref_fn int trim, int flags, void *cb_data) { int retval = 0, i, p = 0, l = 0; - struct ref_array *packed = get_packed_refs(submodule); - struct ref_array *loose = get_loose_refs(submodule); + struct ref_cache *refs = get_ref_cache(submodule); + struct ref_array *packed = get_packed_refs(refs); + struct ref_array *loose = get_loose_refs(refs); struct ref_array *extra = &extra_refs; @@ -1238,7 +1235,7 @@ static struct ref_lock *lock_ref_sha1_basic(const char *refname, * name is a proper prefix of our refname. */ if (missing && - !is_refname_available(refname, NULL, get_packed_refs(NULL))) { + !is_refname_available(refname, NULL, get_packed_refs(get_ref_cache(NULL)))) { last_errno = ENOTDIR; goto error_return; } @@ -1298,7 +1295,7 @@ static int repack_without_ref(const char *refname) struct ref_entry *ref; int fd, i; - packed = get_packed_refs(NULL); + packed = get_packed_refs(get_ref_cache(NULL)); ref = search_ref_array(packed, refname); if (ref == NULL) return 0; @@ -1381,6 +1378,7 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms struct stat loginfo; int log = !lstat(git_path("logs/%s", oldrefname), &loginfo); const char *symref = NULL; + struct ref_cache *refs = get_ref_cache(NULL); if (log && S_ISLNK(loginfo.st_mode)) return error("reflog for %s is a symlink", oldrefname); @@ -1392,10 +1390,10 @@ int rename_ref(const char *oldrefname, const char *newrefname, const char *logms if (!symref) return error("refname %s not found", oldrefname); - if (!is_refname_available(newrefname, oldrefname, get_packed_refs(NULL))) + if (!is_refname_available(newrefname, oldrefname, get_packed_refs(refs))) return 1; - if (!is_refname_available(newrefname, oldrefname, get_loose_refs(NULL))) + if (!is_refname_available(newrefname, oldrefname, get_loose_refs(refs))) return 1; if (log && rename(git_path("logs/%s", oldrefname), git_path(TMP_RENAMED_LOG))) -- cgit v0.10.2-6-g49f6 From 3b12482358e58d95d4a8effc840862c87d995c4c Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:17 +0100 Subject: get_ref_dir(): change signature Change get_ref_dir() to take a (struct ref_cache *) in place of the submodule name. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index c62c682..91ec395 100644 --- a/refs.c +++ b/refs.c @@ -298,14 +298,14 @@ static struct ref_array *get_packed_refs(struct ref_cache *refs) return &refs->packed; } -static void get_ref_dir(const char *submodule, const char *base, +static void get_ref_dir(struct ref_cache *refs, const char *base, struct ref_array *array) { DIR *dir; const char *path; - if (*submodule) - path = git_path_submodule(submodule, "%s", base); + if (*refs->name) + path = git_path_submodule(refs->name, "%s", base); else path = git_path("%s", base); @@ -336,19 +336,19 @@ static void get_ref_dir(const char *submodule, const char *base, if (has_extension(de->d_name, ".lock")) continue; memcpy(refname + baselen, de->d_name, namelen+1); - refdir = submodule - ? git_path_submodule(submodule, "%s", refname) + refdir = *refs->name + ? git_path_submodule(refs->name, "%s", refname) : git_path("%s", refname); if (stat(refdir, &st) < 0) continue; if (S_ISDIR(st.st_mode)) { - get_ref_dir(submodule, refname, array); + get_ref_dir(refs, refname, array); continue; } - if (submodule) { + if (*refs->name) { hashclr(sha1); flag = 0; - if (resolve_gitlink_ref(submodule, refname, sha1) < 0) { + if (resolve_gitlink_ref(refs->name, refname, sha1) < 0) { hashclr(sha1); flag |= REF_ISBROKEN; } @@ -400,7 +400,7 @@ void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname) static struct ref_array *get_loose_refs(struct ref_cache *refs) { if (!refs->did_loose) { - get_ref_dir(refs->name, "refs", &refs->loose); + get_ref_dir(refs, "refs", &refs->loose); sort_ref_array(&refs->loose); refs->did_loose = 1; } -- cgit v0.10.2-6-g49f6 From 7f820bd92008a366f391e243fbd51e076d75e3a6 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:18 +0100 Subject: resolve_gitlink_ref(): improve docstring Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.h b/refs.h index 4c5d570..d498291 100644 --- a/refs.h +++ b/refs.h @@ -133,8 +133,12 @@ extern char *shorten_unambiguous_ref(const char *refname, int strict); /** rename ref, return 0 on success **/ extern int rename_ref(const char *oldref, const char *newref, const char *logmsg); -/** resolve ref in nested "gitlink" repository */ -extern int resolve_gitlink_ref(const char *name, const char *refname, unsigned char *sha1); +/** + * Resolve refname in the nested "gitlink" repository that is located + * at path. If the resolution is successful, return 0 and set sha1 to + * the name of the object; otherwise, return a non-zero value. + */ +extern int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1); /** lock a ref and then write its file */ enum action_on_err { MSG_ON_ERR, DIE_ON_ERR, QUIET_ON_ERR }; -- cgit v0.10.2-6-g49f6 From b0626608ea80e636faaa030a35200d8e47be5564 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:19 +0100 Subject: Pass a (ref_cache *) to the resolve_gitlink_*() helper functions And remove some redundant arguments from resolve_gitlink_packed_ref(). Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index 91ec395..bf1f164 100644 --- a/refs.c +++ b/refs.c @@ -413,30 +413,25 @@ static struct ref_array *get_loose_refs(struct ref_cache *refs) /* * Called by resolve_gitlink_ref_recursive() after it failed to read - * from "name", which is "module/.git/". Find in - * the packed-refs file for the submodule. + * from the loose refs in ref_cache refs. Find in the + * packed-refs file for the submodule. */ -static int resolve_gitlink_packed_ref(char *name, int pathlen, +static int resolve_gitlink_packed_ref(struct ref_cache *refs, const char *refname, unsigned char *sha1) { - int retval = -1; struct ref_entry *ref; - struct ref_array *array; + struct ref_array *array = get_packed_refs(refs); - /* being defensive: resolve_gitlink_ref() did this for us */ - if (pathlen < 6 || memcmp(name + pathlen - 6, "/.git/", 6)) - die("Oops"); - name[pathlen - 6] = '\0'; /* make it path to the submodule */ - array = get_packed_refs(get_ref_cache(name)); ref = search_ref_array(array, refname); - if (ref != NULL) { - memcpy(sha1, ref->sha1, 20); - retval = 0; - } - return retval; + if (ref == NULL) + return -1; + + memcpy(sha1, ref->sha1, 20); + return 0; } -static int resolve_gitlink_ref_recursive(char *name, int pathlen, +static int resolve_gitlink_ref_recursive(struct ref_cache *refs, + char *name, int pathlen, const char *refname, unsigned char *sha1, int recursion) { @@ -448,7 +443,7 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen, memcpy(name + pathlen, refname, len+1); fd = open(name, O_RDONLY); if (fd < 0) - return resolve_gitlink_packed_ref(name, pathlen, refname, sha1); + return resolve_gitlink_packed_ref(refs, refname, sha1); len = read(fd, buffer, sizeof(buffer)-1); close(fd); @@ -469,19 +464,24 @@ static int resolve_gitlink_ref_recursive(char *name, int pathlen, while (isspace(*p)) p++; - return resolve_gitlink_ref_recursive(name, pathlen, p, sha1, recursion+1); + return resolve_gitlink_ref_recursive(refs, name, pathlen, p, sha1, recursion+1); } int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1) { int len = strlen(path), retval; - char *gitdir; + char *submodule, *gitdir; + struct ref_cache *refs; const char *tmp; while (len && path[len-1] == '/') len--; if (!len) return -1; + submodule = xstrndup(path, len); + refs = get_ref_cache(submodule); + free(submodule); + gitdir = xmalloc(len + MAXREFLEN + 8); memcpy(gitdir, path, len); memcpy(gitdir + len, "/.git", 6); @@ -496,7 +496,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh } gitdir[len] = '/'; gitdir[++len] = '\0'; - retval = resolve_gitlink_ref_recursive(gitdir, len, refname, sha1, 0); + retval = resolve_gitlink_ref_recursive(refs, gitdir, len, refname, sha1, 0); free(gitdir); return retval; } -- cgit v0.10.2-6-g49f6 From 064d51dc40bc9df75279ca3346cd84c2611c6aba Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:20 +0100 Subject: resolve_gitlink_ref_recursive(): change to work with struct ref_cache resolve_gitlink_ref() and resolve_gitlink_ref_recursive(), together, basically duplicated the code in git_path_submodule(). So use that function instead. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index bf1f164..ba7a8b0 100644 --- a/refs.c +++ b/refs.c @@ -431,17 +431,19 @@ static int resolve_gitlink_packed_ref(struct ref_cache *refs, } static int resolve_gitlink_ref_recursive(struct ref_cache *refs, - char *name, int pathlen, const char *refname, unsigned char *sha1, int recursion) { - int fd, len = strlen(refname); + int fd, len; char buffer[128], *p; + char *path; - if (recursion > MAXDEPTH || len > MAXREFLEN) + if (recursion > MAXDEPTH || strlen(refname) > MAXREFLEN) return -1; - memcpy(name + pathlen, refname, len+1); - fd = open(name, O_RDONLY); + path = *refs->name + ? git_path_submodule(refs->name, "%s", refname) + : git_path("%s", refname); + fd = open(path, O_RDONLY); if (fd < 0) return resolve_gitlink_packed_ref(refs, refname, sha1); @@ -464,15 +466,14 @@ static int resolve_gitlink_ref_recursive(struct ref_cache *refs, while (isspace(*p)) p++; - return resolve_gitlink_ref_recursive(refs, name, pathlen, p, sha1, recursion+1); + return resolve_gitlink_ref_recursive(refs, p, sha1, recursion+1); } int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1) { int len = strlen(path), retval; - char *submodule, *gitdir; + char *submodule; struct ref_cache *refs; - const char *tmp; while (len && path[len-1] == '/') len--; @@ -482,22 +483,7 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh refs = get_ref_cache(submodule); free(submodule); - gitdir = xmalloc(len + MAXREFLEN + 8); - memcpy(gitdir, path, len); - memcpy(gitdir + len, "/.git", 6); - len += 5; - - tmp = read_gitfile(gitdir); - if (tmp) { - free(gitdir); - len = strlen(tmp); - gitdir = xmalloc(len + MAXREFLEN + 3); - memcpy(gitdir, tmp, len); - } - gitdir[len] = '/'; - gitdir[++len] = '\0'; - retval = resolve_gitlink_ref_recursive(refs, gitdir, len, refname, sha1, 0); - free(gitdir); + retval = resolve_gitlink_ref_recursive(refs, refname, sha1, 0); return retval; } -- cgit v0.10.2-6-g49f6 From fe9c7b78c5487dc4595559fb6e731b46294b6a0d Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:21 +0100 Subject: repack_without_ref(): remove temporary Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index ba7a8b0..2e7bc0c 100644 --- a/refs.c +++ b/refs.c @@ -1278,12 +1278,10 @@ static struct lock_file packlock; static int repack_without_ref(const char *refname) { struct ref_array *packed; - struct ref_entry *ref; int fd, i; packed = get_packed_refs(get_ref_cache(NULL)); - ref = search_ref_array(packed, refname); - if (ref == NULL) + if (search_ref_array(packed, refname) == NULL) return 0; fd = hold_lock_file_for_update(&packlock, git_path("packed-refs"), 0); if (fd < 0) { @@ -1294,8 +1292,7 @@ static int repack_without_ref(const char *refname) for (i = 0; i < packed->nr; i++) { char line[PATH_MAX + 100]; int len; - - ref = packed->refs[i]; + struct ref_entry *ref = packed->refs[i]; if (!strcmp(refname, ref->name)) continue; -- cgit v0.10.2-6-g49f6 From cddc42587cbb37f8ff2f34b53550b5e331aa3aa5 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:22 +0100 Subject: create_ref_entry(): extract function from add_ref() Separate the creation of the ref_entry from its addition to a ref_array. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index 2e7bc0c..442b87c 100644 --- a/refs.c +++ b/refs.c @@ -53,28 +53,35 @@ static const char *parse_ref_line(char *line, unsigned char *sha1) return line; } -/* Add a ref_entry to the end of the ref_array (unsorted). */ -static void add_ref(const char *refname, const unsigned char *sha1, - int flag, int check_name, struct ref_array *refs, - struct ref_entry **new_entry) +static struct ref_entry *create_ref_entry(const char *refname, + const unsigned char *sha1, int flag, + int check_name) { int len; - struct ref_entry *entry; + struct ref_entry *ref; - /* Allocate it and add it in.. */ - len = strlen(refname) + 1; - entry = xmalloc(sizeof(struct ref_entry) + len); - hashcpy(entry->sha1, sha1); - hashclr(entry->peeled); if (check_name && check_refname_format(refname, REFNAME_ALLOW_ONELEVEL|REFNAME_DOT_COMPONENT)) die("Reference has invalid format: '%s'", refname); - memcpy(entry->name, refname, len); - entry->flag = flag; - if (new_entry) - *new_entry = entry; + len = strlen(refname) + 1; + ref = xmalloc(sizeof(struct ref_entry) + len); + hashcpy(ref->sha1, sha1); + hashclr(ref->peeled); + memcpy(ref->name, refname, len); + ref->flag = flag; + return ref; +} + +/* Add a ref_entry to the end of the ref_array (unsorted). */ +static void add_ref(const char *refname, const unsigned char *sha1, + int flag, int check_name, struct ref_array *refs, + struct ref_entry **new_ref) +{ + struct ref_entry *ref = create_ref_entry(refname, sha1, flag, check_name); + if (new_ref) + *new_ref = ref; ALLOC_GROW(refs->refs, refs->nr + 1, refs->alloc); - refs->refs[refs->nr++] = entry; + refs->refs[refs->nr++] = ref; } static int ref_entry_cmp(const void *a, const void *b) -- cgit v0.10.2-6-g49f6 From dd73ecd1bc8903036d58cf7afb0010ef4aaf8695 Mon Sep 17 00:00:00 2001 From: Michael Haggerty Date: Mon, 12 Dec 2011 06:38:23 +0100 Subject: add_ref(): take a (struct ref_entry *) parameter Take a pointer to the ref_entry to add to the array, rather than creating the ref_entry within the function. This opens the way to having multiple kinds of ref_entries. Signed-off-by: Michael Haggerty Signed-off-by: Junio C Hamano diff --git a/refs.c b/refs.c index 442b87c..579e4c3 100644 --- a/refs.c +++ b/refs.c @@ -73,13 +73,8 @@ static struct ref_entry *create_ref_entry(const char *refname, } /* Add a ref_entry to the end of the ref_array (unsorted). */ -static void add_ref(const char *refname, const unsigned char *sha1, - int flag, int check_name, struct ref_array *refs, - struct ref_entry **new_ref) +static void add_ref(struct ref_array *refs, struct ref_entry *ref) { - struct ref_entry *ref = create_ref_entry(refname, sha1, flag, check_name); - if (new_ref) - *new_ref = ref; ALLOC_GROW(refs->refs, refs->nr + 1, refs->alloc); refs->refs[refs->nr++] = ref; } @@ -262,7 +257,8 @@ static void read_packed_refs(FILE *f, struct ref_array *array) refname = parse_ref_line(refline, sha1); if (refname) { - add_ref(refname, sha1, flag, 1, array, &last); + last = create_ref_entry(refname, sha1, flag, 1); + add_ref(array, last); continue; } if (last && @@ -277,7 +273,7 @@ static void read_packed_refs(FILE *f, struct ref_array *array) void add_extra_ref(const char *refname, const unsigned char *sha1, int flag) { - add_ref(refname, sha1, flag, 0, &extra_refs, NULL); + add_ref(&extra_refs, create_ref_entry(refname, sha1, flag, 0)); } void clear_extra_refs(void) @@ -363,7 +359,7 @@ static void get_ref_dir(struct ref_cache *refs, const char *base, hashclr(sha1); flag |= REF_ISBROKEN; } - add_ref(refname, sha1, flag, 1, array, NULL); + add_ref(array, create_ref_entry(refname, sha1, flag, 1)); } free(refname); closedir(dir); -- cgit v0.10.2-6-g49f6