mirror of
https://github.com/git/git.git
synced 2025-03-30 19:10:25 +00:00
Merge branch 'fc/fast-export'
Code simpification. * fc/fast-export: fast-export: refactor get_tags_and_duplicates() fast-export: make extra_refs global
This commit is contained in:
commit
984ac91e72
@ -30,6 +30,7 @@ static int fake_missing_tagger;
|
|||||||
static int use_done_feature;
|
static int use_done_feature;
|
||||||
static int no_data;
|
static int no_data;
|
||||||
static int full_tree;
|
static int full_tree;
|
||||||
|
static struct string_list extra_refs = STRING_LIST_INIT_NODUP;
|
||||||
|
|
||||||
static int parse_opt_signed_tag_mode(const struct option *opt,
|
static int parse_opt_signed_tag_mode(const struct option *opt,
|
||||||
const char *arg, int unset)
|
const char *arg, int unset)
|
||||||
@ -484,10 +485,32 @@ static void handle_tag(const char *name, struct tag *tag)
|
|||||||
(int)message_size, (int)message_size, message ? message : "");
|
(int)message_size, (int)message_size, message ? message : "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void get_tags_and_duplicates(struct rev_cmdline_info *info,
|
static struct commit *get_commit(struct rev_cmdline_entry *e, char *full_name)
|
||||||
struct string_list *extra_refs)
|
{
|
||||||
|
switch (e->item->type) {
|
||||||
|
case OBJ_COMMIT:
|
||||||
|
return (struct commit *)e->item;
|
||||||
|
case OBJ_TAG: {
|
||||||
|
struct tag *tag = (struct tag *)e->item;
|
||||||
|
|
||||||
|
/* handle nested tags */
|
||||||
|
while (tag && tag->object.type == OBJ_TAG) {
|
||||||
|
parse_object(tag->object.sha1);
|
||||||
|
string_list_append(&extra_refs, full_name)->util = tag;
|
||||||
|
tag = (struct tag *)tag->tagged;
|
||||||
|
}
|
||||||
|
if (!tag)
|
||||||
|
die("Tag %s points nowhere?", e->name);
|
||||||
|
return (struct commit *)tag;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void get_tags_and_duplicates(struct rev_cmdline_info *info)
|
||||||
{
|
{
|
||||||
struct tag *tag;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < info->nr; i++) {
|
for (i = 0; i < info->nr; i++) {
|
||||||
@ -502,60 +525,45 @@ static void get_tags_and_duplicates(struct rev_cmdline_info *info,
|
|||||||
if (dwim_ref(e->name, strlen(e->name), sha1, &full_name) != 1)
|
if (dwim_ref(e->name, strlen(e->name), sha1, &full_name) != 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
switch (e->item->type) {
|
commit = get_commit(e, full_name);
|
||||||
case OBJ_COMMIT:
|
if (!commit) {
|
||||||
commit = (struct commit *)e->item;
|
|
||||||
break;
|
|
||||||
case OBJ_TAG:
|
|
||||||
tag = (struct tag *)e->item;
|
|
||||||
|
|
||||||
/* handle nested tags */
|
|
||||||
while (tag && tag->object.type == OBJ_TAG) {
|
|
||||||
parse_object(tag->object.sha1);
|
|
||||||
string_list_append(extra_refs, full_name)->util = tag;
|
|
||||||
tag = (struct tag *)tag->tagged;
|
|
||||||
}
|
|
||||||
if (!tag)
|
|
||||||
die ("Tag %s points nowhere?", e->name);
|
|
||||||
switch(tag->object.type) {
|
|
||||||
case OBJ_COMMIT:
|
|
||||||
commit = (struct commit *)tag;
|
|
||||||
break;
|
|
||||||
case OBJ_BLOB:
|
|
||||||
export_blob(tag->object.sha1);
|
|
||||||
continue;
|
|
||||||
default: /* OBJ_TAG (nested tags) is already handled */
|
|
||||||
warning("Tag points to object of unexpected type %s, skipping.",
|
|
||||||
typename(tag->object.type));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
warning("%s: Unexpected object of type %s, skipping.",
|
warning("%s: Unexpected object of type %s, skipping.",
|
||||||
e->name,
|
e->name,
|
||||||
typename(e->item->type));
|
typename(e->item->type));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch(commit->object.type) {
|
||||||
|
case OBJ_COMMIT:
|
||||||
|
break;
|
||||||
|
case OBJ_BLOB:
|
||||||
|
export_blob(commit->object.sha1);
|
||||||
|
continue;
|
||||||
|
default: /* OBJ_TAG (nested tags) is already handled */
|
||||||
|
warning("Tag points to object of unexpected type %s, skipping.",
|
||||||
|
typename(commit->object.type));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This ref will not be updated through a commit, lets make
|
* This ref will not be updated through a commit, lets make
|
||||||
* sure it gets properly updated eventually.
|
* sure it gets properly updated eventually.
|
||||||
*/
|
*/
|
||||||
if (commit->util || commit->object.flags & SHOWN)
|
if (commit->util || commit->object.flags & SHOWN)
|
||||||
string_list_append(extra_refs, full_name)->util = commit;
|
string_list_append(&extra_refs, full_name)->util = commit;
|
||||||
if (!commit->util)
|
if (!commit->util)
|
||||||
commit->util = full_name;
|
commit->util = full_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_tags_and_duplicates(struct string_list *extra_refs)
|
static void handle_tags_and_duplicates(void)
|
||||||
{
|
{
|
||||||
struct commit *commit;
|
struct commit *commit;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = extra_refs->nr - 1; i >= 0; i--) {
|
for (i = extra_refs.nr - 1; i >= 0; i--) {
|
||||||
const char *name = extra_refs->items[i].string;
|
const char *name = extra_refs.items[i].string;
|
||||||
struct object *object = extra_refs->items[i].util;
|
struct object *object = extra_refs.items[i].util;
|
||||||
switch (object->type) {
|
switch (object->type) {
|
||||||
case OBJ_TAG:
|
case OBJ_TAG:
|
||||||
handle_tag(name, (struct tag *)object);
|
handle_tag(name, (struct tag *)object);
|
||||||
@ -657,7 +665,6 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
|||||||
{
|
{
|
||||||
struct rev_info revs;
|
struct rev_info revs;
|
||||||
struct object_array commits = OBJECT_ARRAY_INIT;
|
struct object_array commits = OBJECT_ARRAY_INIT;
|
||||||
struct string_list extra_refs = STRING_LIST_INIT_NODUP;
|
|
||||||
struct commit *commit;
|
struct commit *commit;
|
||||||
char *export_filename = NULL, *import_filename = NULL;
|
char *export_filename = NULL, *import_filename = NULL;
|
||||||
uint32_t lastimportid;
|
uint32_t lastimportid;
|
||||||
@ -709,7 +716,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
|||||||
if (import_filename && revs.prune_data.nr)
|
if (import_filename && revs.prune_data.nr)
|
||||||
full_tree = 1;
|
full_tree = 1;
|
||||||
|
|
||||||
get_tags_and_duplicates(&revs.cmdline, &extra_refs);
|
get_tags_and_duplicates(&revs.cmdline);
|
||||||
|
|
||||||
if (prepare_revision_walk(&revs))
|
if (prepare_revision_walk(&revs))
|
||||||
die("revision walk setup failed");
|
die("revision walk setup failed");
|
||||||
@ -725,7 +732,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handle_tags_and_duplicates(&extra_refs);
|
handle_tags_and_duplicates();
|
||||||
|
|
||||||
if (export_filename && lastimportid != last_idnum)
|
if (export_filename && lastimportid != last_idnum)
|
||||||
export_marks(export_filename);
|
export_marks(export_filename);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user