cbc4c5d28d3252a3336cfa370cb3d720d5d8556d
   1#include "cache.h"
   2#include "refs.h"
   3#include "object.h"
   4#include "tag.h"
   5#include "dir.h"
   6
   7/* ISSYMREF=01 and ISPACKED=02 are public interfaces */
   8#define REF_KNOWS_PEELED 04
   9#define REF_BROKEN 010
  10
  11struct ref_entry {
  12        unsigned char flag; /* ISSYMREF? ISPACKED? */
  13        unsigned char sha1[20];
  14        unsigned char peeled[20];
  15        char name[FLEX_ARRAY];
  16};
  17
  18struct ref_array {
  19        int nr, alloc;
  20        struct ref_entry **refs;
  21};
  22
  23static const char *parse_ref_line(char *line, unsigned char *sha1)
  24{
  25        /*
  26         * 42: the answer to everything.
  27         *
  28         * In this case, it happens to be the answer to
  29         *  40 (length of sha1 hex representation)
  30         *  +1 (space in between hex and name)
  31         *  +1 (newline at the end of the line)
  32         */
  33        int len = strlen(line) - 42;
  34
  35        if (len <= 0)
  36                return NULL;
  37        if (get_sha1_hex(line, sha1) < 0)
  38                return NULL;
  39        if (!isspace(line[40]))
  40                return NULL;
  41        line += 41;
  42        if (isspace(*line))
  43                return NULL;
  44        if (line[len] != '\n')
  45                return NULL;
  46        line[len] = 0;
  47
  48        return line;
  49}
  50
  51static void add_ref(const char *name, const unsigned char *sha1,
  52                    int flag, struct ref_array *refs,
  53                    struct ref_entry **new_entry)
  54{
  55        int len;
  56        struct ref_entry *entry;
  57
  58        /* Allocate it and add it in.. */
  59        len = strlen(name) + 1;
  60        entry = xmalloc(sizeof(struct ref_entry) + len);
  61        hashcpy(entry->sha1, sha1);
  62        hashclr(entry->peeled);
  63        memcpy(entry->name, name, len);
  64        entry->flag = flag;
  65        if (new_entry)
  66                *new_entry = entry;
  67        ALLOC_GROW(refs->refs, refs->nr + 1, refs->alloc);
  68        refs->refs[refs->nr++] = entry;
  69}
  70
  71static int ref_entry_cmp(const void *a, const void *b)
  72{
  73        struct ref_entry *one = *(struct ref_entry **)a;
  74        struct ref_entry *two = *(struct ref_entry **)b;
  75        return strcmp(one->name, two->name);
  76}
  77
  78static void sort_ref_array(struct ref_array *array)
  79{
  80        int i = 0, j = 1;
  81
  82        /* Nothing to sort unless there are at least two entries */
  83        if (array->nr < 2)
  84                return;
  85
  86        qsort(array->refs, array->nr, sizeof(*array->refs), ref_entry_cmp);
  87
  88        /* Remove any duplicates from the ref_array */
  89        for (; j < array->nr; j++) {
  90                struct ref_entry *a = array->refs[i];
  91                struct ref_entry *b = array->refs[j];
  92                if (!strcmp(a->name, b->name)) {
  93                        if (hashcmp(a->sha1, b->sha1))
  94                                die("Duplicated ref, and SHA1s don't match: %s",
  95                                    a->name);
  96                        warning("Duplicated ref: %s", a->name);
  97                        continue;
  98                }
  99                i++;
 100                array->refs[i] = array->refs[j];
 101        }
 102        array->nr = i + 1;
 103}
 104
 105static struct ref_entry *search_ref_array(struct ref_array *array, const char *name)
 106{
 107        struct ref_entry *e, **r;
 108        int len;
 109
 110        if (name == NULL)
 111                return NULL;
 112
 113        if (!array->nr)
 114                return NULL;
 115
 116        len = strlen(name) + 1;
 117        e = xmalloc(sizeof(struct ref_entry) + len);
 118        memcpy(e->name, name, len);
 119
 120        r = bsearch(&e, array->refs, array->nr, sizeof(*array->refs), ref_entry_cmp);
 121
 122        free(e);
 123
 124        if (r == NULL)
 125                return NULL;
 126
 127        return *r;
 128}
 129
 130/*
 131 * Future: need to be in "struct repository"
 132 * when doing a full libification.
 133 */
 134static struct cached_refs {
 135        char did_loose;
 136        char did_packed;
 137        struct ref_array loose;
 138        struct ref_array packed;
 139} cached_refs, submodule_refs;
 140static struct ref_entry *current_ref;
 141
 142static struct ref_array extra_refs;
 143
 144static void free_ref_array(struct ref_array *array)
 145{
 146        int i;
 147        for (i = 0; i < array->nr; i++)
 148                free(array->refs[i]);
 149        free(array->refs);
 150        array->nr = array->alloc = 0;
 151        array->refs = NULL;
 152}
 153
 154static void invalidate_cached_refs(void)
 155{
 156        struct cached_refs *ca = &cached_refs;
 157
 158        if (ca->did_loose)
 159                free_ref_array(&ca->loose);
 160        if (ca->did_packed)
 161                free_ref_array(&ca->packed);
 162        ca->did_loose = ca->did_packed = 0;
 163}
 164
 165static void read_packed_refs(FILE *f, struct cached_refs *cached_refs)
 166{
 167        struct ref_entry *last = NULL;
 168        char refline[PATH_MAX];
 169        int flag = REF_ISPACKED;
 170
 171        while (fgets(refline, sizeof(refline), f)) {
 172                unsigned char sha1[20];
 173                const char *name;
 174                static const char header[] = "# pack-refs with:";
 175
 176                if (!strncmp(refline, header, sizeof(header)-1)) {
 177                        const char *traits = refline + sizeof(header) - 1;
 178                        if (strstr(traits, " peeled "))
 179                                flag |= REF_KNOWS_PEELED;
 180                        /* perhaps other traits later as well */
 181                        continue;
 182                }
 183
 184                name = parse_ref_line(refline, sha1);
 185                if (name) {
 186                        add_ref(name, sha1, flag, &cached_refs->packed, &last);
 187                        continue;
 188                }
 189                if (last &&
 190                    refline[0] == '^' &&
 191                    strlen(refline) == 42 &&
 192                    refline[41] == '\n' &&
 193                    !get_sha1_hex(refline + 1, sha1))
 194                        hashcpy(last->peeled, sha1);
 195        }
 196        sort_ref_array(&cached_refs->packed);
 197}
 198
 199void add_extra_ref(const char *name, const unsigned char *sha1, int flag)
 200{
 201        add_ref(name, sha1, flag, &extra_refs, NULL);
 202}
 203
 204void clear_extra_refs(void)
 205{
 206        free_ref_array(&extra_refs);
 207}
 208
 209static struct ref_array *get_packed_refs(const char *submodule)
 210{
 211        const char *packed_refs_file;
 212        struct cached_refs *refs;
 213
 214        if (submodule) {
 215                packed_refs_file = git_path_submodule(submodule, "packed-refs");
 216                refs = &submodule_refs;
 217                free_ref_array(&refs->packed);
 218        } else {
 219                packed_refs_file = git_path("packed-refs");
 220                refs = &cached_refs;
 221        }
 222
 223        if (!refs->did_packed || submodule) {
 224                FILE *f = fopen(packed_refs_file, "r");
 225                if (f) {
 226                        read_packed_refs(f, refs);
 227                        fclose(f);
 228                }
 229                refs->did_packed = 1;
 230        }
 231        return &refs->packed;
 232}
 233
 234static void get_ref_dir(const char *submodule, const char *base,
 235                        struct ref_array *array)
 236{
 237        DIR *dir;
 238        const char *path;
 239
 240        if (submodule)
 241                path = git_path_submodule(submodule, "%s", base);
 242        else
 243                path = git_path("%s", base);
 244
 245
 246        dir = opendir(path);
 247
 248        if (dir) {
 249                struct dirent *de;
 250                int baselen = strlen(base);
 251                char *ref = xmalloc(baselen + 257);
 252
 253                memcpy(ref, base, baselen);
 254                if (baselen && base[baselen-1] != '/')
 255                        ref[baselen++] = '/';
 256
 257                while ((de = readdir(dir)) != NULL) {
 258                        unsigned char sha1[20];
 259                        struct stat st;
 260                        int flag;
 261                        int namelen;
 262                        const char *refdir;
 263
 264                        if (de->d_name[0] == '.')
 265                                continue;
 266                        namelen = strlen(de->d_name);
 267                        if (namelen > 255)
 268                                continue;
 269                        if (has_extension(de->d_name, ".lock"))
 270                                continue;
 271                        memcpy(ref + baselen, de->d_name, namelen+1);
 272                        refdir = submodule
 273                                ? git_path_submodule(submodule, "%s", ref)
 274                                : git_path("%s", ref);
 275                        if (stat(refdir, &st) < 0)
 276                                continue;
 277                        if (S_ISDIR(st.st_mode)) {
 278                                get_ref_dir(submodule, ref, array);
 279                                continue;
 280                        }
 281                        if (submodule) {
 282                                hashclr(sha1);
 283                                flag = 0;
 284                                if (resolve_gitlink_ref(submodule, ref, sha1) < 0) {
 285                                        hashclr(sha1);
 286                                        flag |= REF_BROKEN;
 287                                }
 288                        } else
 289                                if (!resolve_ref(ref, sha1, 1, &flag)) {
 290                                        hashclr(sha1);
 291                                        flag |= REF_BROKEN;
 292                                }
 293                        add_ref(ref, sha1, flag, array, NULL);
 294                }
 295                free(ref);
 296                closedir(dir);
 297        }
 298}
 299
 300struct warn_if_dangling_data {
 301        FILE *fp;
 302        const char *refname;
 303        const char *msg_fmt;
 304};
 305
 306static int warn_if_dangling_symref(const char *refname, const unsigned char *sha1,
 307                                   int flags, void *cb_data)
 308{
 309        struct warn_if_dangling_data *d = cb_data;
 310        const char *resolves_to;
 311        unsigned char junk[20];
 312
 313        if (!(flags & REF_ISSYMREF))
 314                return 0;
 315
 316        resolves_to = resolve_ref(refname, junk, 0, NULL);
 317        if (!resolves_to || strcmp(resolves_to, d->refname))
 318                return 0;
 319
 320        fprintf(d->fp, d->msg_fmt, refname);
 321        return 0;
 322}
 323
 324void warn_dangling_symref(FILE *fp, const char *msg_fmt, const char *refname)
 325{
 326        struct warn_if_dangling_data data;
 327
 328        data.fp = fp;
 329        data.refname = refname;
 330        data.msg_fmt = msg_fmt;
 331        for_each_rawref(warn_if_dangling_symref, &data);
 332}
 333
 334static struct ref_array *get_loose_refs(const char *submodule)
 335{
 336        if (submodule) {
 337                free_ref_array(&submodule_refs.loose);
 338                get_ref_dir(submodule, "refs", &submodule_refs.loose);
 339                sort_ref_array(&submodule_refs.loose);
 340                return &submodule_refs.loose;
 341        }
 342
 343        if (!cached_refs.did_loose) {
 344                get_ref_dir(NULL, "refs", &cached_refs.loose);
 345                sort_ref_array(&cached_refs.loose);
 346                cached_refs.did_loose = 1;
 347        }
 348        return &cached_refs.loose;
 349}
 350
 351/* We allow "recursive" symbolic refs. Only within reason, though */
 352#define MAXDEPTH 5
 353#define MAXREFLEN (1024)
 354
 355static int resolve_gitlink_packed_ref(char *name, int pathlen, const char *refname, unsigned char *result)
 356{
 357        FILE *f;
 358        struct cached_refs refs;
 359        struct ref_entry *ref;
 360        int retval = -1;
 361
 362        strcpy(name + pathlen, "packed-refs");
 363        f = fopen(name, "r");
 364        if (!f)
 365                return -1;
 366        memset(&refs, 0, sizeof(refs));
 367        read_packed_refs(f, &refs);
 368        fclose(f);
 369        ref = search_ref_array(&refs.packed, refname);
 370        if (ref != NULL) {
 371                memcpy(result, ref->sha1, 20);
 372                retval = 0;
 373        }
 374        free_ref_array(&refs.packed);
 375        return retval;
 376}
 377
 378static int resolve_gitlink_ref_recursive(char *name, int pathlen, const char *refname, unsigned char *result, int recursion)
 379{
 380        int fd, len = strlen(refname);
 381        char buffer[128], *p;
 382
 383        if (recursion > MAXDEPTH || len > MAXREFLEN)
 384                return -1;
 385        memcpy(name + pathlen, refname, len+1);
 386        fd = open(name, O_RDONLY);
 387        if (fd < 0)
 388                return resolve_gitlink_packed_ref(name, pathlen, refname, result);
 389
 390        len = read(fd, buffer, sizeof(buffer)-1);
 391        close(fd);
 392        if (len < 0)
 393                return -1;
 394        while (len && isspace(buffer[len-1]))
 395                len--;
 396        buffer[len] = 0;
 397
 398        /* Was it a detached head or an old-fashioned symlink? */
 399        if (!get_sha1_hex(buffer, result))
 400                return 0;
 401
 402        /* Symref? */
 403        if (strncmp(buffer, "ref:", 4))
 404                return -1;
 405        p = buffer + 4;
 406        while (isspace(*p))
 407                p++;
 408
 409        return resolve_gitlink_ref_recursive(name, pathlen, p, result, recursion+1);
 410}
 411
 412int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *result)
 413{
 414        int len = strlen(path), retval;
 415        char *gitdir;
 416        const char *tmp;
 417
 418        while (len && path[len-1] == '/')
 419                len--;
 420        if (!len)
 421                return -1;
 422        gitdir = xmalloc(len + MAXREFLEN + 8);
 423        memcpy(gitdir, path, len);
 424        memcpy(gitdir + len, "/.git", 6);
 425        len += 5;
 426
 427        tmp = read_gitfile_gently(gitdir);
 428        if (tmp) {
 429                free(gitdir);
 430                len = strlen(tmp);
 431                gitdir = xmalloc(len + MAXREFLEN + 3);
 432                memcpy(gitdir, tmp, len);
 433        }
 434        gitdir[len] = '/';
 435        gitdir[++len] = '\0';
 436        retval = resolve_gitlink_ref_recursive(gitdir, len, refname, result, 0);
 437        free(gitdir);
 438        return retval;
 439}
 440
 441/*
 442 * If the "reading" argument is set, this function finds out what _object_
 443 * the ref points at by "reading" the ref.  The ref, if it is not symbolic,
 444 * has to exist, and if it is symbolic, it has to point at an existing ref,
 445 * because the "read" goes through the symref to the ref it points at.
 446 *
 447 * The access that is not "reading" may often be "writing", but does not
 448 * have to; it can be merely checking _where it leads to_. If it is a
 449 * prelude to "writing" to the ref, a write to a symref that points at
 450 * yet-to-be-born ref will create the real ref pointed by the symref.
 451 * reading=0 allows the caller to check where such a symref leads to.
 452 */
 453const char *resolve_ref(const char *ref, unsigned char *sha1, int reading, int *flag)
 454{
 455        int depth = MAXDEPTH;
 456        ssize_t len;
 457        char buffer[256];
 458        static char ref_buffer[256];
 459
 460        if (flag)
 461                *flag = 0;
 462
 463        for (;;) {
 464                char path[PATH_MAX];
 465                struct stat st;
 466                char *buf;
 467                int fd;
 468
 469                if (--depth < 0)
 470                        return NULL;
 471
 472                git_snpath(path, sizeof(path), "%s", ref);
 473                /* Special case: non-existing file. */
 474                if (lstat(path, &st) < 0) {
 475                        struct ref_array *packed = get_packed_refs(NULL);
 476                        struct ref_entry *r = search_ref_array(packed, ref);
 477                        if (r != NULL) {
 478                                hashcpy(sha1, r->sha1);
 479                                if (flag)
 480                                        *flag |= REF_ISPACKED;
 481                                return ref;
 482                        }
 483                        if (reading || errno != ENOENT)
 484                                return NULL;
 485                        hashclr(sha1);
 486                        return ref;
 487                }
 488
 489                /* Follow "normalized" - ie "refs/.." symlinks by hand */
 490                if (S_ISLNK(st.st_mode)) {
 491                        len = readlink(path, buffer, sizeof(buffer)-1);
 492                        if (len >= 5 && !memcmp("refs/", buffer, 5)) {
 493                                buffer[len] = 0;
 494                                strcpy(ref_buffer, buffer);
 495                                ref = ref_buffer;
 496                                if (flag)
 497                                        *flag |= REF_ISSYMREF;
 498                                continue;
 499                        }
 500                }
 501
 502                /* Is it a directory? */
 503                if (S_ISDIR(st.st_mode)) {
 504                        errno = EISDIR;
 505                        return NULL;
 506                }
 507
 508                /*
 509                 * Anything else, just open it and try to use it as
 510                 * a ref
 511                 */
 512                fd = open(path, O_RDONLY);
 513                if (fd < 0)
 514                        return NULL;
 515                len = read_in_full(fd, buffer, sizeof(buffer)-1);
 516                close(fd);
 517
 518                /*
 519                 * Is it a symbolic ref?
 520                 */
 521                if (len < 4 || memcmp("ref:", buffer, 4))
 522                        break;
 523                buf = buffer + 4;
 524                len -= 4;
 525                while (len && isspace(*buf))
 526                        buf++, len--;
 527                while (len && isspace(buf[len-1]))
 528                        len--;
 529                buf[len] = 0;
 530                memcpy(ref_buffer, buf, len + 1);
 531                ref = ref_buffer;
 532                if (flag)
 533                        *flag |= REF_ISSYMREF;
 534        }
 535        if (len < 40 || get_sha1_hex(buffer, sha1))
 536                return NULL;
 537        return ref;
 538}
 539
 540/* The argument to filter_refs */
 541struct ref_filter {
 542        const char *pattern;
 543        each_ref_fn *fn;
 544        void *cb_data;
 545};
 546
 547int read_ref(const char *ref, unsigned char *sha1)
 548{
 549        if (resolve_ref(ref, sha1, 1, NULL))
 550                return 0;
 551        return -1;
 552}
 553
 554#define DO_FOR_EACH_INCLUDE_BROKEN 01
 555static int do_one_ref(const char *base, each_ref_fn fn, int trim,
 556                      int flags, void *cb_data, struct ref_entry *entry)
 557{
 558        if (strncmp(base, entry->name, trim))
 559                return 0;
 560
 561        if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
 562                if (entry->flag & REF_BROKEN)
 563                        return 0; /* ignore dangling symref */
 564                if (!has_sha1_file(entry->sha1)) {
 565                        error("%s does not point to a valid object!", entry->name);
 566                        return 0;
 567                }
 568        }
 569        current_ref = entry;
 570        return fn(entry->name + trim, entry->sha1, entry->flag, cb_data);
 571}
 572
 573static int filter_refs(const char *ref, const unsigned char *sha, int flags,
 574        void *data)
 575{
 576        struct ref_filter *filter = (struct ref_filter *)data;
 577        if (fnmatch(filter->pattern, ref, 0))
 578                return 0;
 579        return filter->fn(ref, sha, flags, filter->cb_data);
 580}
 581
 582int peel_ref(const char *ref, unsigned char *sha1)
 583{
 584        int flag;
 585        unsigned char base[20];
 586        struct object *o;
 587
 588        if (current_ref && (current_ref->name == ref
 589                || !strcmp(current_ref->name, ref))) {
 590                if (current_ref->flag & REF_KNOWS_PEELED) {
 591                        hashcpy(sha1, current_ref->peeled);
 592                        return 0;
 593                }
 594                hashcpy(base, current_ref->sha1);
 595                goto fallback;
 596        }
 597
 598        if (!resolve_ref(ref, base, 1, &flag))
 599                return -1;
 600
 601        if ((flag & REF_ISPACKED)) {
 602                struct ref_array *array = get_packed_refs(NULL);
 603                struct ref_entry *r = search_ref_array(array, ref);
 604
 605                if (r != NULL && r->flag & REF_KNOWS_PEELED) {
 606                        hashcpy(sha1, r->peeled);
 607                        return 0;
 608                }
 609        }
 610
 611fallback:
 612        o = parse_object(base);
 613        if (o && o->type == OBJ_TAG) {
 614                o = deref_tag(o, ref, 0);
 615                if (o) {
 616                        hashcpy(sha1, o->sha1);
 617                        return 0;
 618                }
 619        }
 620        return -1;
 621}
 622
 623static int do_for_each_ref(const char *submodule, const char *base, each_ref_fn fn,
 624                           int trim, int flags, void *cb_data)
 625{
 626        int retval = 0, i, p = 0, l = 0;
 627        struct ref_array *packed = get_packed_refs(submodule);
 628        struct ref_array *loose = get_loose_refs(submodule);
 629
 630        struct ref_array *extra = &extra_refs;
 631
 632        for (i = 0; i < extra->nr; i++)
 633                retval = do_one_ref(base, fn, trim, flags, cb_data, extra->refs[i]);
 634
 635        while (p < packed->nr && l < loose->nr) {
 636                struct ref_entry *entry;
 637                int cmp = strcmp(packed->refs[p]->name, loose->refs[l]->name);
 638                if (!cmp) {
 639                        p++;
 640                        continue;
 641                }
 642                if (cmp > 0) {
 643                        entry = loose->refs[l++];
 644                } else {
 645                        entry = packed->refs[p++];
 646                }
 647                retval = do_one_ref(base, fn, trim, flags, cb_data, entry);
 648                if (retval)
 649                        goto end_each;
 650        }
 651
 652        if (l < loose->nr) {
 653                p = l;
 654                packed = loose;
 655        }
 656
 657        for (; p < packed->nr; p++) {
 658                retval = do_one_ref(base, fn, trim, flags, cb_data, packed->refs[p]);
 659                if (retval)
 660                        goto end_each;
 661        }
 662
 663end_each:
 664        current_ref = NULL;
 665        return retval;
 666}
 667
 668
 669static int do_head_ref(const char *submodule, each_ref_fn fn, void *cb_data)
 670{
 671        unsigned char sha1[20];
 672        int flag;
 673
 674        if (submodule) {
 675                if (resolve_gitlink_ref(submodule, "HEAD", sha1) == 0)
 676                        return fn("HEAD", sha1, 0, cb_data);
 677
 678                return 0;
 679        }
 680
 681        if (resolve_ref("HEAD", sha1, 1, &flag))
 682                return fn("HEAD", sha1, flag, cb_data);
 683
 684        return 0;
 685}
 686
 687int head_ref(each_ref_fn fn, void *cb_data)
 688{
 689        return do_head_ref(NULL, fn, cb_data);
 690}
 691
 692int head_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
 693{
 694        return do_head_ref(submodule, fn, cb_data);
 695}
 696
 697int for_each_ref(each_ref_fn fn, void *cb_data)
 698{
 699        return do_for_each_ref(NULL, "refs/", fn, 0, 0, cb_data);
 700}
 701
 702int for_each_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
 703{
 704        return do_for_each_ref(submodule, "refs/", fn, 0, 0, cb_data);
 705}
 706
 707int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
 708{
 709        return do_for_each_ref(NULL, prefix, fn, strlen(prefix), 0, cb_data);
 710}
 711
 712int for_each_ref_in_submodule(const char *submodule, const char *prefix,
 713                each_ref_fn fn, void *cb_data)
 714{
 715        return do_for_each_ref(submodule, prefix, fn, strlen(prefix), 0, cb_data);
 716}
 717
 718int for_each_tag_ref(each_ref_fn fn, void *cb_data)
 719{
 720        return for_each_ref_in("refs/tags/", fn, cb_data);
 721}
 722
 723int for_each_tag_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
 724{
 725        return for_each_ref_in_submodule(submodule, "refs/tags/", fn, cb_data);
 726}
 727
 728int for_each_branch_ref(each_ref_fn fn, void *cb_data)
 729{
 730        return for_each_ref_in("refs/heads/", fn, cb_data);
 731}
 732
 733int for_each_branch_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
 734{
 735        return for_each_ref_in_submodule(submodule, "refs/heads/", fn, cb_data);
 736}
 737
 738int for_each_remote_ref(each_ref_fn fn, void *cb_data)
 739{
 740        return for_each_ref_in("refs/remotes/", fn, cb_data);
 741}
 742
 743int for_each_remote_ref_submodule(const char *submodule, each_ref_fn fn, void *cb_data)
 744{
 745        return for_each_ref_in_submodule(submodule, "refs/remotes/", fn, cb_data);
 746}
 747
 748int for_each_replace_ref(each_ref_fn fn, void *cb_data)
 749{
 750        return do_for_each_ref(NULL, "refs/replace/", fn, 13, 0, cb_data);
 751}
 752
 753int for_each_glob_ref_in(each_ref_fn fn, const char *pattern,
 754        const char *prefix, void *cb_data)
 755{
 756        struct strbuf real_pattern = STRBUF_INIT;
 757        struct ref_filter filter;
 758        int ret;
 759
 760        if (!prefix && prefixcmp(pattern, "refs/"))
 761                strbuf_addstr(&real_pattern, "refs/");
 762        else if (prefix)
 763                strbuf_addstr(&real_pattern, prefix);
 764        strbuf_addstr(&real_pattern, pattern);
 765
 766        if (!has_glob_specials(pattern)) {
 767                /* Append implied '/' '*' if not present. */
 768                if (real_pattern.buf[real_pattern.len - 1] != '/')
 769                        strbuf_addch(&real_pattern, '/');
 770                /* No need to check for '*', there is none. */
 771                strbuf_addch(&real_pattern, '*');
 772        }
 773
 774        filter.pattern = real_pattern.buf;
 775        filter.fn = fn;
 776        filter.cb_data = cb_data;
 777        ret = for_each_ref(filter_refs, &filter);
 778
 779        strbuf_release(&real_pattern);
 780        return ret;
 781}
 782
 783int for_each_glob_ref(each_ref_fn fn, const char *pattern, void *cb_data)
 784{
 785        return for_each_glob_ref_in(fn, pattern, NULL, cb_data);
 786}
 787
 788int for_each_rawref(each_ref_fn fn, void *cb_data)
 789{
 790        return do_for_each_ref(NULL, "refs/", fn, 0,
 791                               DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
 792}
 793
 794/*
 795 * Make sure "ref" is something reasonable to have under ".git/refs/";
 796 * We do not like it if:
 797 *
 798 * - any path component of it begins with ".", or
 799 * - it has double dots "..", or
 800 * - it has ASCII control character, "~", "^", ":" or SP, anywhere, or
 801 * - it ends with a "/".
 802 * - it ends with ".lock"
 803 * - it contains a "\" (backslash)
 804 */
 805
 806static inline int bad_ref_char(int ch)
 807{
 808        if (((unsigned) ch) <= ' ' ||
 809            ch == '~' || ch == '^' || ch == ':' || ch == '\\')
 810                return 1;
 811        /* 2.13 Pattern Matching Notation */
 812        if (ch == '?' || ch == '[') /* Unsupported */
 813                return 1;
 814        if (ch == '*') /* Supported at the end */
 815                return 2;
 816        return 0;
 817}
 818
 819int check_ref_format(const char *ref)
 820{
 821        int ch, level, bad_type, last;
 822        int ret = CHECK_REF_FORMAT_OK;
 823        const char *cp = ref;
 824
 825        level = 0;
 826        while (1) {
 827                while ((ch = *cp++) == '/')
 828                        ; /* tolerate duplicated slashes */
 829                if (!ch)
 830                        /* should not end with slashes */
 831                        return CHECK_REF_FORMAT_ERROR;
 832
 833                /* we are at the beginning of the path component */
 834                if (ch == '.')
 835                        return CHECK_REF_FORMAT_ERROR;
 836                bad_type = bad_ref_char(ch);
 837                if (bad_type) {
 838                        if (bad_type == 2 && (!*cp || *cp == '/') &&
 839                            ret == CHECK_REF_FORMAT_OK)
 840                                ret = CHECK_REF_FORMAT_WILDCARD;
 841                        else
 842                                return CHECK_REF_FORMAT_ERROR;
 843                }
 844
 845                last = ch;
 846                /* scan the rest of the path component */
 847                while ((ch = *cp++) != 0) {
 848                        bad_type = bad_ref_char(ch);
 849                        if (bad_type)
 850                                return CHECK_REF_FORMAT_ERROR;
 851                        if (ch == '/')
 852                                break;
 853                        if (last == '.' && ch == '.')
 854                                return CHECK_REF_FORMAT_ERROR;
 855                        if (last == '@' && ch == '{')
 856                                return CHECK_REF_FORMAT_ERROR;
 857                        last = ch;
 858                }
 859                level++;
 860                if (!ch) {
 861                        if (ref <= cp - 2 && cp[-2] == '.')
 862                                return CHECK_REF_FORMAT_ERROR;
 863                        if (level < 2)
 864                                return CHECK_REF_FORMAT_ONELEVEL;
 865                        if (has_extension(ref, ".lock"))
 866                                return CHECK_REF_FORMAT_ERROR;
 867                        return ret;
 868                }
 869        }
 870}
 871
 872const char *prettify_refname(const char *name)
 873{
 874        return name + (
 875                !prefixcmp(name, "refs/heads/") ? 11 :
 876                !prefixcmp(name, "refs/tags/") ? 10 :
 877                !prefixcmp(name, "refs/remotes/") ? 13 :
 878                0);
 879}
 880
 881const char *ref_rev_parse_rules[] = {
 882        "%.*s",
 883        "refs/%.*s",
 884        "refs/tags/%.*s",
 885        "refs/heads/%.*s",
 886        "refs/remotes/%.*s",
 887        "refs/remotes/%.*s/HEAD",
 888        NULL
 889};
 890
 891const char *ref_fetch_rules[] = {
 892        "%.*s",
 893        "refs/%.*s",
 894        "refs/heads/%.*s",
 895        NULL
 896};
 897
 898int refname_match(const char *abbrev_name, const char *full_name, const char **rules)
 899{
 900        const char **p;
 901        const int abbrev_name_len = strlen(abbrev_name);
 902
 903        for (p = rules; *p; p++) {
 904                if (!strcmp(full_name, mkpath(*p, abbrev_name_len, abbrev_name))) {
 905                        return 1;
 906                }
 907        }
 908
 909        return 0;
 910}
 911
 912static struct ref_lock *verify_lock(struct ref_lock *lock,
 913        const unsigned char *old_sha1, int mustexist)
 914{
 915        if (!resolve_ref(lock->ref_name, lock->old_sha1, mustexist, NULL)) {
 916                error("Can't verify ref %s", lock->ref_name);
 917                unlock_ref(lock);
 918                return NULL;
 919        }
 920        if (hashcmp(lock->old_sha1, old_sha1)) {
 921                error("Ref %s is at %s but expected %s", lock->ref_name,
 922                        sha1_to_hex(lock->old_sha1), sha1_to_hex(old_sha1));
 923                unlock_ref(lock);
 924                return NULL;
 925        }
 926        return lock;
 927}
 928
 929static int remove_empty_directories(const char *file)
 930{
 931        /* we want to create a file but there is a directory there;
 932         * if that is an empty directory (or a directory that contains
 933         * only empty directories), remove them.
 934         */
 935        struct strbuf path;
 936        int result;
 937
 938        strbuf_init(&path, 20);
 939        strbuf_addstr(&path, file);
 940
 941        result = remove_dir_recursively(&path, REMOVE_DIR_EMPTY_ONLY);
 942
 943        strbuf_release(&path);
 944
 945        return result;
 946}
 947
 948static int is_refname_available(const char *ref, const char *oldref,
 949                                struct ref_array *array, int quiet)
 950{
 951        int i, namlen = strlen(ref); /* e.g. 'foo/bar' */
 952        for (i = 0; i < array->nr; i++ ) {
 953                struct ref_entry *entry = array->refs[i];
 954                /* entry->name could be 'foo' or 'foo/bar/baz' */
 955                if (!oldref || strcmp(oldref, entry->name)) {
 956                        int len = strlen(entry->name);
 957                        int cmplen = (namlen < len) ? namlen : len;
 958                        const char *lead = (namlen < len) ? entry->name : ref;
 959                        if (!strncmp(ref, entry->name, cmplen) &&
 960                            lead[cmplen] == '/') {
 961                                if (!quiet)
 962                                        error("'%s' exists; cannot create '%s'",
 963                                              entry->name, ref);
 964                                return 0;
 965                        }
 966                }
 967        }
 968        return 1;
 969}
 970
 971static struct ref_lock *lock_ref_sha1_basic(const char *ref, const unsigned char *old_sha1, int flags, int *type_p)
 972{
 973        char *ref_file;
 974        const char *orig_ref = ref;
 975        struct ref_lock *lock;
 976        int last_errno = 0;
 977        int type, lflags;
 978        int mustexist = (old_sha1 && !is_null_sha1(old_sha1));
 979        int missing = 0;
 980
 981        lock = xcalloc(1, sizeof(struct ref_lock));
 982        lock->lock_fd = -1;
 983
 984        ref = resolve_ref(ref, lock->old_sha1, mustexist, &type);
 985        if (!ref && errno == EISDIR) {
 986                /* we are trying to lock foo but we used to
 987                 * have foo/bar which now does not exist;
 988                 * it is normal for the empty directory 'foo'
 989                 * to remain.
 990                 */
 991                ref_file = git_path("%s", orig_ref);
 992                if (remove_empty_directories(ref_file)) {
 993                        last_errno = errno;
 994                        error("there are still refs under '%s'", orig_ref);
 995                        goto error_return;
 996                }
 997                ref = resolve_ref(orig_ref, lock->old_sha1, mustexist, &type);
 998        }
 999        if (type_p)
1000            *type_p = type;
1001        if (!ref) {
1002                last_errno = errno;
1003                error("unable to resolve reference %s: %s",
1004                        orig_ref, strerror(errno));
1005                goto error_return;
1006        }
1007        missing = is_null_sha1(lock->old_sha1);
1008        /* When the ref did not exist and we are creating it,
1009         * make sure there is no existing ref that is packed
1010         * whose name begins with our refname, nor a ref whose
1011         * name is a proper prefix of our refname.
1012         */
1013        if (missing &&
1014             !is_refname_available(ref, NULL, get_packed_refs(NULL), 0)) {
1015                last_errno = ENOTDIR;
1016                goto error_return;
1017        }
1018
1019        lock->lk = xcalloc(1, sizeof(struct lock_file));
1020
1021        lflags = LOCK_DIE_ON_ERROR;
1022        if (flags & REF_NODEREF) {
1023                ref = orig_ref;
1024                lflags |= LOCK_NODEREF;
1025        }
1026        lock->ref_name = xstrdup(ref);
1027        lock->orig_ref_name = xstrdup(orig_ref);
1028        ref_file = git_path("%s", ref);
1029        if (missing)
1030                lock->force_write = 1;
1031        if ((flags & REF_NODEREF) && (type & REF_ISSYMREF))
1032                lock->force_write = 1;
1033
1034        if (safe_create_leading_directories(ref_file)) {
1035                last_errno = errno;
1036                error("unable to create directory for %s", ref_file);
1037                goto error_return;
1038        }
1039
1040        lock->lock_fd = hold_lock_file_for_update(lock->lk, ref_file, lflags);
1041        return old_sha1 ? verify_lock(lock, old_sha1, mustexist) : lock;
1042
1043 error_return:
1044        unlock_ref(lock);
1045        errno = last_errno;
1046        return NULL;
1047}
1048
1049struct ref_lock *lock_ref_sha1(const char *ref, const unsigned char *old_sha1)
1050{
1051        char refpath[PATH_MAX];
1052        if (check_ref_format(ref))
1053                return NULL;
1054        strcpy(refpath, mkpath("refs/%s", ref));
1055        return lock_ref_sha1_basic(refpath, old_sha1, 0, NULL);
1056}
1057
1058struct ref_lock *lock_any_ref_for_update(const char *ref, const unsigned char *old_sha1, int flags)
1059{
1060        switch (check_ref_format(ref)) {
1061        default:
1062                return NULL;
1063        case 0:
1064        case CHECK_REF_FORMAT_ONELEVEL:
1065                return lock_ref_sha1_basic(ref, old_sha1, flags, NULL);
1066        }
1067}
1068
1069static struct lock_file packlock;
1070
1071static int repack_without_ref(const char *refname)
1072{
1073        struct ref_array *packed;
1074        struct ref_entry *ref;
1075        int fd, i;
1076
1077        packed = get_packed_refs(NULL);
1078        ref = search_ref_array(packed, refname);
1079        if (ref == NULL)
1080                return 0;
1081        fd = hold_lock_file_for_update(&packlock, git_path("packed-refs"), 0);
1082        if (fd < 0) {
1083                unable_to_lock_error(git_path("packed-refs"), errno);
1084                return error("cannot delete '%s' from packed refs", refname);
1085        }
1086
1087        for (i = 0; i < packed->nr; i++) {
1088                char line[PATH_MAX + 100];
1089                int len;
1090
1091                ref = packed->refs[i];
1092
1093                if (!strcmp(refname, ref->name))
1094                        continue;
1095                len = snprintf(line, sizeof(line), "%s %s\n",
1096                               sha1_to_hex(ref->sha1), ref->name);
1097                /* this should not happen but just being defensive */
1098                if (len > sizeof(line))
1099                        die("too long a refname '%s'", ref->name);
1100                write_or_die(fd, line, len);
1101        }
1102        return commit_lock_file(&packlock);
1103}
1104
1105int delete_ref(const char *refname, const unsigned char *sha1, int delopt)
1106{
1107        struct ref_lock *lock;
1108        int err, i = 0, ret = 0, flag = 0;
1109
1110        lock = lock_ref_sha1_basic(refname, sha1, 0, &flag);
1111        if (!lock)
1112                return 1;
1113        if (!(flag & REF_ISPACKED) || flag & REF_ISSYMREF) {
1114                /* loose */
1115                const char *path;
1116
1117                if (!(delopt & REF_NODEREF)) {
1118                        i = strlen(lock->lk->filename) - 5; /* .lock */
1119                        lock->lk->filename[i] = 0;
1120                        path = lock->lk->filename;
1121                } else {
1122                        path = git_path("%s", refname);
1123                }
1124                err = unlink_or_warn(path);
1125                if (err && errno != ENOENT)
1126                        ret = 1;
1127
1128                if (!(delopt & REF_NODEREF))
1129                        lock->lk->filename[i] = '.';
1130        }
1131        /* removing the loose one could have resurrected an earlier
1132         * packed one.  Also, if it was not loose we need to repack
1133         * without it.
1134         */
1135        ret |= repack_without_ref(refname);
1136
1137        unlink_or_warn(git_path("logs/%s", lock->ref_name));
1138        invalidate_cached_refs();
1139        unlock_ref(lock);
1140        return ret;
1141}
1142
1143/*
1144 * People using contrib's git-new-workdir have .git/logs/refs ->
1145 * /some/other/path/.git/logs/refs, and that may live on another device.
1146 *
1147 * IOW, to avoid cross device rename errors, the temporary renamed log must
1148 * live into logs/refs.
1149 */
1150#define TMP_RENAMED_LOG  "logs/refs/.tmp-renamed-log"
1151
1152int rename_ref(const char *oldref, const char *newref, const char *logmsg)
1153{
1154        static const char renamed_ref[] = "RENAMED-REF";
1155        unsigned char sha1[20], orig_sha1[20];
1156        int flag = 0, logmoved = 0;
1157        struct ref_lock *lock;
1158        struct stat loginfo;
1159        int log = !lstat(git_path("logs/%s", oldref), &loginfo);
1160        const char *symref = NULL;
1161
1162        if (log && S_ISLNK(loginfo.st_mode))
1163                return error("reflog for %s is a symlink", oldref);
1164
1165        symref = resolve_ref(oldref, orig_sha1, 1, &flag);
1166        if (flag & REF_ISSYMREF)
1167                return error("refname %s is a symbolic ref, renaming it is not supported",
1168                        oldref);
1169        if (!symref)
1170                return error("refname %s not found", oldref);
1171
1172        if (!is_refname_available(newref, oldref, get_packed_refs(NULL), 0))
1173                return 1;
1174
1175        if (!is_refname_available(newref, oldref, get_loose_refs(NULL), 0))
1176                return 1;
1177
1178        lock = lock_ref_sha1_basic(renamed_ref, NULL, 0, NULL);
1179        if (!lock)
1180                return error("unable to lock %s", renamed_ref);
1181        lock->force_write = 1;
1182        if (write_ref_sha1(lock, orig_sha1, logmsg))
1183                return error("unable to save current sha1 in %s", renamed_ref);
1184
1185        if (log && rename(git_path("logs/%s", oldref), git_path(TMP_RENAMED_LOG)))
1186                return error("unable to move logfile logs/%s to "TMP_RENAMED_LOG": %s",
1187                        oldref, strerror(errno));
1188
1189        if (delete_ref(oldref, orig_sha1, REF_NODEREF)) {
1190                error("unable to delete old %s", oldref);
1191                goto rollback;
1192        }
1193
1194        if (resolve_ref(newref, sha1, 1, &flag) && delete_ref(newref, sha1, REF_NODEREF)) {
1195                if (errno==EISDIR) {
1196                        if (remove_empty_directories(git_path("%s", newref))) {
1197                                error("Directory not empty: %s", newref);
1198                                goto rollback;
1199                        }
1200                } else {
1201                        error("unable to delete existing %s", newref);
1202                        goto rollback;
1203                }
1204        }
1205
1206        if (log && safe_create_leading_directories(git_path("logs/%s", newref))) {
1207                error("unable to create directory for %s", newref);
1208                goto rollback;
1209        }
1210
1211 retry:
1212        if (log && rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", newref))) {
1213                if (errno==EISDIR || errno==ENOTDIR) {
1214                        /*
1215                         * rename(a, b) when b is an existing
1216                         * directory ought to result in ISDIR, but
1217                         * Solaris 5.8 gives ENOTDIR.  Sheesh.
1218                         */
1219                        if (remove_empty_directories(git_path("logs/%s", newref))) {
1220                                error("Directory not empty: logs/%s", newref);
1221                                goto rollback;
1222                        }
1223                        goto retry;
1224                } else {
1225                        error("unable to move logfile "TMP_RENAMED_LOG" to logs/%s: %s",
1226                                newref, strerror(errno));
1227                        goto rollback;
1228                }
1229        }
1230        logmoved = log;
1231
1232        lock = lock_ref_sha1_basic(newref, NULL, 0, NULL);
1233        if (!lock) {
1234                error("unable to lock %s for update", newref);
1235                goto rollback;
1236        }
1237        lock->force_write = 1;
1238        hashcpy(lock->old_sha1, orig_sha1);
1239        if (write_ref_sha1(lock, orig_sha1, logmsg)) {
1240                error("unable to write current sha1 into %s", newref);
1241                goto rollback;
1242        }
1243
1244        return 0;
1245
1246 rollback:
1247        lock = lock_ref_sha1_basic(oldref, NULL, 0, NULL);
1248        if (!lock) {
1249                error("unable to lock %s for rollback", oldref);
1250                goto rollbacklog;
1251        }
1252
1253        lock->force_write = 1;
1254        flag = log_all_ref_updates;
1255        log_all_ref_updates = 0;
1256        if (write_ref_sha1(lock, orig_sha1, NULL))
1257                error("unable to write current sha1 into %s", oldref);
1258        log_all_ref_updates = flag;
1259
1260 rollbacklog:
1261        if (logmoved && rename(git_path("logs/%s", newref), git_path("logs/%s", oldref)))
1262                error("unable to restore logfile %s from %s: %s",
1263                        oldref, newref, strerror(errno));
1264        if (!logmoved && log &&
1265            rename(git_path(TMP_RENAMED_LOG), git_path("logs/%s", oldref)))
1266                error("unable to restore logfile %s from "TMP_RENAMED_LOG": %s",
1267                        oldref, strerror(errno));
1268
1269        return 1;
1270}
1271
1272int close_ref(struct ref_lock *lock)
1273{
1274        if (close_lock_file(lock->lk))
1275                return -1;
1276        lock->lock_fd = -1;
1277        return 0;
1278}
1279
1280int commit_ref(struct ref_lock *lock)
1281{
1282        if (commit_lock_file(lock->lk))
1283                return -1;
1284        lock->lock_fd = -1;
1285        return 0;
1286}
1287
1288void unlock_ref(struct ref_lock *lock)
1289{
1290        /* Do not free lock->lk -- atexit() still looks at them */
1291        if (lock->lk)
1292                rollback_lock_file(lock->lk);
1293        free(lock->ref_name);
1294        free(lock->orig_ref_name);
1295        free(lock);
1296}
1297
1298/*
1299 * copy the reflog message msg to buf, which has been allocated sufficiently
1300 * large, while cleaning up the whitespaces.  Especially, convert LF to space,
1301 * because reflog file is one line per entry.
1302 */
1303static int copy_msg(char *buf, const char *msg)
1304{
1305        char *cp = buf;
1306        char c;
1307        int wasspace = 1;
1308
1309        *cp++ = '\t';
1310        while ((c = *msg++)) {
1311                if (wasspace && isspace(c))
1312                        continue;
1313                wasspace = isspace(c);
1314                if (wasspace)
1315                        c = ' ';
1316                *cp++ = c;
1317        }
1318        while (buf < cp && isspace(cp[-1]))
1319                cp--;
1320        *cp++ = '\n';
1321        return cp - buf;
1322}
1323
1324int log_ref_setup(const char *ref_name, char *logfile, int bufsize)
1325{
1326        int logfd, oflags = O_APPEND | O_WRONLY;
1327
1328        git_snpath(logfile, bufsize, "logs/%s", ref_name);
1329        if (log_all_ref_updates &&
1330            (!prefixcmp(ref_name, "refs/heads/") ||
1331             !prefixcmp(ref_name, "refs/remotes/") ||
1332             !prefixcmp(ref_name, "refs/notes/") ||
1333             !strcmp(ref_name, "HEAD"))) {
1334                if (safe_create_leading_directories(logfile) < 0)
1335                        return error("unable to create directory for %s",
1336                                     logfile);
1337                oflags |= O_CREAT;
1338        }
1339
1340        logfd = open(logfile, oflags, 0666);
1341        if (logfd < 0) {
1342                if (!(oflags & O_CREAT) && errno == ENOENT)
1343                        return 0;
1344
1345                if ((oflags & O_CREAT) && errno == EISDIR) {
1346                        if (remove_empty_directories(logfile)) {
1347                                return error("There are still logs under '%s'",
1348                                             logfile);
1349                        }
1350                        logfd = open(logfile, oflags, 0666);
1351                }
1352
1353                if (logfd < 0)
1354                        return error("Unable to append to %s: %s",
1355                                     logfile, strerror(errno));
1356        }
1357
1358        adjust_shared_perm(logfile);
1359        close(logfd);
1360        return 0;
1361}
1362
1363static int log_ref_write(const char *ref_name, const unsigned char *old_sha1,
1364                         const unsigned char *new_sha1, const char *msg)
1365{
1366        int logfd, result, written, oflags = O_APPEND | O_WRONLY;
1367        unsigned maxlen, len;
1368        int msglen;
1369        char log_file[PATH_MAX];
1370        char *logrec;
1371        const char *committer;
1372
1373        if (log_all_ref_updates < 0)
1374                log_all_ref_updates = !is_bare_repository();
1375
1376        result = log_ref_setup(ref_name, log_file, sizeof(log_file));
1377        if (result)
1378                return result;
1379
1380        logfd = open(log_file, oflags);
1381        if (logfd < 0)
1382                return 0;
1383        msglen = msg ? strlen(msg) : 0;
1384        committer = git_committer_info(0);
1385        maxlen = strlen(committer) + msglen + 100;
1386        logrec = xmalloc(maxlen);
1387        len = sprintf(logrec, "%s %s %s\n",
1388                      sha1_to_hex(old_sha1),
1389                      sha1_to_hex(new_sha1),
1390                      committer);
1391        if (msglen)
1392                len += copy_msg(logrec + len - 1, msg) - 1;
1393        written = len <= maxlen ? write_in_full(logfd, logrec, len) : -1;
1394        free(logrec);
1395        if (close(logfd) != 0 || written != len)
1396                return error("Unable to append to %s", log_file);
1397        return 0;
1398}
1399
1400static int is_branch(const char *refname)
1401{
1402        return !strcmp(refname, "HEAD") || !prefixcmp(refname, "refs/heads/");
1403}
1404
1405int write_ref_sha1(struct ref_lock *lock,
1406        const unsigned char *sha1, const char *logmsg)
1407{
1408        static char term = '\n';
1409        struct object *o;
1410
1411        if (!lock)
1412                return -1;
1413        if (!lock->force_write && !hashcmp(lock->old_sha1, sha1)) {
1414                unlock_ref(lock);
1415                return 0;
1416        }
1417        o = parse_object(sha1);
1418        if (!o) {
1419                error("Trying to write ref %s with nonexistant object %s",
1420                        lock->ref_name, sha1_to_hex(sha1));
1421                unlock_ref(lock);
1422                return -1;
1423        }
1424        if (o->type != OBJ_COMMIT && is_branch(lock->ref_name)) {
1425                error("Trying to write non-commit object %s to branch %s",
1426                        sha1_to_hex(sha1), lock->ref_name);
1427                unlock_ref(lock);
1428                return -1;
1429        }
1430        if (write_in_full(lock->lock_fd, sha1_to_hex(sha1), 40) != 40 ||
1431            write_in_full(lock->lock_fd, &term, 1) != 1
1432                || close_ref(lock) < 0) {
1433                error("Couldn't write %s", lock->lk->filename);
1434                unlock_ref(lock);
1435                return -1;
1436        }
1437        invalidate_cached_refs();
1438        if (log_ref_write(lock->ref_name, lock->old_sha1, sha1, logmsg) < 0 ||
1439            (strcmp(lock->ref_name, lock->orig_ref_name) &&
1440             log_ref_write(lock->orig_ref_name, lock->old_sha1, sha1, logmsg) < 0)) {
1441                unlock_ref(lock);
1442                return -1;
1443        }
1444        if (strcmp(lock->orig_ref_name, "HEAD") != 0) {
1445                /*
1446                 * Special hack: If a branch is updated directly and HEAD
1447                 * points to it (may happen on the remote side of a push
1448                 * for example) then logically the HEAD reflog should be
1449                 * updated too.
1450                 * A generic solution implies reverse symref information,
1451                 * but finding all symrefs pointing to the given branch
1452                 * would be rather costly for this rare event (the direct
1453                 * update of a branch) to be worth it.  So let's cheat and
1454                 * check with HEAD only which should cover 99% of all usage
1455                 * scenarios (even 100% of the default ones).
1456                 */
1457                unsigned char head_sha1[20];
1458                int head_flag;
1459                const char *head_ref;
1460                head_ref = resolve_ref("HEAD", head_sha1, 1, &head_flag);
1461                if (head_ref && (head_flag & REF_ISSYMREF) &&
1462                    !strcmp(head_ref, lock->ref_name))
1463                        log_ref_write("HEAD", lock->old_sha1, sha1, logmsg);
1464        }
1465        if (commit_ref(lock)) {
1466                error("Couldn't set %s", lock->ref_name);
1467                unlock_ref(lock);
1468                return -1;
1469        }
1470        unlock_ref(lock);
1471        return 0;
1472}
1473
1474int create_symref(const char *ref_target, const char *refs_heads_master,
1475                  const char *logmsg)
1476{
1477        const char *lockpath;
1478        char ref[1000];
1479        int fd, len, written;
1480        char *git_HEAD = git_pathdup("%s", ref_target);
1481        unsigned char old_sha1[20], new_sha1[20];
1482
1483        if (logmsg && read_ref(ref_target, old_sha1))
1484                hashclr(old_sha1);
1485
1486        if (safe_create_leading_directories(git_HEAD) < 0)
1487                return error("unable to create directory for %s", git_HEAD);
1488
1489#ifndef NO_SYMLINK_HEAD
1490        if (prefer_symlink_refs) {
1491                unlink(git_HEAD);
1492                if (!symlink(refs_heads_master, git_HEAD))
1493                        goto done;
1494                fprintf(stderr, "no symlink - falling back to symbolic ref\n");
1495        }
1496#endif
1497
1498        len = snprintf(ref, sizeof(ref), "ref: %s\n", refs_heads_master);
1499        if (sizeof(ref) <= len) {
1500                error("refname too long: %s", refs_heads_master);
1501                goto error_free_return;
1502        }
1503        lockpath = mkpath("%s.lock", git_HEAD);
1504        fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666);
1505        if (fd < 0) {
1506                error("Unable to open %s for writing", lockpath);
1507                goto error_free_return;
1508        }
1509        written = write_in_full(fd, ref, len);
1510        if (close(fd) != 0 || written != len) {
1511                error("Unable to write to %s", lockpath);
1512                goto error_unlink_return;
1513        }
1514        if (rename(lockpath, git_HEAD) < 0) {
1515                error("Unable to create %s", git_HEAD);
1516                goto error_unlink_return;
1517        }
1518        if (adjust_shared_perm(git_HEAD)) {
1519                error("Unable to fix permissions on %s", lockpath);
1520        error_unlink_return:
1521                unlink_or_warn(lockpath);
1522        error_free_return:
1523                free(git_HEAD);
1524                return -1;
1525        }
1526
1527#ifndef NO_SYMLINK_HEAD
1528        done:
1529#endif
1530        if (logmsg && !read_ref(refs_heads_master, new_sha1))
1531                log_ref_write(ref_target, old_sha1, new_sha1, logmsg);
1532
1533        free(git_HEAD);
1534        return 0;
1535}
1536
1537static char *ref_msg(const char *line, const char *endp)
1538{
1539        const char *ep;
1540        line += 82;
1541        ep = memchr(line, '\n', endp - line);
1542        if (!ep)
1543                ep = endp;
1544        return xmemdupz(line, ep - line);
1545}
1546
1547int 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)
1548{
1549        const char *logfile, *logdata, *logend, *rec, *lastgt, *lastrec;
1550        char *tz_c;
1551        int logfd, tz, reccnt = 0;
1552        struct stat st;
1553        unsigned long date;
1554        unsigned char logged_sha1[20];
1555        void *log_mapped;
1556        size_t mapsz;
1557
1558        logfile = git_path("logs/%s", ref);
1559        logfd = open(logfile, O_RDONLY, 0);
1560        if (logfd < 0)
1561                die_errno("Unable to read log '%s'", logfile);
1562        fstat(logfd, &st);
1563        if (!st.st_size)
1564                die("Log %s is empty.", logfile);
1565        mapsz = xsize_t(st.st_size);
1566        log_mapped = xmmap(NULL, mapsz, PROT_READ, MAP_PRIVATE, logfd, 0);
1567        logdata = log_mapped;
1568        close(logfd);
1569
1570        lastrec = NULL;
1571        rec = logend = logdata + st.st_size;
1572        while (logdata < rec) {
1573                reccnt++;
1574                if (logdata < rec && *(rec-1) == '\n')
1575                        rec--;
1576                lastgt = NULL;
1577                while (logdata < rec && *(rec-1) != '\n') {
1578                        rec--;
1579                        if (*rec == '>')
1580                                lastgt = rec;
1581                }
1582                if (!lastgt)
1583                        die("Log %s is corrupt.", logfile);
1584                date = strtoul(lastgt + 1, &tz_c, 10);
1585                if (date <= at_time || cnt == 0) {
1586                        tz = strtoul(tz_c, NULL, 10);
1587                        if (msg)
1588                                *msg = ref_msg(rec, logend);
1589                        if (cutoff_time)
1590                                *cutoff_time = date;
1591                        if (cutoff_tz)
1592                                *cutoff_tz = tz;
1593                        if (cutoff_cnt)
1594                                *cutoff_cnt = reccnt - 1;
1595                        if (lastrec) {
1596                                if (get_sha1_hex(lastrec, logged_sha1))
1597                                        die("Log %s is corrupt.", logfile);
1598                                if (get_sha1_hex(rec + 41, sha1))
1599                                        die("Log %s is corrupt.", logfile);
1600                                if (hashcmp(logged_sha1, sha1)) {
1601                                        warning("Log %s has gap after %s.",
1602                                                logfile, show_date(date, tz, DATE_RFC2822));
1603                                }
1604                        }
1605                        else if (date == at_time) {
1606                                if (get_sha1_hex(rec + 41, sha1))
1607                                        die("Log %s is corrupt.", logfile);
1608                        }
1609                        else {
1610                                if (get_sha1_hex(rec + 41, logged_sha1))
1611                                        die("Log %s is corrupt.", logfile);
1612                                if (hashcmp(logged_sha1, sha1)) {
1613                                        warning("Log %s unexpectedly ended on %s.",
1614                                                logfile, show_date(date, tz, DATE_RFC2822));
1615                                }
1616                        }
1617                        munmap(log_mapped, mapsz);
1618                        return 0;
1619                }
1620                lastrec = rec;
1621                if (cnt > 0)
1622                        cnt--;
1623        }
1624
1625        rec = logdata;
1626        while (rec < logend && *rec != '>' && *rec != '\n')
1627                rec++;
1628        if (rec == logend || *rec == '\n')
1629                die("Log %s is corrupt.", logfile);
1630        date = strtoul(rec + 1, &tz_c, 10);
1631        tz = strtoul(tz_c, NULL, 10);
1632        if (get_sha1_hex(logdata, sha1))
1633                die("Log %s is corrupt.", logfile);
1634        if (is_null_sha1(sha1)) {
1635                if (get_sha1_hex(logdata + 41, sha1))
1636                        die("Log %s is corrupt.", logfile);
1637        }
1638        if (msg)
1639                *msg = ref_msg(logdata, logend);
1640        munmap(log_mapped, mapsz);
1641
1642        if (cutoff_time)
1643                *cutoff_time = date;
1644        if (cutoff_tz)
1645                *cutoff_tz = tz;
1646        if (cutoff_cnt)
1647                *cutoff_cnt = reccnt;
1648        return 1;
1649}
1650
1651int for_each_recent_reflog_ent(const char *ref, each_reflog_ent_fn fn, long ofs, void *cb_data)
1652{
1653        const char *logfile;
1654        FILE *logfp;
1655        struct strbuf sb = STRBUF_INIT;
1656        int ret = 0;
1657
1658        logfile = git_path("logs/%s", ref);
1659        logfp = fopen(logfile, "r");
1660        if (!logfp)
1661                return -1;
1662
1663        if (ofs) {
1664                struct stat statbuf;
1665                if (fstat(fileno(logfp), &statbuf) ||
1666                    statbuf.st_size < ofs ||
1667                    fseek(logfp, -ofs, SEEK_END) ||
1668                    strbuf_getwholeline(&sb, logfp, '\n')) {
1669                        fclose(logfp);
1670                        strbuf_release(&sb);
1671                        return -1;
1672                }
1673        }
1674
1675        while (!strbuf_getwholeline(&sb, logfp, '\n')) {
1676                unsigned char osha1[20], nsha1[20];
1677                char *email_end, *message;
1678                unsigned long timestamp;
1679                int tz;
1680
1681                /* old SP new SP name <email> SP time TAB msg LF */
1682                if (sb.len < 83 || sb.buf[sb.len - 1] != '\n' ||
1683                    get_sha1_hex(sb.buf, osha1) || sb.buf[40] != ' ' ||
1684                    get_sha1_hex(sb.buf + 41, nsha1) || sb.buf[81] != ' ' ||
1685                    !(email_end = strchr(sb.buf + 82, '>')) ||
1686                    email_end[1] != ' ' ||
1687                    !(timestamp = strtoul(email_end + 2, &message, 10)) ||
1688                    !message || message[0] != ' ' ||
1689                    (message[1] != '+' && message[1] != '-') ||
1690                    !isdigit(message[2]) || !isdigit(message[3]) ||
1691                    !isdigit(message[4]) || !isdigit(message[5]))
1692                        continue; /* corrupt? */
1693                email_end[1] = '\0';
1694                tz = strtol(message + 1, NULL, 10);
1695                if (message[6] != '\t')
1696                        message += 6;
1697                else
1698                        message += 7;
1699                ret = fn(osha1, nsha1, sb.buf + 82, timestamp, tz, message,
1700                         cb_data);
1701                if (ret)
1702                        break;
1703        }
1704        fclose(logfp);
1705        strbuf_release(&sb);
1706        return ret;
1707}
1708
1709int for_each_reflog_ent(const char *ref, each_reflog_ent_fn fn, void *cb_data)
1710{
1711        return for_each_recent_reflog_ent(ref, fn, 0, cb_data);
1712}
1713
1714static int do_for_each_reflog(const char *base, each_ref_fn fn, void *cb_data)
1715{
1716        DIR *dir = opendir(git_path("logs/%s", base));
1717        int retval = 0;
1718
1719        if (dir) {
1720                struct dirent *de;
1721                int baselen = strlen(base);
1722                char *log = xmalloc(baselen + 257);
1723
1724                memcpy(log, base, baselen);
1725                if (baselen && base[baselen-1] != '/')
1726                        log[baselen++] = '/';
1727
1728                while ((de = readdir(dir)) != NULL) {
1729                        struct stat st;
1730                        int namelen;
1731
1732                        if (de->d_name[0] == '.')
1733                                continue;
1734                        namelen = strlen(de->d_name);
1735                        if (namelen > 255)
1736                                continue;
1737                        if (has_extension(de->d_name, ".lock"))
1738                                continue;
1739                        memcpy(log + baselen, de->d_name, namelen+1);
1740                        if (stat(git_path("logs/%s", log), &st) < 0)
1741                                continue;
1742                        if (S_ISDIR(st.st_mode)) {
1743                                retval = do_for_each_reflog(log, fn, cb_data);
1744                        } else {
1745                                unsigned char sha1[20];
1746                                if (!resolve_ref(log, sha1, 0, NULL))
1747                                        retval = error("bad ref for %s", log);
1748                                else
1749                                        retval = fn(log, sha1, 0, cb_data);
1750                        }
1751                        if (retval)
1752                                break;
1753                }
1754                free(log);
1755                closedir(dir);
1756        }
1757        else if (*base)
1758                return errno;
1759        return retval;
1760}
1761
1762int for_each_reflog(each_ref_fn fn, void *cb_data)
1763{
1764        return do_for_each_reflog("", fn, cb_data);
1765}
1766
1767int update_ref(const char *action, const char *refname,
1768                const unsigned char *sha1, const unsigned char *oldval,
1769                int flags, enum action_on_err onerr)
1770{
1771        static struct ref_lock *lock;
1772        lock = lock_any_ref_for_update(refname, oldval, flags);
1773        if (!lock) {
1774                const char *str = "Cannot lock the ref '%s'.";
1775                switch (onerr) {
1776                case MSG_ON_ERR: error(str, refname); break;
1777                case DIE_ON_ERR: die(str, refname); break;
1778                case QUIET_ON_ERR: break;
1779                }
1780                return 1;
1781        }
1782        if (write_ref_sha1(lock, sha1, action) < 0) {
1783                const char *str = "Cannot update the ref '%s'.";
1784                switch (onerr) {
1785                case MSG_ON_ERR: error(str, refname); break;
1786                case DIE_ON_ERR: die(str, refname); break;
1787                case QUIET_ON_ERR: break;
1788                }
1789                return 1;
1790        }
1791        return 0;
1792}
1793
1794struct ref *find_ref_by_name(const struct ref *list, const char *name)
1795{
1796        for ( ; list; list = list->next)
1797                if (!strcmp(list->name, name))
1798                        return (struct ref *)list;
1799        return NULL;
1800}
1801
1802/*
1803 * generate a format suitable for scanf from a ref_rev_parse_rules
1804 * rule, that is replace the "%.*s" spec with a "%s" spec
1805 */
1806static void gen_scanf_fmt(char *scanf_fmt, const char *rule)
1807{
1808        char *spec;
1809
1810        spec = strstr(rule, "%.*s");
1811        if (!spec || strstr(spec + 4, "%.*s"))
1812                die("invalid rule in ref_rev_parse_rules: %s", rule);
1813
1814        /* copy all until spec */
1815        strncpy(scanf_fmt, rule, spec - rule);
1816        scanf_fmt[spec - rule] = '\0';
1817        /* copy new spec */
1818        strcat(scanf_fmt, "%s");
1819        /* copy remaining rule */
1820        strcat(scanf_fmt, spec + 4);
1821
1822        return;
1823}
1824
1825char *shorten_unambiguous_ref(const char *ref, int strict)
1826{
1827        int i;
1828        static char **scanf_fmts;
1829        static int nr_rules;
1830        char *short_name;
1831
1832        /* pre generate scanf formats from ref_rev_parse_rules[] */
1833        if (!nr_rules) {
1834                size_t total_len = 0;
1835
1836                /* the rule list is NULL terminated, count them first */
1837                for (; ref_rev_parse_rules[nr_rules]; nr_rules++)
1838                        /* no +1 because strlen("%s") < strlen("%.*s") */
1839                        total_len += strlen(ref_rev_parse_rules[nr_rules]);
1840
1841                scanf_fmts = xmalloc(nr_rules * sizeof(char *) + total_len);
1842
1843                total_len = 0;
1844                for (i = 0; i < nr_rules; i++) {
1845                        scanf_fmts[i] = (char *)&scanf_fmts[nr_rules]
1846                                        + total_len;
1847                        gen_scanf_fmt(scanf_fmts[i], ref_rev_parse_rules[i]);
1848                        total_len += strlen(ref_rev_parse_rules[i]);
1849                }
1850        }
1851
1852        /* bail out if there are no rules */
1853        if (!nr_rules)
1854                return xstrdup(ref);
1855
1856        /* buffer for scanf result, at most ref must fit */
1857        short_name = xstrdup(ref);
1858
1859        /* skip first rule, it will always match */
1860        for (i = nr_rules - 1; i > 0 ; --i) {
1861                int j;
1862                int rules_to_fail = i;
1863                int short_name_len;
1864
1865                if (1 != sscanf(ref, scanf_fmts[i], short_name))
1866                        continue;
1867
1868                short_name_len = strlen(short_name);
1869
1870                /*
1871                 * in strict mode, all (except the matched one) rules
1872                 * must fail to resolve to a valid non-ambiguous ref
1873                 */
1874                if (strict)
1875                        rules_to_fail = nr_rules;
1876
1877                /*
1878                 * check if the short name resolves to a valid ref,
1879                 * but use only rules prior to the matched one
1880                 */
1881                for (j = 0; j < rules_to_fail; j++) {
1882                        const char *rule = ref_rev_parse_rules[j];
1883                        unsigned char short_objectname[20];
1884                        char refname[PATH_MAX];
1885
1886                        /* skip matched rule */
1887                        if (i == j)
1888                                continue;
1889
1890                        /*
1891                         * the short name is ambiguous, if it resolves
1892                         * (with this previous rule) to a valid ref
1893                         * read_ref() returns 0 on success
1894                         */
1895                        mksnpath(refname, sizeof(refname),
1896                                 rule, short_name_len, short_name);
1897                        if (!read_ref(refname, short_objectname))
1898                                break;
1899                }
1900
1901                /*
1902                 * short name is non-ambiguous if all previous rules
1903                 * haven't resolved to a valid ref
1904                 */
1905                if (j == rules_to_fail)
1906                        return short_name;
1907        }
1908
1909        free(short_name);
1910        return xstrdup(ref);
1911}