revision.c: use commit-slab for show_source
Instead of relying on commit->util to store the source string, let the user provide a commit-slab to store the source strings in. It's done so that commit->util can be removed. See more explanation in the commit that removes commit->util. Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3cc0287b39
commit
87be252333
@ -21,6 +21,7 @@
|
||||
#include "quote.h"
|
||||
#include "remote.h"
|
||||
#include "blob.h"
|
||||
#include "commit-slab.h"
|
||||
|
||||
static const char *fast_export_usage[] = {
|
||||
N_("git fast-export [rev-list-opts]"),
|
||||
@ -38,6 +39,7 @@ static struct string_list extra_refs = STRING_LIST_INIT_NODUP;
|
||||
static struct refspec *refspecs;
|
||||
static int refspecs_nr;
|
||||
static int anonymize;
|
||||
static struct revision_sources revision_sources;
|
||||
|
||||
static int parse_opt_signed_tag_mode(const struct option *opt,
|
||||
const char *arg, int unset)
|
||||
@ -590,7 +592,7 @@ static void handle_commit(struct commit *commit, struct rev_info *rev,
|
||||
if (!S_ISGITLINK(diff_queued_diff.queue[i]->two->mode))
|
||||
export_blob(&diff_queued_diff.queue[i]->two->oid);
|
||||
|
||||
refname = commit->util;
|
||||
refname = *revision_sources_at(&revision_sources, commit);
|
||||
if (anonymize) {
|
||||
refname = anonymize_refname(refname);
|
||||
anonymize_ident_line(&committer, &committer_end);
|
||||
@ -862,10 +864,11 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info)
|
||||
* This ref will not be updated through a commit, lets make
|
||||
* sure it gets properly updated eventually.
|
||||
*/
|
||||
if (commit->util || commit->object.flags & SHOWN)
|
||||
if (*revision_sources_at(&revision_sources, commit) ||
|
||||
commit->object.flags & SHOWN)
|
||||
string_list_append(&extra_refs, full_name)->util = commit;
|
||||
if (!commit->util)
|
||||
commit->util = full_name;
|
||||
if (!*revision_sources_at(&revision_sources, commit))
|
||||
*revision_sources_at(&revision_sources, commit) = full_name;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1029,8 +1032,9 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
||||
git_config(git_default_config, NULL);
|
||||
|
||||
init_revisions(&revs, prefix);
|
||||
init_revision_sources(&revision_sources);
|
||||
revs.topo_order = 1;
|
||||
revs.show_source = 1;
|
||||
revs.sources = &revision_sources;
|
||||
revs.rewrite_parents = 1;
|
||||
argc = parse_options(argc, argv, prefix, options, fast_export_usage,
|
||||
PARSE_OPT_KEEP_ARGV0 | PARSE_OPT_KEEP_UNKNOWN);
|
||||
|
@ -148,6 +148,7 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
|
||||
static struct string_list decorate_refs_include = STRING_LIST_INIT_NODUP;
|
||||
struct decoration_filter decoration_filter = {&decorate_refs_include,
|
||||
&decorate_refs_exclude};
|
||||
static struct revision_sources revision_sources;
|
||||
|
||||
const struct option builtin_log_options[] = {
|
||||
OPT__QUIET(&quiet, N_("suppress diff output")),
|
||||
@ -194,8 +195,10 @@ static void cmd_log_init_finish(int argc, const char **argv, const char *prefix,
|
||||
rev->diffopt.filter || rev->diffopt.flags.follow_renames)
|
||||
rev->always_show_header = 0;
|
||||
|
||||
if (source)
|
||||
rev->show_source = 1;
|
||||
if (source) {
|
||||
init_revision_sources(&revision_sources);
|
||||
rev->sources = &revision_sources;
|
||||
}
|
||||
|
||||
if (mailmap) {
|
||||
rev->mailmap = xcalloc(1, sizeof(struct string_list));
|
||||
|
@ -295,8 +295,12 @@ void show_decorations(struct rev_info *opt, struct commit *commit)
|
||||
{
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
|
||||
if (opt->show_source && commit->util)
|
||||
fprintf(opt->diffopt.file, "\t%s", (char *) commit->util);
|
||||
if (opt->sources) {
|
||||
char **slot = revision_sources_peek(opt->sources, commit);
|
||||
|
||||
if (slot && *slot)
|
||||
fprintf(opt->diffopt.file, "\t%s", *slot);
|
||||
}
|
||||
if (!opt->show_decorations)
|
||||
return;
|
||||
format_decorations(&sb, commit, opt->diffopt.use_color);
|
||||
|
19
revision.c
19
revision.c
@ -29,6 +29,8 @@ volatile show_early_output_fn_t show_early_output;
|
||||
static const char *term_bad;
|
||||
static const char *term_good;
|
||||
|
||||
implement_shared_commit_slab(revision_sources, char *);
|
||||
|
||||
void show_object_with_name(FILE *out, struct object *obj, const char *name)
|
||||
{
|
||||
const char *p;
|
||||
@ -255,14 +257,19 @@ static struct commit *handle_commit(struct rev_info *revs,
|
||||
*/
|
||||
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) {
|
||||
mark_parents_uninteresting(commit);
|
||||
revs->limited = 1;
|
||||
}
|
||||
if (revs->show_source && !commit->util)
|
||||
commit->util = xstrdup(name);
|
||||
if (revs->sources) {
|
||||
char **slot = revision_sources_at(revs->sources, commit);
|
||||
|
||||
if (!*slot)
|
||||
*slot = xstrdup(name);
|
||||
}
|
||||
return commit;
|
||||
}
|
||||
|
||||
@ -814,8 +821,12 @@ static int add_parents_to_list(struct rev_info *revs, struct commit *commit,
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
if (revs->show_source && !p->util)
|
||||
p->util = commit->util;
|
||||
if (revs->sources) {
|
||||
char **slot = revision_sources_at(revs->sources, p);
|
||||
|
||||
if (!*slot)
|
||||
*slot = *revision_sources_at(revs->sources, commit);
|
||||
}
|
||||
p->object.flags |= left_flag;
|
||||
if (!(p->object.flags & SEEN)) {
|
||||
p->object.flags |= SEEN;
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "notes.h"
|
||||
#include "pretty.h"
|
||||
#include "diff.h"
|
||||
#include "commit-slab-decl.h"
|
||||
|
||||
/* Remember to update object flag allocation in object.h */
|
||||
#define SEEN (1u<<0)
|
||||
@ -29,6 +30,7 @@ struct rev_info;
|
||||
struct log_info;
|
||||
struct string_list;
|
||||
struct saved_parents;
|
||||
define_shared_commit_slab(revision_sources, char *);
|
||||
|
||||
struct rev_cmdline_info {
|
||||
unsigned int nr;
|
||||
@ -111,7 +113,6 @@ struct rev_info {
|
||||
right_only:1,
|
||||
rewrite_parents:1,
|
||||
print_parents:1,
|
||||
show_source:1,
|
||||
show_decorations:1,
|
||||
reverse:1,
|
||||
reverse_output_stage:1,
|
||||
@ -224,6 +225,8 @@ struct rev_info {
|
||||
|
||||
struct commit_list *previous_parents;
|
||||
const char *break_bar;
|
||||
|
||||
struct revision_sources *sources;
|
||||
};
|
||||
|
||||
extern int ref_excluded(struct string_list *, const char *path);
|
||||
|
Loading…
Reference in New Issue
Block a user