static int revs_only = 0;
static int do_rev_argument = 1;
static int output_revs = 0;
+static int flags_only = 0;
+static int no_flags = 0;
#define NORMAL 0
#define REVERSED 1
static void show_norev(char *norev)
{
+ if (flags_only)
+ return;
if (revs_only)
return;
puts(norev);
static void show_arg(char *arg)
{
+ if (no_flags)
+ return;
if (do_rev_argument && is_rev_argument(arg))
show_rev_arg(arg);
else
return 0;
}
+static int match_sha(unsigned len, const unsigned char *a, const unsigned char *b)
+{
+ do {
+ if (*a != *b)
+ return 0;
+ a++;
+ b++;
+ len -= 2;
+ } while (len > 1);
+ if (len)
+ if ((*a ^ *b) & 0xf0)
+ return 0;
+ return 1;
+}
+
static int find_short_packed_object(int len, const unsigned char *match, unsigned char *sha1)
{
+ struct packed_git *p;
+
+ prepare_packed_git();
+ for (p = packed_git; p; p = p->next) {
+ unsigned num = num_packed_objects(p);
+ unsigned first = 0, last = num;
+ while (first < last) {
+ unsigned mid = (first + last) / 2;
+ unsigned char now[20];
+ int cmp;
+
+ nth_packed_object_sha1(p, mid, now);
+ cmp = memcmp(match, now, 20);
+ if (!cmp) {
+ first = mid;
+ break;
+ }
+ if (cmp > 0) {
+ first = mid+1;
+ continue;
+ }
+ last = mid;
+ }
+ if (first < num) {
+ unsigned char now[20], next[20];
+ nth_packed_object_sha1(p, first, now);
+ if (match_sha(len, match, now)) {
+ if (nth_packed_object_sha1(p, first+1, next) || !match_sha(len, match, next)) {
+ memcpy(sha1, now, 20);
+ return 1;
+ }
+ }
+ }
+ }
return 0;
}
no_revs = 1;
continue;
}
+ if (!strcmp(arg, "--flags")) {
+ flags_only = 1;
+ continue;
+ }
+ if (!strcmp(arg, "--no-flags")) {
+ no_flags = 1;
+ continue;
+ }
if (!strcmp(arg, "--verify")) {
revs_only = 1;
do_rev_argument = 0;