Version in base suite: 1.4.4.4-4+etch1 Version in overlay suite: 1.4.4.4-4+etch2 Base version: git-core_1.4.4.4-4+etch1 Target version: git-core_1.4.4.4-4+etch3 Base file: /org/ftp.debian.org/ftp/pool/main/g/git-core/git-core_1.4.4.4-4+etch1.dsc Target file: /org/ftp.debian.org/queue/o-p-u-new/git-core_1.4.4.4-4+etch3.dsc Makefile.orig | 948 ------- debian/diff/SA35437.diff | 36 debian/diff/install-templates-with-the-user-and-group-of-the-inst.diff | 34 diff.h.orig | 224 - git-core-1.4.4.4/debian/changelog | 17 revision.c.orig | 1208 ---------- 6 files changed, 87 insertions(+), 2380 deletions(-) diff -u git-core-1.4.4.4/debian/changelog git-core-1.4.4.4/debian/changelog --- git-core-1.4.4.4/debian/changelog +++ git-core-1.4.4.4/debian/changelog @@ -1,3 +1,20 @@ +git-core (1:1.4.4.4-4+etch3) oldstable-security; urgency=low + + * Non-maintainer upload by the security team. + * Port upstream patch (SA35437.diff) to skip extra arguments and + prevent infinite loop leading to denial of service attacks + (No CVE id yet; SA35437; Closes: #532935). + + -- Nico Golde Wed, 17 Jun 2009 13:38:47 +0000 + +git-core (1:1.4.4.4-4+etch2) oldstable-security; urgency=high + + * debian/diff/install-templates-with-the-user-and-group-of-the...diff: + new, cherry-picked from 71f4637: Install templates with the user and + group of the installing personality (closes: #516669). + + -- Gerrit Pape Mon, 23 Feb 2009 23:43:55 +0000 + git-core (1:1.4.4.4-4+etch1) stable-security; urgency=high * Fix gitweb command injection issues involving diffs, snapshots reverted: --- git-core-1.4.4.4/revision.c.orig +++ git-core-1.4.4.4.orig/revision.c.orig @@ -1,1208 +0,0 @@ -#include "cache.h" -#include "tag.h" -#include "blob.h" -#include "tree.h" -#include "commit.h" -#include "diff.h" -#include "refs.h" -#include "revision.h" -#include -#include "grep.h" - -static char *path_name(struct name_path *path, const char *name) -{ - struct name_path *p; - char *n, *m; - int nlen = strlen(name); - int len = nlen + 1; - - for (p = path; p; p = p->up) { - if (p->elem_len) - len += p->elem_len + 1; - } - n = xmalloc(len); - m = n + len - (nlen + 1); - strcpy(m, name); - for (p = path; p; p = p->up) { - if (p->elem_len) { - m -= p->elem_len + 1; - memcpy(m, p->elem, p->elem_len); - m[p->elem_len] = '/'; - } - } - return n; -} - -void add_object(struct object *obj, - struct object_array *p, - struct name_path *path, - const char *name) -{ - add_object_array(obj, path_name(path, name), p); -} - -static void mark_blob_uninteresting(struct blob *blob) -{ - if (blob->object.flags & UNINTERESTING) - return; - blob->object.flags |= UNINTERESTING; -} - -void mark_tree_uninteresting(struct tree *tree) -{ - struct tree_desc desc; - struct name_entry entry; - struct object *obj = &tree->object; - - if (obj->flags & UNINTERESTING) - return; - obj->flags |= UNINTERESTING; - if (!has_sha1_file(obj->sha1)) - return; - if (parse_tree(tree) < 0) - die("bad tree %s", sha1_to_hex(obj->sha1)); - - desc.buf = tree->buffer; - desc.size = tree->size; - while (tree_entry(&desc, &entry)) { - if (S_ISDIR(entry.mode)) - mark_tree_uninteresting(lookup_tree(entry.sha1)); - else - mark_blob_uninteresting(lookup_blob(entry.sha1)); - } - - /* - * We don't care about the tree any more - * after it has been marked uninteresting. - */ - free(tree->buffer); - tree->buffer = NULL; -} - -void mark_parents_uninteresting(struct commit *commit) -{ - struct commit_list *parents = commit->parents; - - while (parents) { - struct commit *commit = parents->item; - if (!(commit->object.flags & UNINTERESTING)) { - commit->object.flags |= UNINTERESTING; - - /* - * Normally we haven't parsed the parent - * yet, so we won't have a parent of a parent - * here. However, it may turn out that we've - * reached this commit some other way (where it - * wasn't uninteresting), in which case we need - * to mark its parents recursively too.. - */ - if (commit->parents) - mark_parents_uninteresting(commit); - } - - /* - * A missing commit is ok iff its parent is marked - * uninteresting. - * - * We just mark such a thing parsed, so that when - * it is popped next time around, we won't be trying - * to parse it and get an error. - */ - if (!has_sha1_file(commit->object.sha1)) - commit->object.parsed = 1; - parents = parents->next; - } -} - -void add_pending_object(struct rev_info *revs, struct object *obj, const char *name) -{ - add_object_array(obj, name, &revs->pending); -} - -static struct object *get_reference(struct rev_info *revs, const char *name, const unsigned char *sha1, unsigned int flags) -{ - struct object *object; - - object = parse_object(sha1); - if (!object) - die("bad object %s", name); - object->flags |= flags; - return object; -} - -static struct commit *handle_commit(struct rev_info *revs, struct object *object, const char *name) -{ - unsigned long flags = object->flags; - - /* - * Tag object? Look what it points to.. - */ - while (object->type == OBJ_TAG) { - struct tag *tag = (struct tag *) object; - if (revs->tag_objects && !(flags & UNINTERESTING)) - add_pending_object(revs, object, tag->tag); - object = parse_object(tag->tagged->sha1); - if (!object) - die("bad object %s", sha1_to_hex(tag->tagged->sha1)); - } - - /* - * Commit object? Just return it, we'll do all the complex - * reachability crud. - */ - if (object->type == OBJ_COMMIT) { - struct commit *commit = (struct commit *)object; - if (parse_commit(commit) < 0) - die("unable to parse commit %s", name); - if (flags & UNINTERESTING) { - commit->object.flags |= UNINTERESTING; - mark_parents_uninteresting(commit); - revs->limited = 1; - } - return commit; - } - - /* - * Tree object? Either mark it uniniteresting, or add it - * to the list of objects to look at later.. - */ - if (object->type == OBJ_TREE) { - struct tree *tree = (struct tree *)object; - if (!revs->tree_objects) - return NULL; - if (flags & UNINTERESTING) { - mark_tree_uninteresting(tree); - return NULL; - } - add_pending_object(revs, object, ""); - return NULL; - } - - /* - * Blob object? You know the drill by now.. - */ - if (object->type == OBJ_BLOB) { - struct blob *blob = (struct blob *)object; - if (!revs->blob_objects) - return NULL; - if (flags & UNINTERESTING) { - mark_blob_uninteresting(blob); - return NULL; - } - add_pending_object(revs, object, ""); - return NULL; - } - die("%s is unknown object", name); -} - -static int everybody_uninteresting(struct commit_list *orig) -{ - struct commit_list *list = orig; - while (list) { - struct commit *commit = list->item; - list = list->next; - if (commit->object.flags & UNINTERESTING) - continue; - return 0; - } - return 1; -} - -static int tree_difference = REV_TREE_SAME; - -static void file_add_remove(struct diff_options *options, - int addremove, unsigned mode, - const unsigned char *sha1, - const char *base, const char *path) -{ - int diff = REV_TREE_DIFFERENT; - - /* - * Is it an add of a new file? It means that the old tree - * didn't have it at all, so we will turn "REV_TREE_SAME" -> - * "REV_TREE_NEW", but leave any "REV_TREE_DIFFERENT" alone - * (and if it already was "REV_TREE_NEW", we'll keep it - * "REV_TREE_NEW" of course). - */ - if (addremove == '+') { - diff = tree_difference; - if (diff != REV_TREE_SAME) - return; - diff = REV_TREE_NEW; - } - tree_difference = diff; -} - -static void file_change(struct diff_options *options, - unsigned old_mode, unsigned new_mode, - const unsigned char *old_sha1, - const unsigned char *new_sha1, - const char *base, const char *path) -{ - tree_difference = REV_TREE_DIFFERENT; -} - -int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree *t2) -{ - if (!t1) - return REV_TREE_NEW; - if (!t2) - return REV_TREE_DIFFERENT; - tree_difference = REV_TREE_SAME; - if (diff_tree_sha1(t1->object.sha1, t2->object.sha1, "", - &revs->pruning) < 0) - return REV_TREE_DIFFERENT; - return tree_difference; -} - -int rev_same_tree_as_empty(struct rev_info *revs, struct tree *t1) -{ - int retval; - void *tree; - struct tree_desc empty, real; - - if (!t1) - return 0; - - tree = read_object_with_reference(t1->object.sha1, tree_type, &real.size, NULL); - if (!tree) - return 0; - real.buf = tree; - - empty.buf = ""; - empty.size = 0; - - tree_difference = 0; - retval = diff_tree(&empty, &real, "", &revs->pruning); - free(tree); - - return retval >= 0 && !tree_difference; -} - -static void try_to_simplify_commit(struct rev_info *revs, struct commit *commit) -{ - struct commit_list **pp, *parent; - int tree_changed = 0, tree_same = 0; - - if (!commit->tree) - return; - - if (!commit->parents) { - if (!rev_same_tree_as_empty(revs, commit->tree)) - commit->object.flags |= TREECHANGE; - return; - } - - pp = &commit->parents; - while ((parent = *pp) != NULL) { - struct commit *p = parent->item; - - parse_commit(p); - switch (rev_compare_tree(revs, p->tree, commit->tree)) { - case REV_TREE_SAME: - tree_same = 1; - if (!revs->simplify_history || (p->object.flags & UNINTERESTING)) { - /* Even if a merge with an uninteresting - * side branch brought the entire change - * we are interested in, we do not want - * to lose the other branches of this - * merge, so we just keep going. - */ - pp = &parent->next; - continue; - } - parent->next = NULL; - commit->parents = parent; - return; - - case REV_TREE_NEW: - if (revs->remove_empty_trees && - rev_same_tree_as_empty(revs, p->tree)) { - /* We are adding all the specified - * paths from this parent, so the - * history beyond this parent is not - * interesting. Remove its parents - * (they are grandparents for us). - * IOW, we pretend this parent is a - * "root" commit. - */ - parse_commit(p); - p->parents = NULL; - } - /* fallthrough */ - case REV_TREE_DIFFERENT: - tree_changed = 1; - pp = &parent->next; - continue; - } - die("bad tree compare for commit %s", sha1_to_hex(commit->object.sha1)); - } - if (tree_changed && !tree_same) - commit->object.flags |= TREECHANGE; -} - -static void add_parents_to_list(struct rev_info *revs, struct commit *commit, struct commit_list **list) -{ - struct commit_list *parent = commit->parents; - - if (commit->object.flags & ADDED) - return; - commit->object.flags |= ADDED; - - /* - * If the commit is uninteresting, don't try to - * prune parents - we want the maximal uninteresting - * set. - * - * Normally we haven't parsed the parent - * yet, so we won't have a parent of a parent - * here. However, it may turn out that we've - * reached this commit some other way (where it - * wasn't uninteresting), in which case we need - * to mark its parents recursively too.. - */ - if (commit->object.flags & UNINTERESTING) { - while (parent) { - struct commit *p = parent->item; - parent = parent->next; - parse_commit(p); - p->object.flags |= UNINTERESTING; - if (p->parents) - mark_parents_uninteresting(p); - if (p->object.flags & SEEN) - continue; - p->object.flags |= SEEN; - insert_by_date(p, list); - } - return; - } - - /* - * Ok, the commit wasn't uninteresting. Try to - * simplify the commit history and find the parent - * that has no differences in the path set if one exists. - */ - if (revs->prune_fn) - revs->prune_fn(revs, commit); - - if (revs->no_walk) - return; - - parent = commit->parents; - while (parent) { - struct commit *p = parent->item; - - parent = parent->next; - - parse_commit(p); - if (p->object.flags & SEEN) - continue; - p->object.flags |= SEEN; - insert_by_date(p, list); - } -} - -static void limit_list(struct rev_info *revs) -{ - struct commit_list *list = revs->commits; - struct commit_list *newlist = NULL; - struct commit_list **p = &newlist; - - while (list) { - struct commit_list *entry = list; - struct commit *commit = list->item; - struct object *obj = &commit->object; - - list = list->next; - free(entry); - - if (revs->max_age != -1 && (commit->date < revs->max_age)) - obj->flags |= UNINTERESTING; - add_parents_to_list(revs, commit, &list); - if (obj->flags & UNINTERESTING) { - mark_parents_uninteresting(commit); - if (everybody_uninteresting(list)) - break; - continue; - } - if (revs->min_age != -1 && (commit->date > revs->min_age)) - continue; - p = &commit_list_insert(commit, p)->next; - } - if (revs->boundary) { - /* mark the ones that are on the result list first */ - for (list = newlist; list; list = list->next) { - struct commit *commit = list->item; - commit->object.flags |= TMP_MARK; - } - for (list = newlist; list; list = list->next) { - struct commit *commit = list->item; - struct object *obj = &commit->object; - struct commit_list *parent; - if (obj->flags & UNINTERESTING) - continue; - for (parent = commit->parents; - parent; - parent = parent->next) { - struct commit *pcommit = parent->item; - if (!(pcommit->object.flags & UNINTERESTING)) - continue; - pcommit->object.flags |= BOUNDARY; - if (pcommit->object.flags & TMP_MARK) - continue; - pcommit->object.flags |= TMP_MARK; - p = &commit_list_insert(pcommit, p)->next; - } - } - for (list = newlist; list; list = list->next) { - struct commit *commit = list->item; - commit->object.flags &= ~TMP_MARK; - } - } - revs->commits = newlist; -} - -static int all_flags; -static struct rev_info *all_revs; - -static int handle_one_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data) -{ - struct object *object = get_reference(all_revs, path, sha1, all_flags); - add_pending_object(all_revs, object, ""); - return 0; -} - -static void handle_all(struct rev_info *revs, unsigned flags) -{ - all_revs = revs; - all_flags = flags; - for_each_ref(handle_one_ref, NULL); -} - -static int add_parents_only(struct rev_info *revs, const char *arg, int flags) -{ - unsigned char sha1[20]; - struct object *it; - struct commit *commit; - struct commit_list *parents; - - if (*arg == '^') { - flags ^= UNINTERESTING; - arg++; - } - if (get_sha1(arg, sha1)) - return 0; - while (1) { - it = get_reference(revs, arg, sha1, 0); - if (it->type != OBJ_TAG) - break; - hashcpy(sha1, ((struct tag*)it)->tagged->sha1); - } - if (it->type != OBJ_COMMIT) - return 0; - commit = (struct commit *)it; - for (parents = commit->parents; parents; parents = parents->next) { - it = &parents->item->object; - it->flags |= flags; - add_pending_object(revs, it, arg); - } - return 1; -} - -void init_revisions(struct rev_info *revs, const char *prefix) -{ - memset(revs, 0, sizeof(*revs)); - - revs->abbrev = DEFAULT_ABBREV; - revs->ignore_merges = 1; - revs->simplify_history = 1; - revs->pruning.recursive = 1; - revs->pruning.add_remove = file_add_remove; - revs->pruning.change = file_change; - revs->lifo = 1; - revs->dense = 1; - revs->prefix = prefix; - revs->max_age = -1; - revs->min_age = -1; - revs->max_count = -1; - - revs->prune_fn = NULL; - revs->prune_data = NULL; - - revs->topo_setter = topo_sort_default_setter; - revs->topo_getter = topo_sort_default_getter; - - revs->commit_format = CMIT_FMT_DEFAULT; - - diff_setup(&revs->diffopt); -} - -static void add_pending_commit_list(struct rev_info *revs, - struct commit_list *commit_list, - unsigned int flags) -{ - while (commit_list) { - struct object *object = &commit_list->item->object; - object->flags |= flags; - add_pending_object(revs, object, sha1_to_hex(object->sha1)); - commit_list = commit_list->next; - } -} - -static void prepare_show_merge(struct rev_info *revs) -{ - struct commit_list *bases; - struct commit *head, *other; - unsigned char sha1[20]; - const char **prune = NULL; - int i, prune_num = 1; /* counting terminating NULL */ - - if (get_sha1("HEAD", sha1) || !(head = lookup_commit(sha1))) - die("--merge without HEAD?"); - if (get_sha1("MERGE_HEAD", sha1) || !(other = lookup_commit(sha1))) - die("--merge without MERGE_HEAD?"); - add_pending_object(revs, &head->object, "HEAD"); - add_pending_object(revs, &other->object, "MERGE_HEAD"); - bases = get_merge_bases(head, other, 1); - while (bases) { - struct commit *it = bases->item; - struct commit_list *n = bases->next; - free(bases); - bases = n; - it->object.flags |= UNINTERESTING; - add_pending_object(revs, &it->object, "(merge-base)"); - } - - if (!active_nr) - read_cache(); - for (i = 0; i < active_nr; i++) { - struct cache_entry *ce = active_cache[i]; - if (!ce_stage(ce)) - continue; - if (ce_path_match(ce, revs->prune_data)) { - prune_num++; - prune = xrealloc(prune, sizeof(*prune) * prune_num); - prune[prune_num-2] = ce->name; - prune[prune_num-1] = NULL; - } - while ((i+1 < active_nr) && - ce_same_name(ce, active_cache[i+1])) - i++; - } - revs->prune_data = prune; -} - -int handle_revision_arg(const char *arg, struct rev_info *revs, - int flags, - int cant_be_filename) -{ - char *dotdot; - struct object *object; - unsigned char sha1[20]; - int local_flags; - - dotdot = strstr(arg, ".."); - if (dotdot) { - unsigned char from_sha1[20]; - const char *next = dotdot + 2; - const char *this = arg; - int symmetric = *next == '.'; - unsigned int flags_exclude = flags ^ UNINTERESTING; - - *dotdot = 0; - next += symmetric; - - if (!*next) - next = "HEAD"; - if (dotdot == arg) - this = "HEAD"; - if (!get_sha1(this, from_sha1) && - !get_sha1(next, sha1)) { - struct commit *a, *b; - struct commit_list *exclude; - - a = lookup_commit_reference(from_sha1); - b = lookup_commit_reference(sha1); - if (!a || !b) { - die(symmetric ? - "Invalid symmetric difference expression %s...%s" : - "Invalid revision range %s..%s", - arg, next); - } - - if (!cant_be_filename) { - *dotdot = '.'; - verify_non_filename(revs->prefix, arg); - } - - if (symmetric) { - exclude = get_merge_bases(a, b, 1); - add_pending_commit_list(revs, exclude, - flags_exclude); - free_commit_list(exclude); - a->object.flags |= flags; - } else - a->object.flags |= flags_exclude; - b->object.flags |= flags; - add_pending_object(revs, &a->object, this); - add_pending_object(revs, &b->object, next); - return 0; - } - *dotdot = '.'; - } - dotdot = strstr(arg, "^@"); - if (dotdot && !dotdot[2]) { - *dotdot = 0; - if (add_parents_only(revs, arg, flags)) - return 0; - *dotdot = '^'; - } - dotdot = strstr(arg, "^!"); - if (dotdot && !dotdot[2]) { - *dotdot = 0; - if (!add_parents_only(revs, arg, flags ^ UNINTERESTING)) - *dotdot = '^'; - } - - local_flags = 0; - if (*arg == '^') { - local_flags = UNINTERESTING; - arg++; - } - if (get_sha1(arg, sha1)) - return -1; - if (!cant_be_filename) - verify_non_filename(revs->prefix, arg); - object = get_reference(revs, arg, sha1, flags ^ local_flags); - add_pending_object(revs, object, arg); - return 0; -} - -static void add_grep(struct rev_info *revs, const char *ptn, enum grep_pat_token what) -{ - if (!revs->grep_filter) { - struct grep_opt *opt = xcalloc(1, sizeof(*opt)); - opt->status_only = 1; - opt->pattern_tail = &(opt->pattern_list); - opt->regflags = REG_NEWLINE; - revs->grep_filter = opt; - } - append_grep_pattern(revs->grep_filter, ptn, - "command line", 0, what); -} - -static void add_header_grep(struct rev_info *revs, const char *field, const char *pattern) -{ - char *pat; - const char *prefix; - int patlen, fldlen; - - fldlen = strlen(field); - patlen = strlen(pattern); - pat = xmalloc(patlen + fldlen + 10); - prefix = ".*"; - if (*pattern == '^') { - prefix = ""; - pattern++; - } - sprintf(pat, "^%s %s%s", field, prefix, pattern); - add_grep(revs, pat, GREP_PATTERN_HEAD); -} - -static void add_message_grep(struct rev_info *revs, const char *pattern) -{ - add_grep(revs, pattern, GREP_PATTERN_BODY); -} - -static void add_ignore_packed(struct rev_info *revs, const char *name) -{ - int num = ++revs->num_ignore_packed; - - revs->ignore_packed = xrealloc(revs->ignore_packed, - sizeof(const char **) * (num + 1)); - revs->ignore_packed[num-1] = name; - revs->ignore_packed[num] = NULL; -} - -/* - * Parse revision information, filling in the "rev_info" structure, - * and removing the used arguments from the argument list. - * - * Returns the number of arguments left that weren't recognized - * (which are also moved to the head of the argument list) - */ -int setup_revisions(int argc, const char **argv, struct rev_info *revs, const char *def) -{ - int i, flags, seen_dashdash, show_merge; - const char **unrecognized = argv + 1; - int left = 1; - int all_match = 0; - - /* First, search for "--" */ - seen_dashdash = 0; - for (i = 1; i < argc; i++) { - const char *arg = argv[i]; - if (strcmp(arg, "--")) - continue; - argv[i] = NULL; - argc = i; - revs->prune_data = get_pathspec(revs->prefix, argv + i + 1); - seen_dashdash = 1; - break; - } - - flags = show_merge = 0; - for (i = 1; i < argc; i++) { - const char *arg = argv[i]; - if (*arg == '-') { - int opts; - if (!strncmp(arg, "--max-count=", 12)) { - revs->max_count = atoi(arg + 12); - continue; - } - /* accept -, like traditional "head" */ - if ((*arg == '-') && isdigit(arg[1])) { - revs->max_count = atoi(arg + 1); - continue; - } - if (!strcmp(arg, "-n")) { - if (argc <= i + 1) - die("-n requires an argument"); - revs->max_count = atoi(argv[++i]); - continue; - } - if (!strncmp(arg,"-n",2)) { - revs->max_count = atoi(arg + 2); - continue; - } - if (!strncmp(arg, "--max-age=", 10)) { - revs->max_age = atoi(arg + 10); - continue; - } - if (!strncmp(arg, "--since=", 8)) { - revs->max_age = approxidate(arg + 8); - continue; - } - if (!strncmp(arg, "--after=", 8)) { - revs->max_age = approxidate(arg + 8); - continue; - } - if (!strncmp(arg, "--min-age=", 10)) { - revs->min_age = atoi(arg + 10); - continue; - } - if (!strncmp(arg, "--before=", 9)) { - revs->min_age = approxidate(arg + 9); - continue; - } - if (!strncmp(arg, "--until=", 8)) { - revs->min_age = approxidate(arg + 8); - continue; - } - if (!strcmp(arg, "--all")) { - handle_all(revs, flags); - continue; - } - if (!strcmp(arg, "--not")) { - flags ^= UNINTERESTING; - continue; - } - if (!strcmp(arg, "--default")) { - if (++i >= argc) - die("bad --default argument"); - def = argv[i]; - continue; - } - if (!strcmp(arg, "--merge")) { - show_merge = 1; - continue; - } - if (!strcmp(arg, "--topo-order")) { - revs->topo_order = 1; - continue; - } - if (!strcmp(arg, "--date-order")) { - revs->lifo = 0; - revs->topo_order = 1; - continue; - } - if (!strcmp(arg, "--parents")) { - revs->parents = 1; - continue; - } - if (!strcmp(arg, "--dense")) { - revs->dense = 1; - continue; - } - if (!strcmp(arg, "--sparse")) { - revs->dense = 0; - continue; - } - if (!strcmp(arg, "--remove-empty")) { - revs->remove_empty_trees = 1; - continue; - } - if (!strcmp(arg, "--no-merges")) { - revs->no_merges = 1; - continue; - } - if (!strcmp(arg, "--boundary")) { - revs->boundary = 1; - continue; - } - if (!strcmp(arg, "--objects")) { - revs->tag_objects = 1; - revs->tree_objects = 1; - revs->blob_objects = 1; - continue; - } - if (!strcmp(arg, "--objects-edge")) { - revs->tag_objects = 1; - revs->tree_objects = 1; - revs->blob_objects = 1; - revs->edge_hint = 1; - continue; - } - if (!strcmp(arg, "--unpacked")) { - revs->unpacked = 1; - free(revs->ignore_packed); - revs->ignore_packed = NULL; - revs->num_ignore_packed = 0; - continue; - } - if (!strncmp(arg, "--unpacked=", 11)) { - revs->unpacked = 1; - add_ignore_packed(revs, arg+11); - continue; - } - if (!strcmp(arg, "-r")) { - revs->diff = 1; - revs->diffopt.recursive = 1; - continue; - } - if (!strcmp(arg, "-t")) { - revs->diff = 1; - revs->diffopt.recursive = 1; - revs->diffopt.tree_in_recursive = 1; - continue; - } - if (!strcmp(arg, "-m")) { - revs->ignore_merges = 0; - continue; - } - if (!strcmp(arg, "-c")) { - revs->diff = 1; - revs->dense_combined_merges = 0; - revs->combine_merges = 1; - continue; - } - if (!strcmp(arg, "--cc")) { - revs->diff = 1; - revs->dense_combined_merges = 1; - revs->combine_merges = 1; - continue; - } - if (!strcmp(arg, "-v")) { - revs->verbose_header = 1; - continue; - } - if (!strncmp(arg, "--pretty", 8)) { - revs->verbose_header = 1; - revs->commit_format = get_commit_format(arg+8); - continue; - } - if (!strcmp(arg, "--root")) { - revs->show_root_diff = 1; - continue; - } - if (!strcmp(arg, "--no-commit-id")) { - revs->no_commit_id = 1; - continue; - } - if (!strcmp(arg, "--always")) { - revs->always_show_header = 1; - continue; - } - if (!strcmp(arg, "--no-abbrev")) { - revs->abbrev = 0; - continue; - } - if (!strcmp(arg, "--abbrev")) { - revs->abbrev = DEFAULT_ABBREV; - continue; - } - if (!strncmp(arg, "--abbrev=", 9)) { - revs->abbrev = strtoul(arg + 9, NULL, 10); - if (revs->abbrev < MINIMUM_ABBREV) - revs->abbrev = MINIMUM_ABBREV; - else if (revs->abbrev > 40) - revs->abbrev = 40; - continue; - } - if (!strcmp(arg, "--abbrev-commit")) { - revs->abbrev_commit = 1; - continue; - } - if (!strcmp(arg, "--full-diff")) { - revs->diff = 1; - revs->full_diff = 1; - continue; - } - if (!strcmp(arg, "--full-history")) { - revs->simplify_history = 0; - continue; - } - if (!strcmp(arg, "--relative-date")) { - revs->relative_date = 1; - continue; - } - - /* - * Grepping the commit log - */ - if (!strncmp(arg, "--author=", 9)) { - add_header_grep(revs, "author", arg+9); - continue; - } - if (!strncmp(arg, "--committer=", 12)) { - add_header_grep(revs, "committer", arg+12); - continue; - } - if (!strncmp(arg, "--grep=", 7)) { - add_message_grep(revs, arg+7); - continue; - } - if (!strcmp(arg, "--all-match")) { - all_match = 1; - continue; - } - - opts = diff_opt_parse(&revs->diffopt, argv+i, argc-i); - if (opts > 0) { - revs->diff = 1; - i += opts - 1; - continue; - } - *unrecognized++ = arg; - left++; - continue; - } - - if (handle_revision_arg(arg, revs, flags, seen_dashdash)) { - int j; - if (seen_dashdash || *arg == '^') - die("bad revision '%s'", arg); - - /* If we didn't have a "--": - * (1) all filenames must exist; - * (2) all rev-args must not be interpretable - * as a valid filename. - * but the latter we have checked in the main loop. - */ - for (j = i; j < argc; j++) - verify_filename(revs->prefix, argv[j]); - - revs->prune_data = get_pathspec(revs->prefix, - argv + i); - break; - } - } - - if (show_merge) - prepare_show_merge(revs); - if (def && !revs->pending.nr) { - unsigned char sha1[20]; - struct object *object; - if (get_sha1(def, sha1)) - die("bad default revision '%s'", def); - object = get_reference(revs, def, sha1, 0); - add_pending_object(revs, object, def); - } - - if (revs->topo_order) - revs->limited = 1; - - if (revs->prune_data) { - diff_tree_setup_paths(revs->prune_data, &revs->pruning); - revs->prune_fn = try_to_simplify_commit; - if (!revs->full_diff) - diff_tree_setup_paths(revs->prune_data, &revs->diffopt); - } - if (revs->combine_merges) { - revs->ignore_merges = 0; - if (revs->dense_combined_merges && !revs->diffopt.output_format) - revs->diffopt.output_format = DIFF_FORMAT_PATCH; - } - revs->diffopt.abbrev = revs->abbrev; - if (diff_setup_done(&revs->diffopt) < 0) - die("diff_setup_done failed"); - - if (revs->grep_filter) { - revs->grep_filter->all_match = all_match; - compile_grep_patterns(revs->grep_filter); - } - - return left; -} - -void prepare_revision_walk(struct rev_info *revs) -{ - int nr = revs->pending.nr; - struct object_array_entry *list = revs->pending.objects; - - revs->pending.nr = 0; - revs->pending.alloc = 0; - revs->pending.objects = NULL; - while (--nr >= 0) { - struct commit *commit = handle_commit(revs, list->item, list->name); - if (commit) { - if (!(commit->object.flags & SEEN)) { - commit->object.flags |= SEEN; - insert_by_date(commit, &revs->commits); - } - } - list++; - } - - if (revs->no_walk) - return; - if (revs->limited) - limit_list(revs); - if (revs->topo_order) - sort_in_topological_order_fn(&revs->commits, revs->lifo, - revs->topo_setter, - revs->topo_getter); -} - -static int rewrite_one(struct rev_info *revs, struct commit **pp) -{ - for (;;) { - struct commit *p = *pp; - if (!revs->limited) - add_parents_to_list(revs, p, &revs->commits); - if (p->parents && p->parents->next) - return 0; - if (p->object.flags & (TREECHANGE | UNINTERESTING)) - return 0; - if (!p->parents) - return -1; - *pp = p->parents->item; - } -} - -static void rewrite_parents(struct rev_info *revs, struct commit *commit) -{ - struct commit_list **pp = &commit->parents; - while (*pp) { - struct commit_list *parent = *pp; - if (rewrite_one(revs, &parent->item) < 0) { - *pp = parent->next; - continue; - } - pp = &parent->next; - } -} - -static void mark_boundary_to_show(struct commit *commit) -{ - struct commit_list *p = commit->parents; - while (p) { - commit = p->item; - p = p->next; - if (commit->object.flags & BOUNDARY) - commit->object.flags |= BOUNDARY_SHOW; - } -} - -static int commit_match(struct commit *commit, struct rev_info *opt) -{ - if (!opt->grep_filter) - return 1; - return grep_buffer(opt->grep_filter, - NULL, /* we say nothing, not even filename */ - commit->buffer, strlen(commit->buffer)); -} - -struct commit *get_revision(struct rev_info *revs) -{ - struct commit_list *list = revs->commits; - - if (!list) - return NULL; - - /* Check the max_count ... */ - switch (revs->max_count) { - case -1: - break; - case 0: - return NULL; - default: - revs->max_count--; - } - - do { - struct commit_list *entry = revs->commits; - struct commit *commit = entry->item; - - revs->commits = entry->next; - free(entry); - - /* - * If we haven't done the list limiting, we need to look at - * the parents here. We also need to do the date-based limiting - * that we'd otherwise have done in limit_list(). - */ - if (!revs->limited) { - if (revs->max_age != -1 && - (commit->date < revs->max_age)) - continue; - add_parents_to_list(revs, commit, &revs->commits); - } - if (commit->object.flags & SHOWN) - continue; - - if (revs->unpacked && has_sha1_pack(commit->object.sha1, - revs->ignore_packed)) - continue; - - /* We want to show boundary commits only when their - * children are shown. When path-limiter is in effect, - * rewrite_parents() drops some commits from getting shown, - * and there is no point showing boundary parents that - * are not shown. After rewrite_parents() rewrites the - * parents of a commit that is shown, we mark the boundary - * parents with BOUNDARY_SHOW. - */ - if (commit->object.flags & BOUNDARY_SHOW) { - commit->object.flags |= SHOWN; - return commit; - } - if (commit->object.flags & UNINTERESTING) - continue; - if (revs->min_age != -1 && (commit->date > revs->min_age)) - continue; - if (revs->no_merges && - commit->parents && commit->parents->next) - continue; - if (!commit_match(commit, revs)) - continue; - if (revs->prune_fn && revs->dense) { - /* Commit without changes? */ - if (!(commit->object.flags & TREECHANGE)) { - /* drop merges unless we want parenthood */ - if (!revs->parents) - continue; - /* non-merge - always ignore it */ - if (!commit->parents || !commit->parents->next) - continue; - } - if (revs->parents) - rewrite_parents(revs, commit); - } - if (revs->boundary) - mark_boundary_to_show(commit); - commit->object.flags |= SHOWN; - return commit; - } while (revs->commits); - return NULL; -} reverted: --- git-core-1.4.4.4/Makefile.orig +++ git-core-1.4.4.4.orig/Makefile.orig @@ -1,948 +0,0 @@ -# The default target of this Makefile is... -all: - -# Define NO_OPENSSL environment variable if you do not have OpenSSL. -# This also implies MOZILLA_SHA1. -# -# Define NO_CURL if you do not have curl installed. git-http-pull and -# git-http-push are not built, and you cannot use http:// and https:// -# transports. -# -# Define CURLDIR=/foo/bar if your curl header and library files are in -# /foo/bar/include and /foo/bar/lib directories. -# -# Define NO_EXPAT if you do not have expat installed. git-http-push is -# not built, and you cannot push using http:// and https:// transports. -# -# Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent. -# -# Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks -# d_type in struct dirent (latest Cygwin -- will be fixed soonish). -# -# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.) -# do not support the 'size specifiers' introduced by C99, namely ll, hh, -# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t). -# some C compilers supported these specifiers prior to C99 as an extension. -# -# Define NO_STRCASESTR if you don't have strcasestr. -# -# Define NO_STRLCPY if you don't have strlcpy. -# -# Define NO_SETENV if you don't have setenv in the C library. -# -# Define NO_SYMLINK_HEAD if you never want .git/HEAD to be a symbolic link. -# Enable it on Windows. By default, symrefs are still used. -# -# Define NO_SVN_TESTS if you want to skip time-consuming SVN interoperability -# tests. These tests take up a significant amount of the total test time -# but are not needed unless you plan to talk to SVN repos. -# -# Define NO_FINK if you are building on Darwin/Mac OS X, have Fink -# installed in /sw, but don't want GIT to link against any libraries -# installed there. If defined you may specify your own (or Fink's) -# include directories and library directories by defining CFLAGS -# and LDFLAGS appropriately. -# -# Define NO_DARWIN_PORTS if you are building on Darwin/Mac OS X, -# have DarwinPorts installed in /opt/local, but don't want GIT to -# link against any libraries installed there. If defined you may -# specify your own (or DarwinPort's) include directories and -# library directories by defining CFLAGS and LDFLAGS appropriately. -# -# Define PPC_SHA1 environment variable when running make to make use of -# a bundled SHA1 routine optimized for PowerPC. -# -# Define ARM_SHA1 environment variable when running make to make use of -# a bundled SHA1 routine optimized for ARM. -# -# Define MOZILLA_SHA1 environment variable when running make to make use of -# a bundled SHA1 routine coming from Mozilla. It is GPL'd and should be fast -# on non-x86 architectures (e.g. PowerPC), while the OpenSSL version (default -# choice) has very fast version optimized for i586. -# -# Define NEEDS_SSL_WITH_CRYPTO if you need -lcrypto with -lssl (Darwin). -# -# Define NEEDS_LIBICONV if linking with libc is not enough (Darwin). -# -# Define NEEDS_SOCKET if linking with libc is not enough (SunOS, -# Patrick Mauritz). -# -# Define NO_MMAP if you want to avoid mmap. -# -# Define WITH_OWN_SUBPROCESS_PY if you want to use with python 2.3. -# -# Define NO_IPV6 if you lack IPv6 support and getaddrinfo(). -# -# Define NO_SOCKADDR_STORAGE if your platform does not have struct -# sockaddr_storage. -# -# Define NO_ICONV if your libc does not properly support iconv. -# -# Define NO_ACCURATE_DIFF if your diff program at least sometimes misses -# a missing newline at the end of the file. -# -# Define COLLISION_CHECK below if you believe that SHA1's -# 1461501637330902918203684832716283019655932542976 hashes do not give you -# sufficient guarantee that no collisions between objects will ever happen. -# -# Define USE_NSEC below if you want git to care about sub-second file mtimes -# and ctimes. Note that you need recent glibc (at least 2.2.4) for this, and -# it will BREAK YOUR LOCAL DIFFS! show-diff and anything using it will likely -# randomly break unless your underlying filesystem supports those sub-second -# times (my ext3 doesn't). -# -# Define USE_STDEV below if you want git to care about the underlying device -# change being considered an inode change from the update-cache perspective. - -GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE - @$(SHELL_PATH) ./GIT-VERSION-GEN --include GIT-VERSION-FILE - -uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') -uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not') -uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') -uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not') -uname_P := $(shell sh -c 'uname -p 2>/dev/null || echo not') - -# CFLAGS and LDFLAGS are for the users to override from the command line. - -CFLAGS = -g -O2 -Wall -LDFLAGS = -ALL_CFLAGS = $(CFLAGS) -ALL_LDFLAGS = $(LDFLAGS) -STRIP ?= strip - -prefix = $(HOME) -bindir = $(prefix)/bin -gitexecdir = $(bindir) -template_dir = $(prefix)/share/git-core/templates/ -GIT_PYTHON_DIR = $(prefix)/share/git-core/python -# DESTDIR= - -# default configuration for gitweb -GITWEB_CONFIG = gitweb_config.perl -GITWEB_HOME_LINK_STR = projects -GITWEB_SITENAME = -GITWEB_PROJECTROOT = /pub/git -GITWEB_EXPORT_OK = -GITWEB_STRICT_EXPORT = -GITWEB_BASE_URL = -GITWEB_LIST = -GITWEB_HOMETEXT = indextext.html -GITWEB_CSS = gitweb.css -GITWEB_LOGO = git-logo.png -GITWEB_FAVICON = git-favicon.png -GITWEB_SITE_HEADER = -GITWEB_SITE_FOOTER = - -export prefix bindir gitexecdir template_dir GIT_PYTHON_DIR - -CC = gcc -AR = ar -TAR = tar -INSTALL = install -RPMBUILD = rpmbuild - -# sparse is architecture-neutral, which means that we need to tell it -# explicitly what architecture to check for. Fix this up for yours.. -SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__ - - - -### --- END CONFIGURATION SECTION --- - -# Those must not be GNU-specific; they are shared with perl/ which may -# be built by a different compiler. (Note that this is an artifact now -# but it still might be nice to keep that distinction.) -BASIC_CFLAGS = -BASIC_LDFLAGS = - -SCRIPT_SH = \ - git-bisect.sh git-checkout.sh \ - git-clean.sh git-clone.sh git-commit.sh \ - git-fetch.sh \ - git-ls-remote.sh \ - git-merge-one-file.sh git-parse-remote.sh \ - git-pull.sh git-rebase.sh \ - git-repack.sh git-request-pull.sh git-reset.sh \ - git-resolve.sh git-revert.sh git-sh-setup.sh \ - git-tag.sh git-verify-tag.sh \ - git-applymbox.sh git-applypatch.sh git-am.sh \ - git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \ - git-merge-resolve.sh git-merge-ours.sh \ - git-lost-found.sh git-quiltimport.sh - -SCRIPT_PERL = \ - git-archimport.perl git-cvsimport.perl git-relink.perl \ - git-shortlog.perl git-rerere.perl \ - git-cvsserver.perl \ - git-svnimport.perl git-cvsexportcommit.perl \ - git-send-email.perl git-svn.perl - -SCRIPT_PYTHON = \ - git-merge-recursive-old.py - -SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \ - $(patsubst %.perl,%,$(SCRIPT_PERL)) \ - $(patsubst %.py,%,$(SCRIPT_PYTHON)) \ - git-cherry-pick git-status git-instaweb - -# ... and all the rest that could be moved out of bindir to gitexecdir -PROGRAMS = \ - git-convert-objects$X git-fetch-pack$X git-fsck-objects$X \ - git-hash-object$X git-index-pack$X git-local-fetch$X \ - git-merge-base$X \ - git-daemon$X \ - git-merge-index$X git-mktag$X git-mktree$X git-patch-id$X \ - git-peek-remote$X git-receive-pack$X \ - git-send-pack$X git-shell$X \ - git-show-index$X git-ssh-fetch$X \ - git-ssh-upload$X git-unpack-file$X \ - git-update-server-info$X \ - git-upload-pack$X git-verify-pack$X \ - git-pack-redundant$X git-var$X \ - git-describe$X git-merge-tree$X git-imap-send$X \ - git-merge-recursive$X \ - $(EXTRA_PROGRAMS) - -# Empty... -EXTRA_PROGRAMS = - -BUILT_INS = \ - git-format-patch$X git-show$X git-whatchanged$X git-cherry$X \ - git-get-tar-commit-id$X \ - $(patsubst builtin-%.o,git-%$X,$(BUILTIN_OBJS)) - -# what 'all' will build and 'install' will install, in gitexecdir -ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS) \ - git-merge-recur$X - -# Backward compatibility -- to be removed after 1.0 -PROGRAMS += git-ssh-pull$X git-ssh-push$X - -# Set paths to tools early so that they can be used for version tests. -ifndef SHELL_PATH - SHELL_PATH = /bin/sh -endif -ifndef PERL_PATH - PERL_PATH = /usr/bin/perl -endif -ifndef PYTHON_PATH - PYTHON_PATH = /usr/bin/python -endif - -PYMODULES = \ - gitMergeCommon.py - -LIB_FILE=libgit.a -XDIFF_LIB=xdiff/lib.a - -LIB_H = \ - archive.h blob.h cache.h commit.h csum-file.h delta.h grep.h \ - diff.h object.h pack.h pkt-line.h quote.h refs.h list-objects.h sideband.h \ - run-command.h strbuf.h tag.h tree.h git-compat-util.h revision.h \ - tree-walk.h log-tree.h dir.h path-list.h unpack-trees.h builtin.h - -DIFF_OBJS = \ - diff.o diff-lib.o diffcore-break.o diffcore-order.o \ - diffcore-pickaxe.o diffcore-rename.o tree-diff.o combine-diff.o \ - diffcore-delta.o log-tree.o - -LIB_OBJS = \ - blob.o commit.o connect.o csum-file.o cache-tree.o base85.o \ - date.o diff-delta.o entry.o exec_cmd.o ident.o \ - interpolate.o \ - lockfile.o \ - object.o pack-check.o patch-delta.o path.o pkt-line.o sideband.o \ - quote.o read-cache.o refs.o run-command.o dir.o object-refs.o \ - server-info.o setup.o sha1_file.o sha1_name.o strbuf.o \ - tag.o tree.o usage.o config.o environment.o ctype.o copy.o \ - revision.o pager.o tree-walk.o xdiff-interface.o \ - write_or_die.o trace.o list-objects.o grep.o \ - alloc.o merge-file.o path-list.o help.o unpack-trees.o $(DIFF_OBJS) \ - color.o wt-status.o archive-zip.o archive-tar.o - -BUILTIN_OBJS = \ - builtin-add.o \ - builtin-annotate.o \ - builtin-apply.o \ - builtin-archive.o \ - builtin-blame.o \ - builtin-branch.o \ - builtin-cat-file.o \ - builtin-checkout-index.o \ - builtin-check-ref-format.o \ - builtin-commit-tree.o \ - builtin-count-objects.o \ - builtin-diff.o \ - builtin-diff-files.o \ - builtin-diff-index.o \ - builtin-diff-stages.o \ - builtin-diff-tree.o \ - builtin-fmt-merge-msg.o \ - builtin-for-each-ref.o \ - builtin-grep.o \ - builtin-init-db.o \ - builtin-log.o \ - builtin-ls-files.o \ - builtin-ls-tree.o \ - builtin-mailinfo.o \ - builtin-mailsplit.o \ - builtin-mv.o \ - builtin-name-rev.o \ - builtin-pack-objects.o \ - builtin-prune.o \ - builtin-prune-packed.o \ - builtin-push.o \ - builtin-read-tree.o \ - builtin-repo-config.o \ - builtin-rev-list.o \ - builtin-rev-parse.o \ - builtin-rm.o \ - builtin-runstatus.o \ - builtin-show-branch.o \ - builtin-stripspace.o \ - builtin-symbolic-ref.o \ - builtin-tar-tree.o \ - builtin-unpack-objects.o \ - builtin-update-index.o \ - builtin-update-ref.o \ - builtin-upload-archive.o \ - builtin-verify-pack.o \ - builtin-write-tree.o \ - builtin-show-ref.o \ - builtin-pack-refs.o - -GITLIBS = $(LIB_FILE) $(XDIFF_LIB) -EXTLIBS = -lz - -# -# Platform specific tweaks -# - -# We choose to avoid "if .. else if .. else .. endif endif" -# because maintaining the nesting to match is a pain. If -# we had "elif" things would have been much nicer... - -ifeq ($(uname_S),Linux) - NO_STRLCPY = YesPlease -endif -ifeq ($(uname_S),GNU/kFreeBSD) - NO_STRLCPY = YesPlease -endif -ifeq ($(uname_S),Darwin) - NEEDS_SSL_WITH_CRYPTO = YesPlease - NEEDS_LIBICONV = YesPlease - NO_STRLCPY = YesPlease -endif -ifeq ($(uname_S),SunOS) - NEEDS_SOCKET = YesPlease - NEEDS_NSL = YesPlease - SHELL_PATH = /bin/bash - NO_STRCASESTR = YesPlease - ifeq ($(uname_R),5.8) - NEEDS_LIBICONV = YesPlease - NO_UNSETENV = YesPlease - NO_SETENV = YesPlease - NO_C99_FORMAT = YesPlease - endif - ifeq ($(uname_R),5.9) - NO_UNSETENV = YesPlease - NO_SETENV = YesPlease - NO_C99_FORMAT = YesPlease - endif - INSTALL = ginstall - TAR = gtar - BASIC_CFLAGS += -D__EXTENSIONS__ -endif -ifeq ($(uname_O),Cygwin) - NO_D_TYPE_IN_DIRENT = YesPlease - NO_D_INO_IN_DIRENT = YesPlease - NO_STRCASESTR = YesPlease - NO_SYMLINK_HEAD = YesPlease - NEEDS_LIBICONV = YesPlease - NO_C99_FORMAT = YesPlease - # There are conflicting reports about this. - # On some boxes NO_MMAP is needed, and not so elsewhere. - # Try uncommenting this if you see things break -- YMMV. - # NO_MMAP = YesPlease - NO_IPV6 = YesPlease - X = .exe -endif -ifeq ($(uname_S),FreeBSD) - NEEDS_LIBICONV = YesPlease - BASIC_CFLAGS += -I/usr/local/include - BASIC_LDFLAGS += -L/usr/local/lib -endif -ifeq ($(uname_S),OpenBSD) - NO_STRCASESTR = YesPlease - NEEDS_LIBICONV = YesPlease - BASIC_CFLAGS += -I/usr/local/include - BASIC_LDFLAGS += -L/usr/local/lib -endif -ifeq ($(uname_S),NetBSD) - ifeq ($(shell expr "$(uname_R)" : '[01]\.'),2) - NEEDS_LIBICONV = YesPlease - endif - BASIC_CFLAGS += -I/usr/pkg/include - BASIC_LDFLAGS += -L/usr/pkg/lib - ALL_LDFLAGS += -Wl,-rpath,/usr/pkg/lib -endif -ifeq ($(uname_S),GNU) - # GNU stands for GNU/Hurd - NO_STRLCPY = YesPlease - ALL_CFLAGS += -DPATH_MAX=4096 -endif -ifeq ($(uname_S),AIX) - NO_STRCASESTR=YesPlease - NO_STRLCPY = YesPlease - NEEDS_LIBICONV=YesPlease -endif -ifeq ($(uname_S),IRIX64) - NO_IPV6=YesPlease - NO_SETENV=YesPlease - NO_STRCASESTR=YesPlease - NO_STRLCPY = YesPlease - NO_SOCKADDR_STORAGE=YesPlease - SHELL_PATH=/usr/gnu/bin/bash - BASIC_CFLAGS += -DPATH_MAX=1024 - # for now, build 32-bit version - BASIC_LDFLAGS += -L/usr/lib32 -endif -ifneq (,$(findstring arm,$(uname_M))) - ARM_SHA1 = YesPlease -endif - --include config.mak.autogen --include config.mak - -ifeq ($(uname_S),Darwin) - ifndef NO_FINK - ifeq ($(shell test -d /sw/lib && echo y),y) - BASIC_CFLAGS += -I/sw/include - BASIC_LDFLAGS += -L/sw/lib - endif - endif - ifndef NO_DARWIN_PORTS - ifeq ($(shell test -d /opt/local/lib && echo y),y) - BASIC_CFLAGS += -I/opt/local/include - BASIC_LDFLAGS += -L/opt/local/lib - endif - endif -endif - -ifdef WITH_OWN_SUBPROCESS_PY - PYMODULES += compat/subprocess.py -else - ifeq ($(NO_PYTHON),) - ifneq ($(shell $(PYTHON_PATH) -c 'import subprocess;print"OK"' 2>/dev/null),OK) - PYMODULES += compat/subprocess.py - endif - endif -endif - -ifndef NO_CURL - ifdef CURLDIR - # This is still problematic -- gcc does not always want -R. - BASIC_CFLAGS += -I$(CURLDIR)/include - CURL_LIBCURL = -L$(CURLDIR)/lib -R$(CURLDIR)/lib -lcurl - else - CURL_LIBCURL = -lcurl - endif - PROGRAMS += git-http-fetch$X - curl_check := $(shell (echo 070908; curl-config --vernum) | sort -r | sed -ne 2p) - ifeq "$(curl_check)" "070908" - ifndef NO_EXPAT - PROGRAMS += git-http-push$X - endif - endif - ifndef NO_EXPAT - EXPAT_LIBEXPAT = -lexpat - endif -endif - -ifndef NO_OPENSSL - OPENSSL_LIBSSL = -lssl - ifdef OPENSSLDIR - # Again this may be problematic -- gcc does not always want -R. - BASIC_CFLAGS += -I$(OPENSSLDIR)/include - OPENSSL_LINK = -L$(OPENSSLDIR)/lib -R$(OPENSSLDIR)/lib - else - OPENSSL_LINK = - endif -else - BASIC_CFLAGS += -DNO_OPENSSL - MOZILLA_SHA1 = 1 - OPENSSL_LIBSSL = -endif -ifdef NEEDS_SSL_WITH_CRYPTO - LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto -lssl -else - LIB_4_CRYPTO = $(OPENSSL_LINK) -lcrypto -endif -ifdef NEEDS_LIBICONV - ifdef ICONVDIR - # Again this may be problematic -- gcc does not always want -R. - BASIC_CFLAGS += -I$(ICONVDIR)/include - ICONV_LINK = -L$(ICONVDIR)/lib -R$(ICONVDIR)/lib - else - ICONV_LINK = - endif - EXTLIBS += $(ICONV_LINK) -liconv -endif -ifdef NEEDS_SOCKET - EXTLIBS += -lsocket -endif -ifdef NEEDS_NSL - EXTLIBS += -lnsl -endif -ifdef NO_D_TYPE_IN_DIRENT - BASIC_CFLAGS += -DNO_D_TYPE_IN_DIRENT -endif -ifdef NO_D_INO_IN_DIRENT - BASIC_CFLAGS += -DNO_D_INO_IN_DIRENT -endif -ifdef NO_C99_FORMAT - ALL_CFLAGS += -DNO_C99_FORMAT -endif -ifdef NO_SYMLINK_HEAD - BASIC_CFLAGS += -DNO_SYMLINK_HEAD -endif -ifdef NO_STRCASESTR - COMPAT_CFLAGS += -DNO_STRCASESTR - COMPAT_OBJS += compat/strcasestr.o -endif -ifdef NO_STRLCPY - COMPAT_CFLAGS += -DNO_STRLCPY - COMPAT_OBJS += compat/strlcpy.o -endif -ifdef NO_SETENV - COMPAT_CFLAGS += -DNO_SETENV - COMPAT_OBJS += compat/setenv.o -endif -ifdef NO_UNSETENV - COMPAT_CFLAGS += -DNO_UNSETENV - COMPAT_OBJS += compat/unsetenv.o -endif -ifdef NO_MMAP - COMPAT_CFLAGS += -DNO_MMAP - COMPAT_OBJS += compat/mmap.o -endif -ifdef NO_IPV6 - BASIC_CFLAGS += -DNO_IPV6 -endif -ifdef NO_SOCKADDR_STORAGE -ifdef NO_IPV6 - BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in -else - BASIC_CFLAGS += -Dsockaddr_storage=sockaddr_in6 -endif -endif -ifdef NO_INET_NTOP - LIB_OBJS += compat/inet_ntop.o -endif -ifdef NO_INET_PTON - LIB_OBJS += compat/inet_pton.o -endif - -ifdef NO_ICONV - BASIC_CFLAGS += -DNO_ICONV -endif - -ifdef PPC_SHA1 - SHA1_HEADER = "ppc/sha1.h" - LIB_OBJS += ppc/sha1.o ppc/sha1ppc.o -else -ifdef ARM_SHA1 - SHA1_HEADER = "arm/sha1.h" - LIB_OBJS += arm/sha1.o arm/sha1_arm.o -else -ifdef MOZILLA_SHA1 - SHA1_HEADER = "mozilla-sha1/sha1.h" - LIB_OBJS += mozilla-sha1/sha1.o -else - SHA1_HEADER = - EXTLIBS += $(LIB_4_CRYPTO) -endif -endif -endif -ifdef NO_ACCURATE_DIFF - BASIC_CFLAGS += -DNO_ACCURATE_DIFF -endif - -# Shell quote (do not use $(call) to accommodate ancient setups); - -SHA1_HEADER_SQ = $(subst ','\'',$(SHA1_HEADER)) - -DESTDIR_SQ = $(subst ','\'',$(DESTDIR)) -bindir_SQ = $(subst ','\'',$(bindir)) -gitexecdir_SQ = $(subst ','\'',$(gitexecdir)) -template_dir_SQ = $(subst ','\'',$(template_dir)) -prefix_SQ = $(subst ','\'',$(prefix)) - -SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH)) -PERL_PATH_SQ = $(subst ','\'',$(PERL_PATH)) -PYTHON_PATH_SQ = $(subst ','\'',$(PYTHON_PATH)) -GIT_PYTHON_DIR_SQ = $(subst ','\'',$(GIT_PYTHON_DIR)) - -LIBS = $(GITLIBS) $(EXTLIBS) - -BASIC_CFLAGS += -DSHA1_HEADER='$(SHA1_HEADER_SQ)' $(COMPAT_CFLAGS) -LIB_OBJS += $(COMPAT_OBJS) - -ALL_CFLAGS += $(BASIC_CFLAGS) -ALL_LDFLAGS += $(BASIC_LDFLAGS) - -export prefix TAR INSTALL DESTDIR SHELL_PATH template_dir - - -### Build rules - -all: $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk gitweb/gitweb.cgi - -all: perl/Makefile - $(MAKE) -C perl - $(MAKE) -C templates - -strip: $(PROGRAMS) git$X - $(STRIP) $(STRIP_OPTS) $(PROGRAMS) git$X - -git$X: git.c common-cmds.h $(BUILTIN_OBJS) $(GITLIBS) GIT-CFLAGS - $(CC) -DGIT_VERSION='"$(GIT_VERSION)"' \ - $(ALL_CFLAGS) -o $@ $(filter %.c,$^) \ - $(BUILTIN_OBJS) $(ALL_LDFLAGS) $(LIBS) - -help.o: common-cmds.h - -git-merge-recur$X: git-merge-recursive$X - rm -f $@ && ln git-merge-recursive$X $@ - -$(BUILT_INS): git$X - rm -f $@ && ln git$X $@ - -common-cmds.h: Documentation/git-*.txt - ./generate-cmdlist.sh > $@+ - mv $@+ $@ - -$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh - rm -f $@ $@+ - sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ - -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \ - -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \ - -e 's/@@NO_CURL@@/$(NO_CURL)/g' \ - -e 's/@@NO_PYTHON@@/$(NO_PYTHON)/g' \ - $@.sh >$@+ - chmod +x $@+ - mv $@+ $@ - -$(patsubst %.perl,%,$(SCRIPT_PERL)): perl/Makefile -$(patsubst %.perl,%,$(SCRIPT_PERL)): % : %.perl - rm -f $@ $@+ - INSTLIBDIR=`$(MAKE) -C perl -s --no-print-directory instlibdir` && \ - sed -e '1{' \ - -e ' s|#!.*perl|#!$(PERL_PATH_SQ)|' \ - -e ' h' \ - -e ' s=.*=use lib (split(/:/, $$ENV{GITPERLLIB} || "@@INSTLIBDIR@@"));=' \ - -e ' H' \ - -e ' x' \ - -e '}' \ - -e 's|@@INSTLIBDIR@@|'"$$INSTLIBDIR"'|g' \ - -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \ - $@.perl >$@+ - chmod +x $@+ - mv $@+ $@ - -$(patsubst %.py,%,$(SCRIPT_PYTHON)) : % : %.py GIT-CFLAGS - rm -f $@ $@+ - sed -e '1s|#!.*python|#!$(PYTHON_PATH_SQ)|' \ - -e 's|@@GIT_PYTHON_PATH@@|$(GIT_PYTHON_DIR_SQ)|g' \ - -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \ - $@.py >$@+ - chmod +x $@+ - mv $@+ $@ - -git-cherry-pick: git-revert - cp $< $@+ - mv $@+ $@ - -git-status: git-commit - cp $< $@+ - mv $@+ $@ - -gitweb/gitweb.cgi: gitweb/gitweb.perl - rm -f $@ $@+ - sed -e '1s|#!.*perl|#!$(PERL_PATH_SQ)|' \ - -e 's|++GIT_VERSION++|$(GIT_VERSION)|g' \ - -e 's|++GIT_BINDIR++|$(bindir)|g' \ - -e 's|++GITWEB_CONFIG++|$(GITWEB_CONFIG)|g' \ - -e 's|++GITWEB_HOME_LINK_STR++|$(GITWEB_HOME_LINK_STR)|g' \ - -e 's|++GITWEB_SITENAME++|$(GITWEB_SITENAME)|g' \ - -e 's|++GITWEB_PROJECTROOT++|$(GITWEB_PROJECTROOT)|g' \ - -e 's|++GITWEB_EXPORT_OK++|$(GITWEB_EXPORT_OK)|g' \ - -e 's|++GITWEB_STRICT_EXPORT++|$(GITWEB_STRICT_EXPORT)|g' \ - -e 's|++GITWEB_BASE_URL++|$(GITWEB_BASE_URL)|g' \ - -e 's|++GITWEB_LIST++|$(GITWEB_LIST)|g' \ - -e 's|++GITWEB_HOMETEXT++|$(GITWEB_HOMETEXT)|g' \ - -e 's|++GITWEB_CSS++|$(GITWEB_CSS)|g' \ - -e 's|++GITWEB_LOGO++|$(GITWEB_LOGO)|g' \ - -e 's|++GITWEB_FAVICON++|$(GITWEB_FAVICON)|g' \ - -e 's|++GITWEB_SITE_HEADER++|$(GITWEB_SITE_HEADER)|g' \ - -e 's|++GITWEB_SITE_FOOTER++|$(GITWEB_SITE_FOOTER)|g' \ - $< >$@+ - chmod +x $@+ - mv $@+ $@ - -git-instaweb: git-instaweb.sh gitweb/gitweb.cgi gitweb/gitweb.css - rm -f $@ $@+ - sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \ - -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \ - -e 's/@@NO_CURL@@/$(NO_CURL)/g' \ - -e 's/@@NO_PYTHON@@/$(NO_PYTHON)/g' \ - -e '/@@GITWEB_CGI@@/r gitweb/gitweb.cgi' \ - -e '/@@GITWEB_CGI@@/d' \ - -e '/@@GITWEB_CSS@@/r gitweb/gitweb.css' \ - -e '/@@GITWEB_CSS@@/d' \ - $@.sh > $@+ - chmod +x $@+ - mv $@+ $@ - -configure: configure.ac - rm -f $@ $<+ - sed -e 's/@@GIT_VERSION@@/$(GIT_VERSION)/g' \ - $< > $<+ - autoconf -o $@ $<+ - rm -f $<+ - -# These can record GIT_VERSION -git$X git.spec \ - $(patsubst %.sh,%,$(SCRIPT_SH)) \ - $(patsubst %.perl,%,$(SCRIPT_PERL)) \ - $(patsubst %.py,%,$(SCRIPT_PYTHON)) \ - : GIT-VERSION-FILE - -%.o: %.c GIT-CFLAGS - $(CC) -o $*.o -c $(ALL_CFLAGS) $< -%.o: %.S - $(CC) -o $*.o -c $(ALL_CFLAGS) $< - -exec_cmd.o: exec_cmd.c GIT-CFLAGS - $(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $< -builtin-init-db.o: builtin-init-db.c GIT-CFLAGS - $(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $< - -http.o: http.c GIT-CFLAGS - $(CC) -o $*.o -c $(ALL_CFLAGS) -DGIT_USER_AGENT='"git/$(GIT_VERSION)"' $< - -ifdef NO_EXPAT -http-fetch.o: http-fetch.c http.h GIT-CFLAGS - $(CC) -o $*.o -c $(ALL_CFLAGS) -DNO_EXPAT $< -endif - -git-%$X: %.o $(GITLIBS) - $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) - -ssh-pull.o: ssh-fetch.c -ssh-push.o: ssh-upload.c -git-local-fetch$X: fetch.o -git-ssh-fetch$X: rsh.o fetch.o -git-ssh-upload$X: rsh.o -git-ssh-pull$X: rsh.o fetch.o -git-ssh-push$X: rsh.o - -git-imap-send$X: imap-send.o $(LIB_FILE) - -http.o http-fetch.o http-push.o: http.h -git-http-fetch$X: fetch.o http.o http-fetch.o $(GITLIBS) - $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ - $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT) - -git-http-push$X: revision.o http.o http-push.o $(GITLIBS) - $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \ - $(LIBS) $(CURL_LIBCURL) $(EXPAT_LIBEXPAT) - -$(LIB_OBJS) $(BUILTIN_OBJS): $(LIB_H) -$(patsubst git-%$X,%.o,$(PROGRAMS)): $(LIB_H) $(wildcard */*.h) -$(DIFF_OBJS): diffcore.h - -$(LIB_FILE): $(LIB_OBJS) - rm -f $@ && $(AR) rcs $@ $(LIB_OBJS) - -XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o -$(XDIFF_OBJS): xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \ - xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h - -$(XDIFF_LIB): $(XDIFF_OBJS) - rm -f $@ && $(AR) rcs $@ $(XDIFF_OBJS) - - -perl/Makefile: perl/Git.pm perl/Makefile.PL GIT-CFLAGS - (cd perl && $(PERL_PATH) Makefile.PL \ - PREFIX='$(prefix_SQ)') - -doc: - $(MAKE) -C Documentation all - -TAGS: - rm -f TAGS - find . -name '*.[hcS]' -print | xargs etags -a - -tags: - rm -f tags - find . -name '*.[hcS]' -print | xargs ctags -a - -### Detect prefix changes -TRACK_CFLAGS = $(subst ','\'',$(ALL_CFLAGS)):$(GIT_PYTHON_DIR_SQ):\ - $(bindir_SQ):$(gitexecdir_SQ):$(template_dir_SQ):$(prefix_SQ) - -GIT-CFLAGS: .FORCE-GIT-CFLAGS - @FLAGS='$(TRACK_CFLAGS)'; \ - if test x"$$FLAGS" != x"`cat GIT-CFLAGS 2>/dev/null`" ; then \ - echo 1>&2 " * new build flags or prefix"; \ - echo "$$FLAGS" >GIT-CFLAGS; \ - fi - -### Testing rules - -# GNU make supports exporting all variables by "export" without parameters. -# However, the environment gets quite big, and some programs have problems -# with that. - -export NO_PYTHON -export NO_SVN_TESTS - -test: all - $(MAKE) -C t/ all - -test-date$X: test-date.c date.o ctype.o - $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) test-date.c date.o ctype.o - -test-delta$X: test-delta.c diff-delta.o patch-delta.o - $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $^ - -test-dump-cache-tree$X: dump-cache-tree.o $(GITLIBS) - $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) - -test-sha1$X: test-sha1.o $(GITLIBS) - $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS) - -check-sha1:: test-sha1$X - ./test-sha1.sh - -check: - for i in *.c; do sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i || exit; done - - - -### Installation rules - -install: all - $(INSTALL) -d -m755 '$(DESTDIR_SQ)$(bindir_SQ)' - $(INSTALL) -d -m755 '$(DESTDIR_SQ)$(gitexecdir_SQ)' - $(INSTALL) $(ALL_PROGRAMS) '$(DESTDIR_SQ)$(gitexecdir_SQ)' - $(INSTALL) git$X gitk '$(DESTDIR_SQ)$(bindir_SQ)' - $(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install - $(MAKE) -C perl install - $(INSTALL) -d -m755 '$(DESTDIR_SQ)$(GIT_PYTHON_DIR_SQ)' - $(INSTALL) $(PYMODULES) '$(DESTDIR_SQ)$(GIT_PYTHON_DIR_SQ)' - if test 'z$(bindir_SQ)' != 'z$(gitexecdir_SQ)'; \ - then \ - ln -f '$(DESTDIR_SQ)$(bindir_SQ)/git$X' \ - '$(DESTDIR_SQ)$(gitexecdir_SQ)/git$X' || \ - cp '$(DESTDIR_SQ)$(bindir_SQ)/git$X' \ - '$(DESTDIR_SQ)$(gitexecdir_SQ)/git$X'; \ - fi - $(foreach p,$(BUILT_INS), rm -f '$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' && ln '$(DESTDIR_SQ)$(gitexecdir_SQ)/git$X' '$(DESTDIR_SQ)$(gitexecdir_SQ)/$p' ;) - -install-doc: - $(MAKE) -C Documentation install - - - - -### Maintainer's dist rules - -git.spec: git.spec.in - sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+ - mv $@+ $@ - -GIT_TARNAME=git-$(GIT_VERSION) -dist: git.spec git-archive - ./git-archive --format=tar \ - --prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar - @mkdir -p $(GIT_TARNAME) - @cp git.spec $(GIT_TARNAME) - @echo $(GIT_VERSION) > $(GIT_TARNAME)/version - $(TAR) rf $(GIT_TARNAME).tar \ - $(GIT_TARNAME)/git.spec $(GIT_TARNAME)/version - @rm -rf $(GIT_TARNAME) - gzip -f -9 $(GIT_TARNAME).tar - -rpm: dist - $(RPMBUILD) -ta $(GIT_TARNAME).tar.gz - -htmldocs = git-htmldocs-$(GIT_VERSION) -manpages = git-manpages-$(GIT_VERSION) -dist-doc: - rm -fr .doc-tmp-dir - mkdir .doc-tmp-dir - $(MAKE) -C Documentation WEBDOC_DEST=../.doc-tmp-dir install-webdoc - cd .doc-tmp-dir && $(TAR) cf ../$(htmldocs).tar . - gzip -n -9 -f $(htmldocs).tar - : - rm -fr .doc-tmp-dir - mkdir .doc-tmp-dir .doc-tmp-dir/man1 .doc-tmp-dir/man7 - $(MAKE) -C Documentation DESTDIR=./ \ - man1dir=../.doc-tmp-dir/man1 \ - man7dir=../.doc-tmp-dir/man7 \ - install - cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar . - gzip -n -9 -f $(manpages).tar - rm -fr .doc-tmp-dir - -### Cleaning rules - -clean: - rm -f *.o mozilla-sha1/*.o arm/*.o ppc/*.o compat/*.o xdiff/*.o \ - $(LIB_FILE) $(XDIFF_LIB) - rm -f $(ALL_PROGRAMS) $(BUILT_INS) git$X - rm -f *.spec *.pyc *.pyo */*.pyc */*.pyo common-cmds.h TAGS tags - rm -rf autom4te.cache - rm -f configure config.log config.mak.autogen config.mak.append config.status config.cache - rm -rf $(GIT_TARNAME) .doc-tmp-dir - rm -f $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz - rm -f $(htmldocs).tar.gz $(manpages).tar.gz - rm -f gitweb/gitweb.cgi - $(MAKE) -C Documentation/ clean - [ ! -f perl/Makefile ] || $(MAKE) -C perl/ clean || $(MAKE) -C perl/ clean - rm -f perl/ppport.h perl/Makefile.old - $(MAKE) -C templates/ clean - $(MAKE) -C t/ clean - rm -f GIT-VERSION-FILE GIT-CFLAGS - -.PHONY: all install clean strip -.PHONY: .FORCE-GIT-VERSION-FILE TAGS tags .FORCE-GIT-CFLAGS - -### Check documentation -# -check-docs:: - @for v in $(ALL_PROGRAMS) $(BUILT_INS) git$X gitk; \ - do \ - case "$$v" in \ - git-merge-octopus | git-merge-ours | git-merge-recursive | \ - git-merge-resolve | git-merge-stupid | git-merge-recur | \ - git-merge-recursive-old | \ - git-ssh-pull | git-ssh-push ) continue ;; \ - esac ; \ - test -f "Documentation/$$v.txt" || \ - echo "no doc: $$v"; \ - grep -q "^gitlink:$$v\[[0-9]\]::" Documentation/git.txt || \ - case "$$v" in \ - git) ;; \ - *) echo "no link: $$v";; \ - esac ; \ - done | sort - -### Make sure built-ins do not have dups and listed in git.c -# -check-builtins:: - ./check-builtins.sh reverted: --- git-core-1.4.4.4/diff.h.orig +++ git-core-1.4.4.4.orig/diff.h.orig @@ -1,224 +0,0 @@ -/* - * Copyright (C) 2005 Junio C Hamano - */ -#ifndef DIFF_H -#define DIFF_H - -#include "tree-walk.h" - -struct rev_info; -struct diff_options; -struct diff_queue_struct; - -typedef void (*change_fn_t)(struct diff_options *options, - unsigned old_mode, unsigned new_mode, - const unsigned char *old_sha1, - const unsigned char *new_sha1, - const char *base, const char *path); - -typedef void (*add_remove_fn_t)(struct diff_options *options, - int addremove, unsigned mode, - const unsigned char *sha1, - const char *base, const char *path); - -typedef void (*diff_format_fn_t)(struct diff_queue_struct *q, - struct diff_options *options, void *data); - -#define DIFF_FORMAT_RAW 0x0001 -#define DIFF_FORMAT_DIFFSTAT 0x0002 -#define DIFF_FORMAT_NUMSTAT 0x0004 -#define DIFF_FORMAT_SUMMARY 0x0008 -#define DIFF_FORMAT_PATCH 0x0010 - -/* These override all above */ -#define DIFF_FORMAT_NAME 0x0100 -#define DIFF_FORMAT_NAME_STATUS 0x0200 -#define DIFF_FORMAT_CHECKDIFF 0x0400 - -/* Same as output_format = 0 but we know that -s flag was given - * and we should not give default value to output_format. - */ -#define DIFF_FORMAT_NO_OUTPUT 0x0800 - -#define DIFF_FORMAT_CALLBACK 0x1000 - -struct diff_options { - const char *filter; - const char *orderfile; - const char *pickaxe; - const char *single_follow; - unsigned recursive:1, - tree_in_recursive:1, - binary:1, - text:1, - full_index:1, - silent_on_remove:1, - find_copies_harder:1, - color_diff:1, - color_diff_words:1; - int context; - int break_opt; - int detect_rename; - int line_termination; - int output_format; - int pickaxe_opts; - int rename_score; - int reverse_diff; - int rename_limit; - int setup; - int abbrev; - const char *msg_sep; - const char *stat_sep; - long xdl_opts; - - int stat_width; - int stat_name_width; - - int nr_paths; - const char **paths; - int *pathlens; - change_fn_t change; - add_remove_fn_t add_remove; - diff_format_fn_t format_callback; - void *format_callback_data; -}; - -enum color_diff { - DIFF_RESET = 0, - DIFF_PLAIN = 1, - DIFF_METAINFO = 2, - DIFF_FRAGINFO = 3, - DIFF_FILE_OLD = 4, - DIFF_FILE_NEW = 5, - DIFF_COMMIT = 6, - DIFF_WHITESPACE = 7, -}; -const char *diff_get_color(int diff_use_color, enum color_diff ix); - -extern const char mime_boundary_leader[]; - -extern void diff_tree_setup_paths(const char **paths, struct diff_options *); -extern void diff_tree_release_paths(struct diff_options *); -extern int diff_tree(struct tree_desc *t1, struct tree_desc *t2, - const char *base, struct diff_options *opt); -extern int diff_tree_sha1(const unsigned char *old, const unsigned char *new, - const char *base, struct diff_options *opt); -extern int diff_root_tree_sha1(const unsigned char *new, const char *base, - struct diff_options *opt); - -struct combine_diff_path { - struct combine_diff_path *next; - int len; - char *path; - unsigned int mode; - unsigned char sha1[20]; - struct combine_diff_parent { - char status; - unsigned int mode; - unsigned char sha1[20]; - } parent[FLEX_ARRAY]; -}; -#define combine_diff_path_size(n, l) \ - (sizeof(struct combine_diff_path) + \ - sizeof(struct combine_diff_parent) * (n) + (l) + 1) - -extern void show_combined_diff(struct combine_diff_path *elem, int num_parent, - int dense, struct rev_info *); - -extern void diff_tree_combined(const unsigned char *sha1, const unsigned char parent[][20], int num_parent, int dense, struct rev_info *rev); - -extern void diff_tree_combined_merge(const unsigned char *sha1, int, struct rev_info *); - -extern void diff_addremove(struct diff_options *, - int addremove, - unsigned mode, - const unsigned char *sha1, - const char *base, - const char *path); - -extern void diff_change(struct diff_options *, - unsigned mode1, unsigned mode2, - const unsigned char *sha1, - const unsigned char *sha2, - const char *base, const char *path); - -extern void diff_unmerge(struct diff_options *, - const char *path); - -extern int diff_scoreopt_parse(const char *opt); - -#define DIFF_SETUP_REVERSE 1 -#define DIFF_SETUP_USE_CACHE 2 -#define DIFF_SETUP_USE_SIZE_CACHE 4 - -extern int git_diff_ui_config(const char *var, const char *value); -extern void diff_setup(struct diff_options *); -extern int diff_opt_parse(struct diff_options *, const char **, int); -extern int diff_setup_done(struct diff_options *); - -#define DIFF_DETECT_RENAME 1 -#define DIFF_DETECT_COPY 2 - -#define DIFF_PICKAXE_ALL 1 -#define DIFF_PICKAXE_REGEX 2 - -extern void diffcore_std(struct diff_options *); - -extern void diffcore_std_no_resolve(struct diff_options *); - -#define COMMON_DIFF_OPTIONS_HELP \ -"\ncommon diff options:\n" \ -" -z output diff-raw with lines terminated with NUL.\n" \ -" -p output patch format.\n" \ -" -u synonym for -p.\n" \ -" --patch-with-raw\n" \ -" output both a patch and the diff-raw format.\n" \ -" --stat show diffstat instead of patch.\n" \ -" --numstat show numeric diffstat instead of patch.\n" \ -" --patch-with-stat\n" \ -" output a patch and prepend its diffstat.\n" \ -" --name-only show only names of changed files.\n" \ -" --name-status show names and status of changed files.\n" \ -" --full-index show full object name on index lines.\n" \ -" --abbrev= abbreviate object names in diff-tree header and diff-raw.\n" \ -" -R swap input file pairs.\n" \ -" -B detect complete rewrites.\n" \ -" -M detect renames.\n" \ -" -C detect copies.\n" \ -" --find-copies-harder\n" \ -" try unchanged files as candidate for copy detection.\n" \ -" -l limit rename attempts up to paths.\n" \ -" -O reorder diffs according to the .\n" \ -" -S find filepair whose only one side contains the string.\n" \ -" --pickaxe-all\n" \ -" show all files diff when -S is used and hit is found.\n" \ -" -a --text treat all files as text.\n" - -extern int diff_queue_is_empty(void); -extern void diff_flush(struct diff_options*); - -/* diff-raw status letters */ -#define DIFF_STATUS_ADDED 'A' -#define DIFF_STATUS_COPIED 'C' -#define DIFF_STATUS_DELETED 'D' -#define DIFF_STATUS_MODIFIED 'M' -#define DIFF_STATUS_RENAMED 'R' -#define DIFF_STATUS_TYPE_CHANGED 'T' -#define DIFF_STATUS_UNKNOWN 'X' -#define DIFF_STATUS_UNMERGED 'U' - -/* these are not diff-raw status letters proper, but used by - * diffcore-filter insn to specify additional restrictions. - */ -#define DIFF_STATUS_FILTER_AON '*' -#define DIFF_STATUS_FILTER_BROKEN 'B' - -extern const char *diff_unique_abbrev(const unsigned char *, int); - -extern int run_diff_files(struct rev_info *revs, int silent_on_removed); - -extern int run_diff_index(struct rev_info *revs, int cached); - -extern int diff_flush_patch_id(struct diff_options *, unsigned char *); - -#endif /* DIFF_H */ only in patch2: unchanged: --- git-core-1.4.4.4.orig/debian/diff/SA35437.diff +++ git-core-1.4.4.4/debian/diff/SA35437.diff @@ -0,0 +1,36 @@ +--- a/daemon.c 2007-01-08 03:14:44.000000000 +0000 ++++ b/daemon.c 2009-06-17 13:38:13.000000000 +0000 +@@ -413,13 +413,13 @@ + * Separate the "extra args" information as supplied by the client connection. + * Any resulting data is squirrelled away in the given interpolation table. + */ +-static void parse_extra_args(struct interp *table, char *extra_args, int buflen) ++static void parse_host_arg(struct interp *table, char *extra_args, int buflen) + { + char *val; + int vallen; + char *end = extra_args + buflen; + +- while (extra_args < end && *extra_args) { ++ if (extra_args < end && *extra_args) { + saw_extended_args = 1; + if (strncasecmp("host=", extra_args, 5) == 0) { + val = extra_args + 5; +@@ -439,6 +439,8 @@ + /* On to the next one */ + extra_args = val + vallen; + } ++ if (extra_args < end && *extra_args) ++ die("Invalid request"); + } + } + +@@ -558,7 +560,7 @@ + interp_set_entry(interp_table, INTERP_SLOT_PERCENT, "%"); + + if (len != pktlen) { +- parse_extra_args(interp_table, line + len + 1, pktlen - len - 1); ++ parse_host_arg(interp_table, line + len + 1, pktlen - len - 1); + fill_in_extra_table_entries(interp_table); + } + only in patch2: unchanged: --- git-core-1.4.4.4.orig/debian/diff/install-templates-with-the-user-and-group-of-the-inst.diff +++ git-core-1.4.4.4/debian/diff/install-templates-with-the-user-and-group-of-the-inst.diff @@ -0,0 +1,34 @@ +From 8a6a00bdf6a2c313bcc7a8eace8d35e467075c4b Mon Sep 17 00:00:00 2001 +From: Gerrit Pape +Date: Tue, 24 Feb 2009 23:42:49 +0000 +Subject: [PATCH] Install templates with the user and group of the installing personality + +If 'make install' was run with sufficient privileges, then the installed +templates, which are copied using 'tar', would receive the user and group +of whoever built git. This instructs 'tar' to ignore the user and group +that are recorded in the archive. + +Signed-off-by: Johannes Sixt +Signed-off-by: Junio C Hamano +(cherry picked from commit 71f463773a310de016da20136fd7160685f97faa) + +Conflicts: + + templates/Makefile +--- + templates/Makefile | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/templates/Makefile b/templates/Makefile +index 9e1ae1a..bf6c371 100644 +--- a/templates/Makefile ++++ b/templates/Makefile +@@ -43,4 +43,4 @@ clean: + install: all + $(INSTALL) -d -m755 '$(DESTDIR_SQ)$(template_dir_SQ)' + (cd blt && $(TAR) cf - .) | \ +- (cd '$(DESTDIR_SQ)$(template_dir_SQ)' && $(TAR) xf -) ++ (cd '$(DESTDIR_SQ)$(template_dir_SQ)' && $(TAR) xfo -) +-- +1.6.1.3 +