Merge branch 'jc/skip-count'
authorJunio C Hamano <junkio@cox.net>
Mon, 25 Dec 2006 11:27:41 +0000 (03:27 -0800)
committerJunio C Hamano <junkio@cox.net>
Mon, 25 Dec 2006 11:27:41 +0000 (03:27 -0800)
* jc/skip-count:
revision: --skip=<n>

1  2 
revision.c
revision.h
diff --combined revision.c
index 4dae5342eb6e14758c93fa4b2942d7c053111d04,5dc1e70260d45efded8f2329b6a4d8bf050c0537..e7eccd9180f855f7ff0df5c4515a6d98288fd127
@@@ -343,7 -343,6 +343,7 @@@ static void try_to_simplify_commit(stru
  static void add_parents_to_list(struct rev_info *revs, struct commit *commit, struct commit_list **list)
  {
        struct commit_list *parent = commit->parents;
 +      unsigned left_flag;
  
        if (commit->object.flags & ADDED)
                return;
        if (revs->no_walk)
                return;
  
 +      left_flag = (commit->object.flags & SYMMETRIC_LEFT);
        parent = commit->parents;
        while (parent) {
                struct commit *p = parent->item;
                parent = parent->next;
  
                parse_commit(p);
 +              p->object.flags |= left_flag;
                if (p->object.flags & SEEN)
                        continue;
                p->object.flags |= SEEN;
@@@ -526,6 -523,7 +526,7 @@@ void init_revisions(struct rev_info *re
        revs->prefix = prefix;
        revs->max_age = -1;
        revs->min_age = -1;
+       revs->skip_count = -1;
        revs->max_count = -1;
  
        revs->prune_fn = NULL;
@@@ -642,7 -640,7 +643,7 @@@ int handle_revision_arg(const char *arg
                                add_pending_commit_list(revs, exclude,
                                                        flags_exclude);
                                free_commit_list(exclude);
 -                              a->object.flags |= flags;
 +                              a->object.flags |= flags | SYMMETRIC_LEFT;
                        } else
                                a->object.flags |= flags_exclude;
                        b->object.flags |= flags;
@@@ -762,6 -760,10 +763,10 @@@ int setup_revisions(int argc, const cha
                                revs->max_count = atoi(arg + 12);
                                continue;
                        }
+                       if (!strncmp(arg, "--skip=", 7)) {
+                               revs->skip_count = atoi(arg + 7);
+                               continue;
+                       }
                        /* accept -<digit>, like traditional "head" */
                        if ((*arg == '-') && isdigit(arg[1])) {
                                revs->max_count = atoi(arg + 1);
                                revs->boundary = 1;
                                continue;
                        }
 +                      if (!strcmp(arg, "--left-right")) {
 +                              revs->left_right = 1;
 +                              continue;
 +                      }
                        if (!strcmp(arg, "--objects")) {
                                revs->tag_objects = 1;
                                revs->tree_objects = 1;
@@@ -1129,23 -1127,11 +1134,11 @@@ static int commit_match(struct commit *
                           commit->buffer, strlen(commit->buffer));
  }
  
- struct commit *get_revision(struct rev_info *revs)
+ static struct commit *get_revision_1(struct rev_info *revs)
  {
-       struct commit_list *list = revs->commits;
-       if (!list)
+       if (!revs->commits)
                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;
        } while (revs->commits);
        return NULL;
  }
+ struct commit *get_revision(struct rev_info *revs)
+ {
+       struct commit *c = NULL;
+       if (0 < revs->skip_count) {
+               while ((c = get_revision_1(revs)) != NULL) {
+                       if (revs->skip_count-- <= 0)
+                               break;
+               }
+       }
+       /* Check the max_count ... */
+       switch (revs->max_count) {
+       case -1:
+               break;
+       case 0:
+               return NULL;
+       default:
+               revs->max_count--;
+       }
+       if (c)
+               return c;
+       return get_revision_1(revs);
+ }
diff --combined revision.h
index 4585463a44c9faecdcdf4454b735b1e4ba1335aa,81f522c35d21397f432bdeed42dab1f0044df377..ec991e5c57039a57af7c63db483e5b108a25ad16
@@@ -9,7 -9,6 +9,7 @@@
  #define BOUNDARY      (1u<<5)
  #define BOUNDARY_SHOW (1u<<6)
  #define ADDED         (1u<<7) /* Parents already parsed and added? */
 +#define SYMMETRIC_LEFT        (1u<<8)
  
  struct rev_info;
  struct log_info;
@@@ -41,7 -40,6 +41,7 @@@ struct rev_info 
                        limited:1,
                        unpacked:1, /* see also ignore_packed below */
                        boundary:1,
 +                      left_right:1,
                        parents:1;
  
        /* Diff flags */
@@@ -77,6 -75,7 +77,7 @@@
        struct grep_opt *grep_filter;
  
        /* special limits */
+       int skip_count;
        int max_count;
        unsigned long max_age;
        unsigned long min_age;