X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=server-info.c;h=c1c073b2f05a48772a45602cdc711eef6e211695;hb=1affea4f629537fd48e3bd66de89a6f45d0fcd82;hp=05bce7da3b4935675465f993c24bb1188439d6d9;hpb=9086a18cb81f99fff943b36830396ac8c37c7e9f;p=git.git diff --git a/server-info.c b/server-info.c index 05bce7da3..c1c073b2f 100644 --- a/server-info.c +++ b/server-info.c @@ -7,12 +7,14 @@ /* refs */ static FILE *info_ref_fp; -static int add_info_ref(const char *path, const unsigned char *sha1) +static int add_info_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data) { struct object *o = parse_object(sha1); + if (!o) + return -1; fprintf(info_ref_fp, "%s %s\n", sha1_to_hex(sha1), path); - if (o->type == tag_type) { + if (o->type == OBJ_TAG) { o = deref_tag(o, path, 0); if (o) fprintf(info_ref_fp, "%s %s^{}\n", @@ -23,7 +25,7 @@ static int add_info_ref(const char *path, const unsigned char *sha1) static int update_info_refs(int force) { - char *path0 = strdup(git_path("info/refs")); + char *path0 = xstrdup(git_path("info/refs")); int len = strlen(path0); char *path1 = xmalloc(len + 2); @@ -33,9 +35,10 @@ static int update_info_refs(int force) safe_create_leading_directories(path0); info_ref_fp = fopen(path1, "w"); if (!info_ref_fp) - return error("unable to update %s", path0); - for_each_ref(add_info_ref); + return error("unable to update %s", path1); + for_each_ref(add_info_ref, NULL); fclose(info_ref_fp); + adjust_shared_perm(path1); rename(path1, path0); free(path0); free(path1); @@ -94,11 +97,11 @@ static int read_pack_info_file(const char *infofile) fp = fopen(infofile, "r"); if (!fp) - return 1; /* nonexisting is not an error. */ + return 1; /* nonexistent is not an error. */ while (fgets(line, sizeof(line), fp)) { int len = strlen(line); - if (line[len-1] == '\n') + if (len && line[len-1] == '\n') line[--len] = 0; if (!len) @@ -225,6 +228,7 @@ static int update_info_packs(int force) return error("cannot open %s", name); write_pack_info_file(fp); fclose(fp); + adjust_shared_perm(name); rename(name, infofile); return 0; }