fast-import: add a get-mark command
It is sometimes useful for importers to be able to read the SHA-1 corresponding to a mark that they have created via fast-import. For example, they might want to embed the SHA-1 into the commit message of a later commit. Or it might be useful for internal bookkeeping uses, or for logging. Add a "get-mark" command to "git fast-import" that allows the importer to ask for the value of a mark that has been created earlier. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3d4a3ffe64
commit
28c7b1f7b7
@ -54,7 +54,7 @@ Options for Frontends
|
|||||||
~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
--cat-blob-fd=<fd>::
|
--cat-blob-fd=<fd>::
|
||||||
Write responses to `cat-blob` and `ls` queries to the
|
Write responses to `get-mark`, `cat-blob`, and `ls` queries to the
|
||||||
file descriptor <fd> instead of `stdout`. Allows `progress`
|
file descriptor <fd> instead of `stdout`. Allows `progress`
|
||||||
output intended for the end-user to be separated from other
|
output intended for the end-user to be separated from other
|
||||||
output.
|
output.
|
||||||
@ -350,6 +350,11 @@ and control the current import process. More detailed discussion
|
|||||||
unless the `done` feature was requested using the
|
unless the `done` feature was requested using the
|
||||||
`--done` command-line option or `feature done` command.
|
`--done` command-line option or `feature done` command.
|
||||||
|
|
||||||
|
`get-mark`::
|
||||||
|
Causes fast-import to print the SHA-1 corresponding to a mark
|
||||||
|
to the file descriptor set with `--cat-blob-fd`, or `stdout` if
|
||||||
|
unspecified.
|
||||||
|
|
||||||
`cat-blob`::
|
`cat-blob`::
|
||||||
Causes fast-import to print a blob in 'cat-file --batch'
|
Causes fast-import to print a blob in 'cat-file --batch'
|
||||||
format to the file descriptor set with `--cat-blob-fd` or
|
format to the file descriptor set with `--cat-blob-fd` or
|
||||||
@ -930,6 +935,25 @@ Placing a `progress` command immediately after a `checkpoint` will
|
|||||||
inform the reader when the `checkpoint` has been completed and it
|
inform the reader when the `checkpoint` has been completed and it
|
||||||
can safely access the refs that fast-import updated.
|
can safely access the refs that fast-import updated.
|
||||||
|
|
||||||
|
`get-mark`
|
||||||
|
~~~~~~~~~~
|
||||||
|
Causes fast-import to print the SHA-1 corresponding to a mark to
|
||||||
|
stdout or to the file descriptor previously arranged with the
|
||||||
|
`--cat-blob-fd` argument. The command otherwise has no impact on the
|
||||||
|
current import; its purpose is to retrieve SHA-1s that later commits
|
||||||
|
might want to refer to in their commit messages.
|
||||||
|
|
||||||
|
....
|
||||||
|
'get-mark' SP ':' <idnum> LF
|
||||||
|
....
|
||||||
|
|
||||||
|
This command can be used anywhere in the stream that comments are
|
||||||
|
accepted. In particular, the `get-mark` command can be used in the
|
||||||
|
middle of a commit but not in the middle of a `data` command.
|
||||||
|
|
||||||
|
See ``Responses To Commands'' below for details about how to read
|
||||||
|
this output safely.
|
||||||
|
|
||||||
`cat-blob`
|
`cat-blob`
|
||||||
~~~~~~~~~~
|
~~~~~~~~~~
|
||||||
Causes fast-import to print a blob to a file descriptor previously
|
Causes fast-import to print a blob to a file descriptor previously
|
||||||
@ -1000,7 +1024,8 @@ Output uses the same format as `git ls-tree <tree> -- <path>`:
|
|||||||
====
|
====
|
||||||
|
|
||||||
The <dataref> represents the blob, tree, or commit object at <path>
|
The <dataref> represents the blob, tree, or commit object at <path>
|
||||||
and can be used in later 'cat-blob', 'filemodify', or 'ls' commands.
|
and can be used in later 'get-mark', 'cat-blob', 'filemodify', or
|
||||||
|
'ls' commands.
|
||||||
|
|
||||||
If there is no file or subtree at that path, 'git fast-import' will
|
If there is no file or subtree at that path, 'git fast-import' will
|
||||||
instead report
|
instead report
|
||||||
@ -1042,9 +1067,11 @@ import-marks-if-exists::
|
|||||||
"feature import-marks-if-exists" like a corresponding
|
"feature import-marks-if-exists" like a corresponding
|
||||||
command-line option silently skips a nonexistent file.
|
command-line option silently skips a nonexistent file.
|
||||||
|
|
||||||
|
get-mark::
|
||||||
cat-blob::
|
cat-blob::
|
||||||
ls::
|
ls::
|
||||||
Require that the backend support the 'cat-blob' or 'ls' command.
|
Require that the backend support the 'get-mark', 'cat-blob',
|
||||||
|
or 'ls' command respectively.
|
||||||
Versions of fast-import not supporting the specified command
|
Versions of fast-import not supporting the specified command
|
||||||
will exit with a message indicating so.
|
will exit with a message indicating so.
|
||||||
This lets the import error out early with a clear message,
|
This lets the import error out early with a clear message,
|
||||||
@ -1124,11 +1151,11 @@ bidirectional pipes:
|
|||||||
git fast-import >fast-import-output
|
git fast-import >fast-import-output
|
||||||
====
|
====
|
||||||
|
|
||||||
A frontend set up this way can use `progress`, `ls`, and `cat-blob`
|
A frontend set up this way can use `progress`, `get-mark`, `ls`, and
|
||||||
commands to read information from the import in progress.
|
`cat-blob` commands to read information from the import in progress.
|
||||||
|
|
||||||
To avoid deadlock, such frontends must completely consume any
|
To avoid deadlock, such frontends must completely consume any
|
||||||
pending output from `progress`, `ls`, and `cat-blob` before
|
pending output from `progress`, `ls`, `get-mark`, and `cat-blob` before
|
||||||
performing writes to fast-import that might block.
|
performing writes to fast-import that might block.
|
||||||
|
|
||||||
Crash Reports
|
Crash Reports
|
||||||
|
@ -134,16 +134,17 @@ Format of STDIN stream:
|
|||||||
ts ::= # time since the epoch in seconds, ascii base10 notation;
|
ts ::= # time since the epoch in seconds, ascii base10 notation;
|
||||||
tz ::= # GIT style timezone;
|
tz ::= # GIT style timezone;
|
||||||
|
|
||||||
# note: comments, ls and cat requests may appear anywhere
|
# note: comments, get-mark, ls-tree, and cat-blob requests may
|
||||||
# in the input, except within a data command. Any form
|
# appear anywhere in the input, except within a data command. Any
|
||||||
# of the data command always escapes the related input
|
# form of the data command always escapes the related input from
|
||||||
# from comment processing.
|
# comment processing.
|
||||||
#
|
#
|
||||||
# In case it is not clear, the '#' that starts the comment
|
# In case it is not clear, the '#' that starts the comment
|
||||||
# must be the first character on that line (an lf
|
# must be the first character on that line (an lf
|
||||||
# preceded it).
|
# preceded it).
|
||||||
#
|
#
|
||||||
|
|
||||||
|
get_mark ::= 'get-mark' sp idnum lf;
|
||||||
cat_blob ::= 'cat-blob' sp (hexsha1 | idnum) lf;
|
cat_blob ::= 'cat-blob' sp (hexsha1 | idnum) lf;
|
||||||
ls_tree ::= 'ls' sp (hexsha1 | idnum) sp path_str lf;
|
ls_tree ::= 'ls' sp (hexsha1 | idnum) sp path_str lf;
|
||||||
|
|
||||||
@ -372,6 +373,7 @@ static volatile sig_atomic_t checkpoint_requested;
|
|||||||
static int cat_blob_fd = STDOUT_FILENO;
|
static int cat_blob_fd = STDOUT_FILENO;
|
||||||
|
|
||||||
static void parse_argv(void);
|
static void parse_argv(void);
|
||||||
|
static void parse_get_mark(const char *p);
|
||||||
static void parse_cat_blob(const char *p);
|
static void parse_cat_blob(const char *p);
|
||||||
static void parse_ls(const char *p, struct branch *b);
|
static void parse_ls(const char *p, struct branch *b);
|
||||||
|
|
||||||
@ -1907,6 +1909,10 @@ static int read_next_command(void)
|
|||||||
rc->prev->next = rc;
|
rc->prev->next = rc;
|
||||||
cmd_tail = rc;
|
cmd_tail = rc;
|
||||||
}
|
}
|
||||||
|
if (skip_prefix(command_buf.buf, "get-mark ", &p)) {
|
||||||
|
parse_get_mark(p);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (skip_prefix(command_buf.buf, "cat-blob ", &p)) {
|
if (skip_prefix(command_buf.buf, "cat-blob ", &p)) {
|
||||||
parse_cat_blob(p);
|
parse_cat_blob(p);
|
||||||
continue;
|
continue;
|
||||||
@ -2919,6 +2925,23 @@ static void cat_blob(struct object_entry *oe, unsigned char sha1[20])
|
|||||||
free(buf);
|
free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_get_mark(const char *p)
|
||||||
|
{
|
||||||
|
struct object_entry *oe = oe;
|
||||||
|
char output[42];
|
||||||
|
|
||||||
|
/* get-mark SP <object> LF */
|
||||||
|
if (*p != ':')
|
||||||
|
die("Not a mark: %s", p);
|
||||||
|
|
||||||
|
oe = find_mark(parse_mark_ref_eol(p));
|
||||||
|
if (!oe)
|
||||||
|
die("Unknown mark: %s", command_buf.buf);
|
||||||
|
|
||||||
|
snprintf(output, sizeof(output), "%s\n", sha1_to_hex(oe->idx.sha1));
|
||||||
|
cat_blob_write(output, 41);
|
||||||
|
}
|
||||||
|
|
||||||
static void parse_cat_blob(const char *p)
|
static void parse_cat_blob(const char *p)
|
||||||
{
|
{
|
||||||
struct object_entry *oe = oe;
|
struct object_entry *oe = oe;
|
||||||
@ -3243,6 +3266,8 @@ static int parse_one_feature(const char *feature, int from_stream)
|
|||||||
option_import_marks(arg, from_stream, 1);
|
option_import_marks(arg, from_stream, 1);
|
||||||
} else if (skip_prefix(feature, "export-marks=", &arg)) {
|
} else if (skip_prefix(feature, "export-marks=", &arg)) {
|
||||||
option_export_marks(arg);
|
option_export_marks(arg);
|
||||||
|
} else if (!strcmp(feature, "get-mark")) {
|
||||||
|
; /* Don't die - this feature is supported */
|
||||||
} else if (!strcmp(feature, "cat-blob")) {
|
} else if (!strcmp(feature, "cat-blob")) {
|
||||||
; /* Don't die - this feature is supported */
|
; /* Don't die - this feature is supported */
|
||||||
} else if (!strcmp(feature, "relative-marks")) {
|
} else if (!strcmp(feature, "relative-marks")) {
|
||||||
|
@ -2339,6 +2339,19 @@ test_expect_success !MINGW 'R: in-stream cat-blob-fd not respected' '
|
|||||||
test_cmp expect actual.1
|
test_cmp expect actual.1
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success !MINGW 'R: print mark for new blob' '
|
||||||
|
echo "effluentish" | git hash-object --stdin >expect &&
|
||||||
|
git fast-import --cat-blob-fd=6 6>actual <<-\EOF &&
|
||||||
|
blob
|
||||||
|
mark :1
|
||||||
|
data <<BLOB_END
|
||||||
|
effluentish
|
||||||
|
BLOB_END
|
||||||
|
get-mark :1
|
||||||
|
EOF
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success !MINGW 'R: print new blob' '
|
test_expect_success !MINGW 'R: print new blob' '
|
||||||
blob=$(echo "yep yep yep" | git hash-object --stdin) &&
|
blob=$(echo "yep yep yep" | git hash-object --stdin) &&
|
||||||
cat >expect <<-EOF &&
|
cat >expect <<-EOF &&
|
||||||
|
Loading…
Reference in New Issue
Block a user