So that we can covert the exported ref names.
Signed-off-by: Felipe Contreras felipe.contre...@gmail.com
---
Documentation/git-fast-export.txt | 4
builtin/fast-export.c | 30 ++
t/t9350-fast-export.sh| 7 +++
3 files changed, 41 insertions(+)
diff --git a/Documentation/git-fast-export.txt
b/Documentation/git-fast-export.txt
index 85f1f30..221506b 100644
--- a/Documentation/git-fast-export.txt
+++ b/Documentation/git-fast-export.txt
@@ -105,6 +105,10 @@ marks the same across runs.
in the commit (as opposed to just listing the files which are
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...]::
A list of arguments, acceptable to 'git rev-parse' and
'git rev-list', that specifies the specific objects and references
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 91114f4..7f314f0 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -17,6 +17,7 @@
#include utf8.h
#include parse-options.h
#include quote.h
+#include remote.h
static const char *fast_export_usage[] = {
N_(git fast-export [rev-list-opts]),
@@ -30,6 +31,8 @@ static int fake_missing_tagger;
static int use_done_feature;
static int no_data;
static int full_tree;
+static struct refspec *refspecs;
+static int refspecs_nr;
static int parse_opt_signed_tag_mode(const struct option *opt,
const char *arg, int unset)
@@ -502,6 +505,15 @@ static void get_tags_and_duplicates(struct
rev_cmdline_info *info,
if (dwim_ref(e-name, strlen(e-name), sha1, full_name) != 1)
continue;
+ if (refspecs) {
+ char *private;
+ private = apply_refspecs(refspecs, refspecs_nr,
full_name);
+ if (private) {
+ free(full_name);
+ full_name = private;
+ }
+ }
+
switch (e-item-type) {
case OBJ_COMMIT:
commit = (struct commit *)e-item;
@@ -661,6 +673,7 @@ int cmd_fast_export(int argc, const char **argv, const char
*prefix)
struct commit *commit;
char *export_filename = NULL, *import_filename = NULL;
uint32_t lastimportid;
+ struct string_list refspecs_list;
struct option options[] = {
OPT_INTEGER(0, progress, progress,
N_(show progress after n objects)),
@@ -681,6 +694,8 @@ int cmd_fast_export(int argc, const char **argv, const char
*prefix)
OPT_BOOLEAN(0, use-done-feature, use_done_feature,
N_(Use the done feature to terminate the
stream)),
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()
};
@@ -700,6 +715,19 @@ int cmd_fast_export(int argc, const char **argv, const
char *prefix)
if (argc 1)
usage_with_options (fast_export_usage, options);
+ if (refspecs_list.nr) {
+ const char *refspecs_str[refspecs_list.nr];
+ int i;
+
+ 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);
+ }
+
if (use_done_feature)
printf(feature done\n);
@@ -734,5 +762,7 @@ int cmd_fast_export(int argc, const char **argv, const char
*prefix)
if (use_done_feature)
printf(done\n);
+ free_refspec(refspecs_nr, refspecs);
+
return 0;
}
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 34c2d8f..dcf 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -504,4 +504,11 @@ test_expect_success 'refs are updated even if no commits
need to be exported' '
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
--
1.8.4-fc
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html