When using a mark reference as a path name, the mark reference will be expanded to the 40-byte hex version of the object name associated with the mark. This is useful e.g. when importing notes objects (where the filenames in a notes tree are the object names of the annotated objects). Signed-off-by: Johan Herland <johan@xxxxxxxxxxx> --- Documentation/git-fast-import.txt | 9 +++++++-- fast-import.c | 11 +++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index c2f483a..bbc8b78 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -487,12 +487,17 @@ in octal. Git only supports the following modes: In both formats `<path>` is the complete path of the file to be added (if not already existing) or modified (if already existing). +`<path>` may also be a mark reference (`:<idnum>`) set by a prior +command, which will expand to a full 40-byte SHA-1 of the Git object +associated with the mark. This is useful e.g. when importing commit +notes (the filenames in a notes commit are the object names of the +annotated commits). A `<path>` string must use UNIX-style directory separators (forward slash `/`), may contain any byte other than `LF`, and must not -start with double quote (`"`). +start with double quote (`"`) or colon (`:`). -If an `LF` or double quote must be encoded into `<path>` shell-style +If an `LF`, double quote or colon must be encoded into `<path>` shell-style quoting should be used, e.g. `"path/with\n and \" in it"`. The value of `<path>` must be in canonical form. That is it must not: diff --git a/fast-import.c b/fast-import.c index 8a7cdc1..3edfcf0 100644 --- a/fast-import.c +++ b/fast-import.c @@ -85,13 +85,13 @@ Format of STDIN stream: # common escapes of 'c' (e..g \n, \t, \\, \") or \nnn where nnn # is the signed byte value in octal. Note that the only # characters which must actually be escaped to protect the - # stream formatting is: \, " and LF. Otherwise these values + # stream formatting is: \, ", : and LF. Otherwise these values # are UTF8. # ref_str ::= ref; sha1exp_str ::= sha1exp; tag_str ::= tag; - path_str ::= path | '"' quoted(path) '"' ; + path_str ::= path | '"' quoted(path) '"' | idnum; mode ::= '100644' | '644' | '100755' | '755' | '120000' @@ -1864,6 +1864,13 @@ static const char *get_path_str( if (!unquote_c_style(sb, p, endp)) { /* successfully unquoted C-style quoted name */ p = sb->buf; + } else if (*p == ':') { + /* resolve mark reference */ + char *x; + struct object_entry *pe = find_mark(strtoumax(p + 1, &x, 10)); + *endp = x; + strbuf_add(sb, sha1_to_hex(pe->sha1), 40); + p = sb->buf; } else { /* regular path ending at endc */ *endp = strchr(p, endc); -- 1.6.4.rc3.138.ga6b98.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html