fast-export: add new --refspec option
So that we can convert the exported ref names. Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
8b2f86a761
commit
03e9010c66
@ -105,6 +105,10 @@ marks the same across runs.
|
|||||||
in the commit (as opposed to just listing the files which are
|
in the commit (as opposed to just listing the files which are
|
||||||
different from the commit's first parent).
|
different from the commit's first parent).
|
||||||
|
|
||||||
|
--refspec::
|
||||||
|
Apply the specified refspec to each ref exported. Multiple of them can
|
||||||
|
be specified.
|
||||||
|
|
||||||
[<git-rev-list-args>...]::
|
[<git-rev-list-args>...]::
|
||||||
A list of arguments, acceptable to 'git rev-parse' and
|
A list of arguments, acceptable to 'git rev-parse' and
|
||||||
'git rev-list', that specifies the specific objects and references
|
'git rev-list', that specifies the specific objects and references
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
#include "quote.h"
|
#include "quote.h"
|
||||||
|
#include "remote.h"
|
||||||
|
|
||||||
static const char *fast_export_usage[] = {
|
static const char *fast_export_usage[] = {
|
||||||
N_("git fast-export [rev-list-opts]"),
|
N_("git fast-export [rev-list-opts]"),
|
||||||
@ -31,6 +32,8 @@ 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 struct string_list extra_refs = STRING_LIST_INIT_NODUP;
|
||||||
|
static struct refspec *refspecs;
|
||||||
|
static int refspecs_nr;
|
||||||
|
|
||||||
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)
|
||||||
@ -525,6 +528,15 @@ 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;
|
||||||
|
|
||||||
|
if (refspecs) {
|
||||||
|
char *private;
|
||||||
|
private = apply_refspecs(refspecs, refspecs_nr, full_name);
|
||||||
|
if (private) {
|
||||||
|
free(full_name);
|
||||||
|
full_name = private;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
commit = get_commit(e, full_name);
|
commit = get_commit(e, full_name);
|
||||||
if (!commit) {
|
if (!commit) {
|
||||||
warning("%s: Unexpected object of type %s, skipping.",
|
warning("%s: Unexpected object of type %s, skipping.",
|
||||||
@ -668,6 +680,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
|||||||
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;
|
||||||
|
struct string_list refspecs_list = STRING_LIST_INIT_NODUP;
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
OPT_INTEGER(0, "progress", &progress,
|
OPT_INTEGER(0, "progress", &progress,
|
||||||
N_("show progress after <n> objects")),
|
N_("show progress after <n> objects")),
|
||||||
@ -688,6 +701,8 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
|||||||
OPT_BOOL(0, "use-done-feature", &use_done_feature,
|
OPT_BOOL(0, "use-done-feature", &use_done_feature,
|
||||||
N_("Use the done feature to terminate the stream")),
|
N_("Use the done feature to terminate the stream")),
|
||||||
OPT_BOOL(0, "no-data", &no_data, N_("Skip output of blob data")),
|
OPT_BOOL(0, "no-data", &no_data, N_("Skip output of blob data")),
|
||||||
|
OPT_STRING_LIST(0, "refspec", &refspecs_list, N_("refspec"),
|
||||||
|
N_("Apply refspec to exported refs")),
|
||||||
OPT_END()
|
OPT_END()
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -707,6 +722,21 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
|||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
usage_with_options (fast_export_usage, options);
|
usage_with_options (fast_export_usage, options);
|
||||||
|
|
||||||
|
if (refspecs_list.nr) {
|
||||||
|
const char **refspecs_str;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
refspecs_str = xmalloc(sizeof(*refspecs_str) * refspecs_list.nr);
|
||||||
|
for (i = 0; i < refspecs_list.nr; i++)
|
||||||
|
refspecs_str[i] = refspecs_list.items[i].string;
|
||||||
|
|
||||||
|
refspecs_nr = refspecs_list.nr;
|
||||||
|
refspecs = parse_fetch_refspec(refspecs_nr, refspecs_str);
|
||||||
|
|
||||||
|
string_list_clear(&refspecs_list, 1);
|
||||||
|
free(refspecs_str);
|
||||||
|
}
|
||||||
|
|
||||||
if (use_done_feature)
|
if (use_done_feature)
|
||||||
printf("feature done\n");
|
printf("feature done\n");
|
||||||
|
|
||||||
@ -741,5 +771,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
|
|||||||
if (use_done_feature)
|
if (use_done_feature)
|
||||||
printf("done\n");
|
printf("done\n");
|
||||||
|
|
||||||
|
free_refspec(refspecs_nr, refspecs);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -504,4 +504,11 @@ test_expect_success 'refs are updated even if no commits need to be exported' '
|
|||||||
test_cmp expected actual
|
test_cmp expected actual
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'use refspec' '
|
||||||
|
git fast-export --refspec refs/heads/master:refs/heads/foobar master | \
|
||||||
|
grep "^commit " | sort | uniq > actual &&
|
||||||
|
echo "commit refs/heads/foobar" > expected &&
|
||||||
|
test_cmp expected actual
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Reference in New Issue
Block a user