Add branch --set-upstream
[gitweb.git] / fast-import.c
index ab099b63382e67e8094f5e865451d7e24ce96526..52d33bcba8c5ca834fc944bbb2d47ae14bf2f7b8 100644 (file)
@@ -19,8 +19,8 @@ Format of STDIN stream:
 
   new_commit ::= 'commit' sp ref_str lf
     mark?
-    ('author' sp name sp '<' email '>' sp when lf)?
-    'committer' sp name sp '<' email '>' sp when lf
+    ('author' (sp name)? sp '<' email '>' sp when lf)?
+    'committer' (sp name)? sp '<' email '>' sp when lf
     commit_msg
     ('from' sp committish lf)?
     ('merge' sp committish lf)*
@@ -47,7 +47,7 @@ Format of STDIN stream:
 
   new_tag ::= 'tag' sp tag_str lf
     'from' sp committish lf
-    ('tagger' sp name sp '<' email '>' sp when lf)?
+    ('tagger' (sp name)? sp '<' email '>' sp when lf)?
     tag_msg;
   tag_msg ::= data;
 
@@ -322,6 +322,8 @@ static struct object_entry *object_table[1 << 16];
 static struct mark_set *marks;
 static const char *export_marks_file;
 static const char *import_marks_file;
+static int import_marks_file_from_stream;
+static int relative_marks_paths;
 
 /* Our last blob */
 static struct last_object last_blob = { STRBUF_INIT, 0, 0, 0 };
@@ -2469,9 +2471,29 @@ static void parse_progress(void)
        skip_optional_lf();
 }
 
-static void option_import_marks(const char *marks)
+static char* make_fast_import_path(const char *path)
 {
-       import_marks_file = xstrdup(marks);
+       struct strbuf abs_path = STRBUF_INIT;
+
+       if (!relative_marks_paths || is_absolute_path(path))
+               return xstrdup(path);
+       strbuf_addf(&abs_path, "%s/info/fast-import/%s", get_git_dir(), path);
+       return strbuf_detach(&abs_path, NULL);
+}
+
+static void option_import_marks(const char *marks, int from_stream)
+{
+       if (import_marks_file) {
+               if (from_stream)
+                       die("Only one import-marks command allowed per stream");
+
+               /* read previous mark file */
+               if(!import_marks_file_from_stream)
+                       read_marks();
+       }
+
+       import_marks_file = make_fast_import_path(marks);
+       import_marks_file_from_stream = from_stream;
 }
 
 static void option_date_format(const char *fmt)
@@ -2505,7 +2527,7 @@ static void option_active_branches(const char *branches)
 
 static void option_export_marks(const char *marks)
 {
-       export_marks_file = xstrdup(marks);
+       export_marks_file = make_fast_import_path(marks);
 }
 
 static void option_export_pack_edges(const char *edges)
@@ -2538,14 +2560,18 @@ static int parse_one_option(const char *option)
        return 1;
 }
 
-static int parse_one_feature(const char *feature)
+static int parse_one_feature(const char *feature, int from_stream)
 {
        if (!prefixcmp(feature, "date-format=")) {
                option_date_format(feature + 12);
        } else if (!prefixcmp(feature, "import-marks=")) {
-               option_import_marks(feature + 13);
+               option_import_marks(feature + 13, from_stream);
        } else if (!prefixcmp(feature, "export-marks=")) {
                option_export_marks(feature + 13);
+       } else if (!prefixcmp(feature, "relative-marks")) {
+               relative_marks_paths = 1;
+       } else if (!prefixcmp(feature, "no-relative-marks")) {
+               relative_marks_paths = 0;
        } else if (!prefixcmp(feature, "force")) {
                force_update = 1;
        } else {
@@ -2562,7 +2588,7 @@ static void parse_feature(void)
        if (seen_data_command)
                die("Got feature command '%s' after data command", feature);
 
-       if (parse_one_feature(feature))
+       if (parse_one_feature(feature, 1))
                return;
 
        die("This version of fast-import does not support feature %s.", feature);
@@ -2618,7 +2644,7 @@ static void parse_argv(void)
                if (parse_one_option(a + 2))
                        continue;
 
-               if (parse_one_feature(a + 2))
+               if (parse_one_feature(a + 2, 0))
                        continue;
 
                die("unknown option %s", a);