зеркало из https://github.com/microsoft/git.git
rev-list --boundary
With the new --boundary flag, the output from rev-list includes the UNINTERESING commits at the boundary, which are usually not shown. Their object names are prefixed with '-'. For example, with this graph: C side / A---B---D master You would get something like this: $ git rev-list --boundary --header --parents side..master D B tree D^{tree} parent B ... log message for commit D here ... \0-B A tree B^{tree} parent A ... log message for commit B here ... \0 Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
9181ca2c2b
Коммит
384e99a4a9
|
@ -7,9 +7,9 @@
|
|||
#include "diff.h"
|
||||
#include "revision.h"
|
||||
|
||||
/* bits #0-4 in revision.h */
|
||||
/* bits #0-5 in revision.h */
|
||||
|
||||
#define COUNTED (1u<<5)
|
||||
#define COUNTED (1u<<6)
|
||||
|
||||
static const char rev_list_usage[] =
|
||||
"git-rev-list [OPTION] <commit-id>... [ -- paths... ]\n"
|
||||
|
@ -51,6 +51,8 @@ static void show_commit(struct commit *commit)
|
|||
printf("%lu ", commit->date);
|
||||
if (commit_prefix[0])
|
||||
fputs(commit_prefix, stdout);
|
||||
if (commit->object.flags & BOUNDARY)
|
||||
putchar('-');
|
||||
fputs(sha1_to_hex(commit->object.sha1), stdout);
|
||||
if (show_parents) {
|
||||
struct commit_list *parents = commit->parents;
|
||||
|
|
48
revision.c
48
revision.c
|
@ -419,6 +419,27 @@ static void limit_list(struct rev_info *revs)
|
|||
continue;
|
||||
p = &commit_list_insert(commit, p)->next;
|
||||
}
|
||||
if (revs->boundary) {
|
||||
list = newlist;
|
||||
while (list) {
|
||||
struct commit *commit = list->item;
|
||||
struct object *obj = &commit->object;
|
||||
struct commit_list *parent = commit->parents;
|
||||
if (obj->flags & (UNINTERESTING|BOUNDARY)) {
|
||||
list = list->next;
|
||||
continue;
|
||||
}
|
||||
while (parent) {
|
||||
struct commit *pcommit = parent->item;
|
||||
parent = parent->next;
|
||||
if (!(pcommit->object.flags & UNINTERESTING))
|
||||
continue;
|
||||
pcommit->object.flags |= BOUNDARY;
|
||||
p = &commit_list_insert(pcommit, p)->next;
|
||||
}
|
||||
list = list->next;
|
||||
}
|
||||
}
|
||||
revs->commits = newlist;
|
||||
}
|
||||
|
||||
|
@ -591,6 +612,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
|
|||
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;
|
||||
|
@ -731,13 +756,17 @@ struct commit *get_revision(struct rev_info *revs)
|
|||
do {
|
||||
struct commit *commit = revs->commits->item;
|
||||
|
||||
if (commit->object.flags & (UNINTERESTING|SHOWN))
|
||||
if (commit->object.flags & SHOWN)
|
||||
goto next;
|
||||
if (!(commit->object.flags & BOUNDARY) &&
|
||||
(commit->object.flags & UNINTERESTING))
|
||||
goto next;
|
||||
if (revs->min_age != -1 && (commit->date > revs->min_age))
|
||||
goto next;
|
||||
if (revs->max_age != -1 && (commit->date < revs->max_age))
|
||||
return NULL;
|
||||
if (revs->no_merges && commit->parents && commit->parents->next)
|
||||
if (revs->no_merges &&
|
||||
commit->parents && commit->parents->next)
|
||||
goto next;
|
||||
if (revs->prune_fn && revs->dense) {
|
||||
if (!(commit->object.flags & TREECHANGE))
|
||||
|
@ -745,8 +774,19 @@ struct commit *get_revision(struct rev_info *revs)
|
|||
rewrite_parents(commit);
|
||||
}
|
||||
/* More to go? */
|
||||
if (revs->max_count)
|
||||
pop_most_recent_commit(&revs->commits, SEEN);
|
||||
if (revs->max_count) {
|
||||
if (commit->object.flags & BOUNDARY) {
|
||||
/* this is already uninteresting,
|
||||
* so there is no point popping its
|
||||
* parents into the list.
|
||||
*/
|
||||
struct commit_list *it = revs->commits;
|
||||
revs->commits = it->next;
|
||||
free(it);
|
||||
}
|
||||
else
|
||||
pop_most_recent_commit(&revs->commits, SEEN);
|
||||
}
|
||||
commit->object.flags |= SHOWN;
|
||||
return commit;
|
||||
next:
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#define TREECHANGE (1u<<2)
|
||||
#define SHOWN (1u<<3)
|
||||
#define TMP_MARK (1u<<4) /* for isolated cases; clean after use */
|
||||
#define BOUNDARY (1u<<5)
|
||||
|
||||
struct rev_info;
|
||||
|
||||
|
@ -32,7 +33,8 @@ struct rev_info {
|
|||
blob_objects:1,
|
||||
edge_hint:1,
|
||||
limited:1,
|
||||
unpacked:1;
|
||||
unpacked:1,
|
||||
boundary:1;
|
||||
|
||||
/* special limits */
|
||||
int max_count;
|
||||
|
|
Загрузка…
Ссылка в новой задаче