void load_command_list(const char *prefix, struct cmdnames *main_cmds, struct cmdnames *other_cmds) { const char *env_path = getenv("PATH"); const char *exec_path = git_exec_path(); if (exec_path) { list_commands_in_dir(main_cmds, exec_path, prefix); QSORT(main_cmds->names, main_cmds->cnt, cmdname_compare); uniq(main_cmds); } if (env_path) { char *paths, *path, *colon; path = paths = xstrdup(env_path); while (1) { if ((colon = strchr(path, PATH_SEP))) *colon = 0; if (!exec_path || strcmp(path, exec_path)) list_commands_in_dir(other_cmds, path, prefix); if (!colon) break; path = colon + 1; } free(paths); QSORT(other_cmds->names, other_cmds->cnt, cmdname_compare); uniq(other_cmds); } exclude_cmds(other_cmds, main_cmds); }
void printcsordered(const stack *st) { agent i, j, k = 0, m = st->n[N]; const agent *p = st->n + N + 1; agent cst[N]; memcpy(cst, st->cs, sizeof(agent) * N); typedef struct { agent a; uint32_t x; } coal; coal ct[N]; do { ct[k].a = i = *(p++); ct[k].x = 0; QSORT(agent, cst + Y(st->s, i), j = X(st->s, i), LT); do ct[k].x = (ct[k].x * N) + cst[Y(st->s, i) + j - 1]; while (--j); k++; } while (--m); #define LTX(a, b) ((*(a)).x < (*(b)).x) QSORT(coal, ct, k, LTX); for (i = 0; i < k; i++) { printf("{ "); for (j = 0; j < X(st->s, ct[i].a); j++) printf("%u ", cst[Y(st->s, ct[i].a) + j]); printf("} "); } puts(""); }
Datum sort(PG_FUNCTION_ARGS) { ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); text *dirstr = (fcinfo->nargs == 2) ? PG_GETARG_TEXT_P(1) : NULL; int32 dc = (dirstr) ? VARSIZE(dirstr) - VARHDRSZ : 0; char *d = (dirstr) ? VARDATA(dirstr) : NULL; int dir = -1; CHECKARRVALID(a); if (ARRISVOID(a) || ARRNELEMS(a) < 2) PG_RETURN_POINTER(a); if (dirstr == NULL || (dc == 3 && (d[0] == 'A' || d[0] == 'a') && (d[1] == 'S' || d[1] == 's') && (d[2] == 'C' || d[2] == 'c'))) dir = 1; else if (dc == 4 && (d[0] == 'D' || d[0] == 'd') && (d[1] == 'E' || d[1] == 'e') && (d[2] == 'S' || d[2] == 's') && (d[3] == 'C' || d[3] == 'c')) dir = 0; if (dir == -1) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("second parameter must be \"ASC\" or \"DESC\""))); QSORT(a, dir); PG_RETURN_POINTER(a); }
static void print_cmd_by_category(const struct category_description *catdesc) { struct cmdname_help *cmds; int longest = 0; int i, nr = 0; uint32_t mask = 0; for (i = 0; catdesc[i].desc; i++) mask |= catdesc[i].category; extract_cmds(&cmds, mask); for (i = 0; cmds[i].name; i++, nr++) { if (longest < strlen(cmds[i].name)) longest = strlen(cmds[i].name); } QSORT(cmds, nr, cmd_name_cmp); for (i = 0; catdesc[i].desc; i++) { uint32_t mask = catdesc[i].category; const char *desc = catdesc[i].desc; printf("\n%s\n", _(desc)); print_command_list(cmds, mask, longest); } free(cmds); }
Datum g_int_union(PG_FUNCTION_ARGS) { GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); int *size = (int *) PG_GETARG_POINTER(1); int4 i; ArrayType *res; int totlen = 0, *ptr; for (i = 0; i < entryvec->n; i++) totlen += ARRNELEMS(GETENTRY(entryvec, i)); res = new_intArrayType(totlen); ptr = ARRPTR(res); for (i = 0; i < entryvec->n; i++) { memcpy(ptr, ARRPTR(GETENTRY(entryvec, i)), ARRNELEMS(GETENTRY(entryvec, i)) * sizeof(int4)); ptr += ARRNELEMS(GETENTRY(entryvec, i)); } QSORT(res, 1); res = _int_unique(res); *size = VARSIZE(res); PG_RETURN_POINTER(res); }
static struct commit_list *best_bisection_sorted(struct commit_list *list, int nr) { struct commit_list *p; struct commit_dist *array = xcalloc(nr, sizeof(*array)); int cnt, i; for (p = list, cnt = 0; p; p = p->next) { int distance; unsigned flags = p->item->object.flags; if (flags & TREESAME) continue; distance = weight(p); if (nr - distance < distance) distance = nr - distance; array[cnt].commit = p->item; array[cnt].distance = distance; cnt++; } QSORT(array, cnt, compare_commit_dist); for (p = list, i = 0; i < cnt; i++) { char buf[100]; /* enough for dist=%d */ struct object *obj = &(array[i].commit->object); snprintf(buf, sizeof(buf), "dist=%d", array[i].distance); add_name_decoration(DECORATION_NONE, buf, obj); p->item = array[i].commit; p = p->next; } if (p) p->next = NULL; free(array); return list; }
Datum g_int_union(PG_FUNCTION_ARGS) { bytea *entryvec = (bytea *) PG_GETARG_POINTER(0); int *size = (int *) PG_GETARG_POINTER(1); int4 i, len = (VARSIZE(entryvec) - VARHDRSZ) / sizeof(GISTENTRY); ArrayType *res; int totlen = 0, *ptr; for (i = 0; i < len; i++) totlen += ARRNELEMS(GETENTRY(entryvec, i)); res = new_intArrayType(totlen); ptr = ARRPTR(res); for (i = 0; i < len; i++) { memcpy(ptr, ARRPTR(GETENTRY(entryvec, i)), ARRNELEMS(GETENTRY(entryvec, i)) * sizeof(int4)); ptr += ARRNELEMS(GETENTRY(entryvec, i)); } QSORT(res, 1); res = _int_unique(res); *size = VARSIZE(res); PG_RETURN_POINTER(res); }
void bitmap_writer_select_commits(struct commit **indexed_commits, unsigned int indexed_commits_nr, int max_bitmaps) { unsigned int i = 0, j, next; QSORT(indexed_commits, indexed_commits_nr, date_compare); if (writer.show_progress) writer.progress = start_progress("Selecting bitmap commits", 0); if (indexed_commits_nr < 100) { for (i = 0; i < indexed_commits_nr; ++i) push_bitmapped_commit(indexed_commits[i], NULL); return; } for (;;) { struct ewah_bitmap *reused_bitmap = NULL; struct commit *chosen = NULL; next = next_commit_index(i); if (i + next >= indexed_commits_nr) break; if (max_bitmaps > 0 && writer.selected_nr >= max_bitmaps) { writer.selected_nr = max_bitmaps; break; } if (next == 0) { chosen = indexed_commits[i]; reused_bitmap = find_reused_bitmap(chosen->object.oid.hash); } else { chosen = indexed_commits[i + next]; for (j = 0; j <= next; ++j) { struct commit *cm = indexed_commits[i + j]; reused_bitmap = find_reused_bitmap(cm->object.oid.hash); if (reused_bitmap || (cm->object.flags & NEEDS_BITMAP) != 0) { chosen = cm; break; } if (cm->parents && cm->parents->next) chosen = cm; } } push_bitmapped_commit(chosen, reused_bitmap); i += next + 1; display_progress(writer.progress, i); } stop_progress(&writer.progress); }
Datum intset_subtract(PG_FUNCTION_ARGS) { ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); ArrayType *b = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(1))); ArrayType *result; int32 ca; int32 cb; int32 *aa, *bb, *r; int32 n = 0, i = 0, k = 0; CHECKARRVALID(a); CHECKARRVALID(b); QSORT(a, 1); a = _int_unique(a); ca = ARRNELEMS(a); QSORT(b, 1); b = _int_unique(b); cb = ARRNELEMS(b); result = new_intArrayType(ca); aa = ARRPTR(a); bb = ARRPTR(b); r = ARRPTR(result); while (i < ca) { if (k == cb || aa[i] < bb[k]) r[n++] = aa[i++]; else if (aa[i] == bb[k]) { i++; k++; } else k++; } result = resize_intArrayType(result, n); pfree(a); pfree(b); PG_RETURN_POINTER(result); }
Datum sort_desc(PG_FUNCTION_ARGS) { ArrayType *a = (ArrayType *) PG_GETARG_ARRAYTYPE_P_COPY(0); CHECKARRVALID(a); QSORT(a, 0); PG_RETURN_POINTER(a); }
Datum intset_union_elem(PG_FUNCTION_ARGS) { ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM(PG_GETARG_DATUM(0))); ArrayType *result; result = intarray_add_elem(a, PG_GETARG_INT32(1)); PG_FREE_IF_COPY(a, 0); QSORT(result, 1); PG_RETURN_POINTER(_int_unique(result)); }
Datum intset_union_elem(PG_FUNCTION_ARGS) { ArrayType *a = (ArrayType *) PG_GETARG_ARRAYTYPE_P(0); ArrayType *result; result = intarray_add_elem(a, PG_GETARG_INT32(1)); PG_FREE_IF_COPY(a, 0); QSORT(result, 1); PG_RETURN_POINTER(_int_unique(result)); }
Datum sort_desc(PG_FUNCTION_ARGS) { ArrayType *a = (ArrayType *) DatumGetPointer(PG_DETOAST_DATUM_COPY(PG_GETARG_DATUM(0))); CHECKARRVALID(a); if (ARRISVOID(a)) PG_RETURN_POINTER(a); QSORT(a, 0); PG_RETURN_POINTER(a); }
static void init_pack_info(const char *infofile, int force) { struct packed_git *p; int stale; int i = 0; objdir = get_object_directory(); objdirlen = strlen(objdir); prepare_packed_git(); for (p = packed_git; p; p = p->next) { /* we ignore things on alternate path since they are * not available to the pullers in general. */ if (!p->pack_local) continue; i++; } num_pack = i; info = xcalloc(num_pack, sizeof(struct pack_info *)); for (i = 0, p = packed_git; p; p = p->next) { if (!p->pack_local) continue; info[i] = xcalloc(1, sizeof(struct pack_info)); info[i]->p = p; info[i]->old_num = -1; i++; } if (infofile && !force) stale = read_pack_info_file(infofile); else stale = 1; for (i = 0; i < num_pack; i++) { if (stale) { info[i]->old_num = -1; info[i]->nr_heads = 0; } } /* renumber them */ QSORT(info, num_pack, compare_info); for (i = 0; i < num_pack; i++) info[i]->new_num = i; }
void shortlog_output(struct shortlog *log) { int i, j; struct strbuf sb = STRBUF_INIT; if (log->sort_by_number) QSORT(log->list.items, log->list.nr, log->summary ? compare_by_counter : compare_by_list); for (i = 0; i < log->list.nr; i++) { const struct string_list_item *item = &log->list.items[i]; if (log->summary) { fprintf(log->file, "%6d\t%s\n", (int)UTIL_TO_INT(item), item->string); } else { struct string_list *onelines = item->util; fprintf(log->file, "%s (%d):\n", item->string, onelines->nr); for (j = onelines->nr - 1; j >= 0; j--) { const char *msg = onelines->items[j].string; if (log->wrap_lines) { strbuf_reset(&sb); add_wrapped_shortlog_msg(&sb, msg, log); fwrite(sb.buf, sb.len, 1, log->file); } else fprintf(log->file, " %s\n", msg); } putc('\n', log->file); onelines->strdup_strings = 1; string_list_clear(onelines, 0); free(onelines); } log->list.items[i].util = NULL; } strbuf_release(&sb); log->list.strdup_strings = 1; string_list_clear(&log->list, 1); clear_mailmap(&log->mailmap); }
int Superellipsoid::find_ray_plane_points(const Vector3d& P, const Vector3d& D, int cnt, DBL *dists, DBL mindist, DBL maxdist) const { int i; DBL t, d; /* Since min and max dist are the distance to two of the bounding planes we are considering, there is a high probablity of missing them due to round off error. Therefore we adjust min and max. */ t = EPSILON * (maxdist - mindist); mindist -= t; maxdist += t; /* Check the sets of planes that cut apart the superquadric. */ for (i = 0; i < PLANECOUNT; i++) { d = (D[0] * planes[i][0] + D[1] * planes[i][1] + D[2] * planes[i][2]); if (fabs(d) < EPSILON) { /* Can't possibly get a hit for this combination of ray and plane. */ continue; } t = (planes[i][3] - (P[0] * planes[i][0] + P[1] * planes[i][1] + P[2] * planes[i][2])) / d; if ((t >= mindist) && (t <= maxdist)) { dists[cnt++] = t; } } /* Sort the results for further processing. */ QSORT(reinterpret_cast<void *>(dists), cnt, sizeof(DBL), compdists); return(cnt); }
void printadj(const agent *a, const agent *dr, FILE *pk) { agent l[N * N]; for (agent i = 0; i < N; i++) l[i * N] = 0; edge e = E; do { l[a[0] * N + (l[a[0] * N]++) + 1] = a[1]; l[a[1] * N + (l[a[1] * N]++) + 1] = a[0]; a += 2; } while (--e); for (; e < N; e++) { QSORT(agent, l + e * N + 1, l[e * N], LTDR); fprintf(pk, "%u", l[e * N]); for (agent j = 1; j <= l[e * N]; j++) fprintf(pk, " %u", l[e * N + j]); fprintf(pk, "\n"); } }
Datum g_int_union(PG_FUNCTION_ARGS) { GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0); int *size = (int *) PG_GETARG_POINTER(1); int4 i, *ptr; ArrayType *res; int totlen = 0; for (i = 0; i < entryvec->n; i++) { ArrayType *ent = GETENTRY(entryvec, i); CHECKARRVALID(ent); totlen += ARRNELEMS(ent); } res = new_intArrayType(totlen); ptr = ARRPTR(res); for (i = 0; i < entryvec->n; i++) { ArrayType *ent = GETENTRY(entryvec, i); int nel; nel = ARRNELEMS(ent); memcpy(ptr, ARRPTR(ent), nel * sizeof(int4)); ptr += nel; } QSORT(res, 1); res = _int_unique(res); *size = VARSIZE(res); PG_RETURN_POINTER(res); }
/* * Sort the entries in dir non-recursively (if they are not already * sorted) and remove any duplicate entries. */ static void sort_ref_dir(struct ref_dir *dir) { int i, j; struct ref_entry *last = NULL; /* * This check also prevents passing a zero-length array to qsort(), * which is a problem on some platforms. */ if (dir->sorted == dir->nr) return; QSORT(dir->entries, dir->nr, ref_entry_cmp); /* Remove any duplicates: */ for (i = 0, j = 0; j < dir->nr; j++) { struct ref_entry *entry = dir->entries[j]; if (last && is_dup_ref(last, entry)) free_ref_entry(entry); else last = dir->entries[i++] = entry; } dir->sorted = dir->nr = i; }
__attribute__((always_inline)) inline value bound(const stack *st) { stack tst = *st; agent i, m = st->n[N]; const agent *p = st->n + N + 1; value b = 0; agent cars[N] = {0}; agentpath mp[N]; meter et[2 * N]; memcpy(tst.dr, drg, sizeof(agent) * N); memcpy(tst.cs, csg, sizeof(agent) * N); memcpy(tst.s, sg, sizeof(agent) * 2 * N); do { i = *(p++); cars[i] = (st->dr[i] > 0); } while (--m); connect(&tst, cars); p = tst.n + N + 1; m = tst.n[N]; do if (X(tst.s, i = *(p++)) == 1) b += COST(i, st->dr, st->l); else { agent cy, ck, tr = 0, ccx = X(tst.s, i); value pc, b1 = 0, b2 = 0; for (agent j = 0; j < ccx; j++) for (agent k = 0; k < X(st->s, cy = tst.cs[Y(tst.s, i) + j]); k++) { ck = st->cs[Y(st->s, cy) + k]; if (st->dr[ck]) b1 += PATHCOST(st->l[ck]); mp[tr].a = ck; mp[tr].d = st->dr[cy]; mp[tr].p = 0; tr++; } agent as = cars[i] * K; b += cars[i] * CARCOST + ((tr > as) ? (tr - as) * TICKETCOST : 0); if (cars[i]) { for (agent j = 0; j < tr; j++) { for (agent k = 0; k < tr; k++) { X(et, k) = st->sp[2 * mp[j].a * 2 * N + 2 * mp[k].a]; Y(et, k) = st->sp[2 * mp[j].a * 2 * N + 2 * mp[k].a + 1]; } QSORT(meter, et, 2 * tr, LT); mp[j].p += et[0] + (st->dr[mp[j].a] ? 0 : et[1]); for (agent k = 0; k < tr; k++) { X(et, k) = st->sp[(2 * mp[j].a + 1) * 2 * N + 2 * mp[k].a]; Y(et, k) = st->sp[(2 * mp[j].a + 1) * 2 * N + 2 * mp[k].a + 1]; } QSORT(meter, et, 2 * tr, LT); mp[j].p += et[0] + (st->dr[mp[j].a] ? 0 : et[1]); mp[j].p /= 2; } #define LTMP(a, b) ( ((*(a)).d != (*(b)).d) ? ((*(a)).d > (*(b)).d) : ((*(a)).p < (*(b)).p) ) QSORT(agentpath, mp, tr, LTMP); for (agent j = 0; j < (tr < as ? tr : as); j++) { pc = PATHCOST(mp[j].p); b2 += (pc > TICKETCOST) ? TICKETCOST : pc; } b += b1 > b2 ? b1 : b2; } //else b += tr * TICKETCOST; } while (--m); return b; }
static void show_filemodify(struct diff_queue_struct *q, struct diff_options *options, void *data) { int i; struct string_list *changed = data; /* * Handle files below a directory first, in case they are all deleted * and the directory changes to a file or symlink. */ QSORT(q->queue, q->nr, depth_first); for (i = 0; i < q->nr; i++) { struct diff_filespec *ospec = q->queue[i]->one; struct diff_filespec *spec = q->queue[i]->two; switch (q->queue[i]->status) { case DIFF_STATUS_DELETED: printf("D "); print_path(spec->path); string_list_insert(changed, spec->path); putchar('\n'); break; case DIFF_STATUS_COPIED: case DIFF_STATUS_RENAMED: /* * If a change in the file corresponding to ospec->path * has been observed, we cannot trust its contents * because the diff is calculated based on the prior * contents, not the current contents. So, declare a * copy or rename only if there was no change observed. */ if (!string_list_has_string(changed, ospec->path)) { printf("%c ", q->queue[i]->status); print_path(ospec->path); putchar(' '); print_path(spec->path); string_list_insert(changed, spec->path); putchar('\n'); if (!oidcmp(&ospec->oid, &spec->oid) && ospec->mode == spec->mode) break; } /* fallthrough */ case DIFF_STATUS_TYPE_CHANGED: case DIFF_STATUS_MODIFIED: case DIFF_STATUS_ADDED: /* * Links refer to objects in another repositories; * output the SHA-1 verbatim. */ if (no_data || S_ISGITLINK(spec->mode)) printf("M %06o %s ", spec->mode, sha1_to_hex(anonymize ? anonymize_sha1(&spec->oid) : spec->oid.hash)); else { struct object *object = lookup_object(spec->oid.hash); printf("M %06o :%d ", spec->mode, get_object_mark(object)); } print_path(spec->path); string_list_insert(changed, spec->path); putchar('\n'); break; default: die("Unexpected comparison status '%c' for %s, %s", q->queue[i]->status, ospec->path ? ospec->path : "none", spec->path ? spec->path : "none"); } } }
/* * `snapshot->buf` is not known to be sorted. Check whether it is, and * if not, sort it into new memory and munmap/free the old storage. */ static void sort_snapshot(struct snapshot *snapshot) { struct snapshot_record *records = NULL; size_t alloc = 0, nr = 0; int sorted = 1; const char *pos, *eof, *eol; size_t len, i; char *new_buffer, *dst; pos = snapshot->buf + snapshot->header_len; eof = snapshot->eof; len = eof - pos; if (!len) return; /* * Initialize records based on a crude estimate of the number * of references in the file (we'll grow it below if needed): */ ALLOC_GROW(records, len / 80 + 20, alloc); while (pos < eof) { eol = memchr(pos, '\n', eof - pos); if (!eol) /* The safety check should prevent this. */ BUG("unterminated line found in packed-refs"); if (eol - pos < GIT_SHA1_HEXSZ + 2) die_invalid_line(snapshot->refs->path, pos, eof - pos); eol++; if (eol < eof && *eol == '^') { /* * Keep any peeled line together with its * reference: */ const char *peeled_start = eol; eol = memchr(peeled_start, '\n', eof - peeled_start); if (!eol) /* The safety check should prevent this. */ BUG("unterminated peeled line found in packed-refs"); eol++; } ALLOC_GROW(records, nr + 1, alloc); records[nr].start = pos; records[nr].len = eol - pos; nr++; if (sorted && nr > 1 && cmp_packed_ref_records(&records[nr - 2], &records[nr - 1]) >= 0) sorted = 0; pos = eol; } if (sorted) goto cleanup; /* We need to sort the memory. First we sort the records array: */ QSORT(records, nr, cmp_packed_ref_records); /* * Allocate a new chunk of memory, and copy the old memory to * the new in the order indicated by `records` (not bothering * with the header line): */ new_buffer = xmalloc(len); for (dst = new_buffer, i = 0; i < nr; i++) { memcpy(dst, records[i].start, records[i].len); dst += records[i].len; } /* * Now munmap the old buffer and use the sorted buffer in its * place: */ clear_snapshot_buffer(snapshot); snapshot->buf = new_buffer; snapshot->eof = new_buffer + len; snapshot->header_len = 0; cleanup: free(records); }
const char *help_unknown_cmd(const char *cmd) { int i, n, best_similarity = 0; struct cmdnames main_cmds, other_cmds; struct cmdname_help *common_cmds; memset(&main_cmds, 0, sizeof(main_cmds)); memset(&other_cmds, 0, sizeof(other_cmds)); memset(&aliases, 0, sizeof(aliases)); read_early_config(git_unknown_cmd_config, NULL); load_command_list("git-", &main_cmds, &other_cmds); add_cmd_list(&main_cmds, &aliases); add_cmd_list(&main_cmds, &other_cmds); QSORT(main_cmds.names, main_cmds.cnt, cmdname_compare); uniq(&main_cmds); extract_cmds(&common_cmds, common_mask); /* This abuses cmdname->len for levenshtein distance */ for (i = 0, n = 0; i < main_cmds.cnt; i++) { int cmp = 0; /* avoid compiler stupidity */ const char *candidate = main_cmds.names[i]->name; /* * An exact match means we have the command, but * for some reason exec'ing it gave us ENOENT; probably * it's a bad interpreter in the #! line. */ if (!strcmp(candidate, cmd)) die(_(bad_interpreter_advice), cmd, cmd); /* Does the candidate appear in common_cmds list? */ while (common_cmds[n].name && (cmp = strcmp(common_cmds[n].name, candidate)) < 0) n++; if (common_cmds[n].name && !cmp) { /* Yes, this is one of the common commands */ n++; /* use the entry from common_cmds[] */ if (starts_with(candidate, cmd)) { /* Give prefix match a very good score */ main_cmds.names[i]->len = 0; continue; } } main_cmds.names[i]->len = levenshtein(cmd, candidate, 0, 2, 1, 3) + 1; } FREE_AND_NULL(common_cmds); QSORT(main_cmds.names, main_cmds.cnt, levenshtein_compare); if (!main_cmds.cnt) die(_("Uh oh. Your system reports no Git commands at all.")); /* skip and count prefix matches */ for (n = 0; n < main_cmds.cnt && !main_cmds.names[n]->len; n++) ; /* still counting */ if (main_cmds.cnt <= n) { /* prefix matches with everything? that is too ambiguous */ best_similarity = SIMILARITY_FLOOR + 1; } else { /* count all the most similar ones */ for (best_similarity = main_cmds.names[n++]->len; (n < main_cmds.cnt && best_similarity == main_cmds.names[n]->len); n++) ; /* still counting */ } if (autocorrect && n == 1 && SIMILAR_ENOUGH(best_similarity)) { const char *assumed = main_cmds.names[0]->name; main_cmds.names[0] = NULL; clean_cmdnames(&main_cmds); fprintf_ln(stderr, _("WARNING: You called a Git command named '%s', " "which does not exist."), cmd); if (autocorrect < 0) fprintf_ln(stderr, _("Continuing under the assumption that " "you meant '%s'."), assumed); else { fprintf_ln(stderr, _("Continuing in %0.1f seconds, " "assuming that you meant '%s'."), (float)autocorrect/10.0, assumed); sleep_millisec(autocorrect * 100); } return assumed; } fprintf_ln(stderr, _("git: '%s' is not a git command. See 'git --help'."), cmd); if (SIMILAR_ENOUGH(best_similarity)) { fprintf_ln(stderr, Q_("\nThe most similar command is", "\nThe most similar commands are", n)); for (i = 0; i < n; i++) fprintf(stderr, "\t%s\n", main_cmds.names[i]->name); } exit(1); }
static void sort_ref_range(int bottom, int top) { QSORT(ref_name + bottom, top - bottom, compare_ref_name); }
static void oid_array_sort(struct oid_array *array) { QSORT(array->oid, array->nr, void_hashcmp); array->sorted = 1; }
static int sort_and_split(BSPHERE_TREE **Root, BSPHERE_TREE ***Elements, int *nElem, int first, int last, int& maxelements) { int size, i, best_loc; DBL *area_left, *area_right; DBL best_index, new_index; BSPHERE_TREE *cd; int Axis = find_axis(*Elements, first, last); size = last - first; if (size <= 0) { return (1); } /* * Actually, we could do this faster in several ways. We could use a * logn algorithm to find the median along the given axis, and then a * linear algorithm to partition along the axis. Oh well. */ switch(Axis) { case X: QSORT((void *)(*Elements + first), size, sizeof(BSPHERE_TREE *), comp_elements<X>); break; case Y: QSORT((void *)(*Elements + first), size, sizeof(BSPHERE_TREE *), comp_elements<Y>); break; case Z: QSORT((void *)(*Elements + first), size, sizeof(BSPHERE_TREE *), comp_elements<Z>); break; } /* * area_left[] and area_right[] hold the surface areas of the bounding * boxes to the left and right of any given point. E.g. area_left[i] holds * the surface area of the bounding box containing Elements 0 through i and * area_right[i] holds the surface area of the box containing Elements * i through size-1. */ area_left = (DBL *)POV_MALLOC(size * sizeof(DBL), "blob bounding hierarchy"); area_right = (DBL *)POV_MALLOC(size * sizeof(DBL), "blob bounding hierarchy"); /* Precalculate the areas for speed. */ build_area_table(*Elements, first, last - 1, area_left); build_area_table(*Elements, last - 1, first, area_right); best_index = area_right[0] * (size - 3.0); best_loc = - 1; /* * Find the most effective point to split. The best location will be * the one that minimizes the function N1*A1 + N2*A2 where N1 and N2 * are the number of objects in the two groups and A1 and A2 are the * surface areas of the bounding boxes of the two groups. */ for (i = 0; i < size - 1; i++) { new_index = (i + 1) * area_left[i] + (size - 1 - i) * area_right[i + 1]; if (new_index < best_index) { best_index = new_index; best_loc = i + first; } } POV_FREE(area_left); POV_FREE(area_right); /* * Stop splitting if the BRANCHING_FACTOR is reached or * if splitting stops being effective. */ if ((size <= BRANCHING_FACTOR) || (best_loc < 0)) { cd = (BSPHERE_TREE *)POV_MALLOC(sizeof(BSPHERE_TREE), "blob bounding hierarchy"); cd->Entries = (short)size; cd->Node = (BSPHERE_TREE **)POV_MALLOC(size*sizeof(BSPHERE_TREE *), "blob bounding hierarchy"); for (i = 0; i < size; i++) { cd->Node[i] = (*Elements)[first+i]; } recompute_bound(cd); *Root = cd; if (*nElem >= maxelements) { /* Prim array overrun, increase array by 50%. */ maxelements = 1.5 * maxelements; /* For debugging only. */ // TODO FIXME Debug_Info("Reallocing elements to %d\n", maxelements); *Elements = (BSPHERE_TREE **)POV_REALLOC(*Elements, maxelements * sizeof(BSPHERE_TREE *), "bounding slabs"); } (*Elements)[*nElem] = cd; (*nElem)++; return (1); } else { sort_and_split(Root, Elements, nElem, first, best_loc + 1, maxelements); sort_and_split(Root, Elements, nElem, best_loc + 1, last, maxelements); return (0); } }
static void describe(const char *arg, int last_one) { unsigned char sha1[20]; struct commit *cmit, *gave_up_on = NULL; struct commit_list *list; struct commit_name *n; struct possible_tag all_matches[MAX_TAGS]; unsigned int match_cnt = 0, annotated_cnt = 0, cur_match; unsigned long seen_commits = 0; unsigned int unannotated_cnt = 0; if (get_sha1(arg, sha1)) die(_("Not a valid object name %s"), arg); cmit = lookup_commit_reference(sha1); if (!cmit) die(_("%s is not a valid '%s' object"), arg, commit_type); n = find_commit_name(cmit->object.oid.hash); if (n && (tags || all || n->prio == 2)) { /* * Exact match to an existing ref. */ display_name(n); if (longformat) show_suffix(0, n->tag ? n->tag->tagged->oid.hash : sha1); if (dirty) printf("%s", dirty); printf("\n"); return; } if (!max_candidates) die(_("no tag exactly matches '%s'"), oid_to_hex(&cmit->object.oid)); if (debug) fprintf(stderr, _("searching to describe %s\n"), arg); if (!have_util) { struct hashmap_iter iter; struct commit *c; struct commit_name *n = hashmap_iter_first(&names, &iter); for (; n; n = hashmap_iter_next(&iter)) { c = lookup_commit_reference_gently(n->peeled, 1); if (c) c->util = n; } have_util = 1; } list = NULL; cmit->object.flags = SEEN; commit_list_insert(cmit, &list); while (list) { struct commit *c = pop_commit(&list); struct commit_list *parents = c->parents; seen_commits++; n = c->util; if (n) { if (!tags && !all && n->prio < 2) { unannotated_cnt++; } else if (match_cnt < max_candidates) { struct possible_tag *t = &all_matches[match_cnt++]; t->name = n; t->depth = seen_commits - 1; t->flag_within = 1u << match_cnt; t->found_order = match_cnt; c->object.flags |= t->flag_within; if (n->prio == 2) annotated_cnt++; } else { gave_up_on = c; break; } } for (cur_match = 0; cur_match < match_cnt; cur_match++) { struct possible_tag *t = &all_matches[cur_match]; if (!(c->object.flags & t->flag_within)) t->depth++; } if (annotated_cnt && !list) { if (debug) fprintf(stderr, _("finished search at %s\n"), oid_to_hex(&c->object.oid)); break; } while (parents) { struct commit *p = parents->item; parse_commit(p); if (!(p->object.flags & SEEN)) commit_list_insert_by_date(p, &list); p->object.flags |= c->object.flags; parents = parents->next; if (first_parent) break; } } if (!match_cnt) { struct object_id *oid = &cmit->object.oid; if (always) { printf("%s", find_unique_abbrev(oid->hash, abbrev)); if (dirty) printf("%s", dirty); printf("\n"); return; } if (unannotated_cnt) die(_("No annotated tags can describe '%s'.\n" "However, there were unannotated tags: try --tags."), oid_to_hex(oid)); else die(_("No tags can describe '%s'.\n" "Try --always, or create some tags."), oid_to_hex(oid)); } QSORT(all_matches, match_cnt, compare_pt); if (gave_up_on) { commit_list_insert_by_date(gave_up_on, &list); seen_commits--; } seen_commits += finish_depth_computation(&list, &all_matches[0]); free_commit_list(list); if (debug) { for (cur_match = 0; cur_match < match_cnt; cur_match++) { struct possible_tag *t = &all_matches[cur_match]; fprintf(stderr, " %-11s %8d %s\n", prio_names[t->name->prio], t->depth, t->name->path); } fprintf(stderr, _("traversed %lu commits\n"), seen_commits); if (gave_up_on) { fprintf(stderr, _("more than %i tags found; listed %i most recent\n" "gave up search at %s\n"), max_candidates, max_candidates, oid_to_hex(&gave_up_on->object.oid)); } } display_name(all_matches[0].name); if (abbrev) show_suffix(all_matches[0].depth, cmit->object.oid.hash); if (dirty) printf("%s", dirty); printf("\n"); if (!last_one) clear_commit_marks(cmit, -1); }
void resolve_tree_islands(struct repository *r, int progress, struct packing_data *to_pack) { struct progress *progress_state = NULL; struct tree_islands_todo *todo; int nr = 0; int i; if (!island_marks) return; /* * We process only trees, as commits and tags have already been handled * (and passed their marks on to root trees, as well. We must make sure * to process them in descending tree-depth order so that marks * propagate down the tree properly, even if a sub-tree is found in * multiple parent trees. */ ALLOC_ARRAY(todo, to_pack->nr_objects); for (i = 0; i < to_pack->nr_objects; i++) { if (oe_type(&to_pack->objects[i]) == OBJ_TREE) { todo[nr].entry = &to_pack->objects[i]; todo[nr].depth = oe_tree_depth(to_pack, &to_pack->objects[i]); nr++; } } QSORT(todo, nr, tree_depth_compare); if (progress) progress_state = start_progress(_("Propagating island marks"), nr); for (i = 0; i < nr; i++) { struct object_entry *ent = todo[i].entry; struct island_bitmap *root_marks; struct tree *tree; struct tree_desc desc; struct name_entry entry; khiter_t pos; pos = kh_get_sha1(island_marks, ent->idx.oid.hash); if (pos >= kh_end(island_marks)) continue; root_marks = kh_value(island_marks, pos); tree = lookup_tree(r, &ent->idx.oid); if (!tree || parse_tree(tree) < 0) die(_("bad tree object %s"), oid_to_hex(&ent->idx.oid)); init_tree_desc(&desc, tree->buffer, tree->size); while (tree_entry(&desc, &entry)) { struct object *obj; if (S_ISGITLINK(entry.mode)) continue; obj = lookup_object(r, entry.oid->hash); if (!obj) continue; set_island_marks(obj, root_marks); } free_tree_buffer(tree); display_progress(progress_state, i+1); } stop_progress(&progress_state); free(todo); }
static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args, int fd[2], const struct ref *orig_ref, struct ref **sought, int nr_sought, char **pack_lockfile) { struct ref *ref = copy_ref_list(orig_ref); enum fetch_state state = FETCH_CHECK_LOCAL; struct oidset common = OIDSET_INIT; struct packet_reader reader; int in_vain = 0; int haves_to_send = INITIAL_FLUSH; struct fetch_negotiator negotiator; fetch_negotiator_init(&negotiator, negotiation_algorithm); packet_reader_init(&reader, fd[0], NULL, 0, PACKET_READ_CHOMP_NEWLINE); while (state != FETCH_DONE) { switch (state) { case FETCH_CHECK_LOCAL: sort_ref_list(&ref, ref_compare_name); QSORT(sought, nr_sought, cmp_ref_by_name); /* v2 supports these by default */ allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1; use_sideband = 2; if (args->depth > 0 || args->deepen_since || args->deepen_not) args->deepen = 1; /* Filter 'ref' by 'sought' and those that aren't local */ if (!args->no_dependents) { mark_complete_and_common_ref(&negotiator, args, &ref); filter_refs(args, &ref, sought, nr_sought); if (everything_local(args, &ref)) state = FETCH_DONE; else state = FETCH_SEND_REQUEST; mark_tips(&negotiator, args->negotiation_tips); for_each_cached_alternate(&negotiator, insert_one_alternate_object); } else { filter_refs(args, &ref, sought, nr_sought); state = FETCH_SEND_REQUEST; } break; case FETCH_SEND_REQUEST: if (send_fetch_request(&negotiator, fd[1], args, ref, &common, &haves_to_send, &in_vain)) state = FETCH_GET_PACK; else state = FETCH_PROCESS_ACKS; break; case FETCH_PROCESS_ACKS: /* Process ACKs/NAKs */ switch (process_acks(&negotiator, &reader, &common)) { case 2: state = FETCH_GET_PACK; break; case 1: in_vain = 0; /* fallthrough */ default: state = FETCH_SEND_REQUEST; break; } break; case FETCH_GET_PACK: /* Check for shallow-info section */ if (process_section_header(&reader, "shallow-info", 1)) receive_shallow_info(args, &reader); if (process_section_header(&reader, "wanted-refs", 1)) receive_wanted_refs(&reader, sought, nr_sought); /* get the pack */ process_section_header(&reader, "packfile", 0); if (get_pack(args, fd, pack_lockfile)) die(_("git fetch-pack: fetch failed.")); state = FETCH_DONE; break; case FETCH_DONE: continue; } } negotiator.release(&negotiator); oidset_clear(&common); return ref; }
static struct ref *do_fetch_pack(struct fetch_pack_args *args, int fd[2], const struct ref *orig_ref, struct ref **sought, int nr_sought, struct shallow_info *si, char **pack_lockfile) { struct ref *ref = copy_ref_list(orig_ref); struct object_id oid; const char *agent_feature; int agent_len; struct fetch_negotiator negotiator; fetch_negotiator_init(&negotiator, negotiation_algorithm); sort_ref_list(&ref, ref_compare_name); QSORT(sought, nr_sought, cmp_ref_by_name); if ((args->depth > 0 || is_repository_shallow(the_repository)) && !server_supports("shallow")) die(_("Server does not support shallow clients")); if (args->depth > 0 || args->deepen_since || args->deepen_not) args->deepen = 1; if (server_supports("multi_ack_detailed")) { print_verbose(args, _("Server supports multi_ack_detailed")); multi_ack = 2; if (server_supports("no-done")) { print_verbose(args, _("Server supports no-done")); if (args->stateless_rpc) no_done = 1; } } else if (server_supports("multi_ack")) { print_verbose(args, _("Server supports multi_ack")); multi_ack = 1; } if (server_supports("side-band-64k")) { print_verbose(args, _("Server supports side-band-64k")); use_sideband = 2; } else if (server_supports("side-band")) { print_verbose(args, _("Server supports side-band")); use_sideband = 1; } if (server_supports("allow-tip-sha1-in-want")) { print_verbose(args, _("Server supports allow-tip-sha1-in-want")); allow_unadvertised_object_request |= ALLOW_TIP_SHA1; } if (server_supports("allow-reachable-sha1-in-want")) { print_verbose(args, _("Server supports allow-reachable-sha1-in-want")); allow_unadvertised_object_request |= ALLOW_REACHABLE_SHA1; } if (!server_supports("thin-pack")) args->use_thin_pack = 0; if (!server_supports("no-progress")) args->no_progress = 0; if (!server_supports("include-tag")) args->include_tag = 0; if (server_supports("ofs-delta")) print_verbose(args, _("Server supports ofs-delta")); else prefer_ofs_delta = 0; if (server_supports("filter")) { server_supports_filtering = 1; print_verbose(args, _("Server supports filter")); } else if (args->filter_options.choice) { warning("filtering not recognized by server, ignoring"); } if ((agent_feature = server_feature_value("agent", &agent_len))) { agent_supported = 1; if (agent_len) print_verbose(args, _("Server version is %.*s"), agent_len, agent_feature); } if (server_supports("deepen-since")) deepen_since_ok = 1; else if (args->deepen_since) die(_("Server does not support --shallow-since")); if (server_supports("deepen-not")) deepen_not_ok = 1; else if (args->deepen_not) die(_("Server does not support --shallow-exclude")); if (!server_supports("deepen-relative") && args->deepen_relative) die(_("Server does not support --deepen")); if (!args->no_dependents) { mark_complete_and_common_ref(&negotiator, args, &ref); filter_refs(args, &ref, sought, nr_sought); if (everything_local(args, &ref)) { packet_flush(fd[1]); goto all_done; } } else { filter_refs(args, &ref, sought, nr_sought); } if (find_common(&negotiator, args, fd, &oid, ref) < 0) if (!args->keep_pack) /* When cloning, it is not unusual to have * no common commit. */ warning(_("no common commits")); if (args->stateless_rpc) packet_flush(fd[1]); if (args->deepen) setup_alternate_shallow(&shallow_lock, &alternate_shallow_file, NULL); else if (si->nr_ours || si->nr_theirs) alternate_shallow_file = setup_temporary_shallow(si->shallow); else alternate_shallow_file = NULL; if (get_pack(args, fd, pack_lockfile)) die(_("git fetch-pack: fetch failed.")); all_done: negotiator.release(&negotiator); return ref; }