Make "--parents" logs also be incremental
The parent rewriting feature caused us to create the whole history in one go, and then simplify it later, because of how rewrite_parents() had been written. However, with a little tweaking, it's perfectly possible to do even that one incrementally. Right now, this doesn't really much matter, because every user of "--parents" will probably generally _also_ use "--topo-order", which will cause the old non-incremental behaviour anyway. However, I'm hopeful that we could make even the topological sort incremental, or at least _partially_ so (for example, make it incremental up to the first merge). In the meantime, this at least moves things in the right direction, and removes a strange special case. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
0ed49a3ed9
commit
3381c790e5
10
http-push.c
10
http-push.c
@ -59,12 +59,12 @@ enum XML_Status {
|
|||||||
#define LOCK_TIME 600
|
#define LOCK_TIME 600
|
||||||
#define LOCK_REFRESH 30
|
#define LOCK_REFRESH 30
|
||||||
|
|
||||||
/* bits #0-4 in revision.h */
|
/* bits #0-6 in revision.h */
|
||||||
|
|
||||||
#define LOCAL (1u << 5)
|
#define LOCAL (1u << 7)
|
||||||
#define REMOTE (1u << 6)
|
#define REMOTE (1u << 8)
|
||||||
#define FETCHING (1u << 7)
|
#define FETCHING (1u << 9)
|
||||||
#define PUSHING (1u << 8)
|
#define PUSHING (1u << 10)
|
||||||
|
|
||||||
/* We allow "recursive" symbolic refs. Only within reason, though */
|
/* We allow "recursive" symbolic refs. Only within reason, though */
|
||||||
#define MAXDEPTH 5
|
#define MAXDEPTH 5
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
#include "tree-walk.h"
|
#include "tree-walk.h"
|
||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
|
|
||||||
/* bits #0-5 in revision.h */
|
/* bits #0-6 in revision.h */
|
||||||
|
|
||||||
#define COUNTED (1u<<6)
|
#define COUNTED (1u<<7)
|
||||||
|
|
||||||
static const char rev_list_usage[] =
|
static const char rev_list_usage[] =
|
||||||
"git-rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
|
"git-rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
|
||||||
|
21
revision.c
21
revision.c
@ -340,6 +340,10 @@ static void add_parents_to_list(struct rev_info *revs, struct commit *commit, st
|
|||||||
{
|
{
|
||||||
struct commit_list *parent = commit->parents;
|
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
|
* If the commit is uninteresting, don't try to
|
||||||
* prune parents - we want the maximal uninteresting
|
* prune parents - we want the maximal uninteresting
|
||||||
@ -705,13 +709,6 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
|
|||||||
if (revs->prune_data) {
|
if (revs->prune_data) {
|
||||||
diff_tree_setup_paths(revs->prune_data);
|
diff_tree_setup_paths(revs->prune_data);
|
||||||
revs->prune_fn = try_to_simplify_commit;
|
revs->prune_fn = try_to_simplify_commit;
|
||||||
|
|
||||||
/*
|
|
||||||
* If we fix up parent data, we currently cannot
|
|
||||||
* do that on-the-fly.
|
|
||||||
*/
|
|
||||||
if (revs->parents)
|
|
||||||
revs->limited = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return left;
|
return left;
|
||||||
@ -728,10 +725,12 @@ void prepare_revision_walk(struct rev_info *revs)
|
|||||||
revs->topo_getter);
|
revs->topo_getter);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rewrite_one(struct commit **pp)
|
static int rewrite_one(struct rev_info *revs, struct commit **pp)
|
||||||
{
|
{
|
||||||
for (;;) {
|
for (;;) {
|
||||||
struct commit *p = *pp;
|
struct commit *p = *pp;
|
||||||
|
if (!revs->limited)
|
||||||
|
add_parents_to_list(revs, p, &revs->commits);
|
||||||
if (p->object.flags & (TREECHANGE | UNINTERESTING))
|
if (p->object.flags & (TREECHANGE | UNINTERESTING))
|
||||||
return 0;
|
return 0;
|
||||||
if (!p->parents)
|
if (!p->parents)
|
||||||
@ -740,12 +739,12 @@ static int rewrite_one(struct commit **pp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rewrite_parents(struct commit *commit)
|
static void rewrite_parents(struct rev_info *revs, struct commit *commit)
|
||||||
{
|
{
|
||||||
struct commit_list **pp = &commit->parents;
|
struct commit_list **pp = &commit->parents;
|
||||||
while (*pp) {
|
while (*pp) {
|
||||||
struct commit_list *parent = *pp;
|
struct commit_list *parent = *pp;
|
||||||
if (rewrite_one(&parent->item) < 0) {
|
if (rewrite_one(revs, &parent->item) < 0) {
|
||||||
*pp = parent->next;
|
*pp = parent->next;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -802,7 +801,7 @@ struct commit *get_revision(struct rev_info *revs)
|
|||||||
if (!(commit->object.flags & TREECHANGE))
|
if (!(commit->object.flags & TREECHANGE))
|
||||||
continue;
|
continue;
|
||||||
if (revs->parents)
|
if (revs->parents)
|
||||||
rewrite_parents(commit);
|
rewrite_parents(revs, commit);
|
||||||
}
|
}
|
||||||
commit->object.flags |= SHOWN;
|
commit->object.flags |= SHOWN;
|
||||||
return commit;
|
return commit;
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#define SHOWN (1u<<3)
|
#define SHOWN (1u<<3)
|
||||||
#define TMP_MARK (1u<<4) /* for isolated cases; clean after use */
|
#define TMP_MARK (1u<<4) /* for isolated cases; clean after use */
|
||||||
#define BOUNDARY (1u<<5)
|
#define BOUNDARY (1u<<5)
|
||||||
|
#define ADDED (1u<<6) /* Parents already parsed and added? */
|
||||||
|
|
||||||
struct rev_info;
|
struct rev_info;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user