Merge branch 'js/cherry-pick-usability'
* js/cherry-pick-usability: Teach commit about CHERRY_PICK_HEAD bash: teach __git_ps1 about CHERRY_PICK_HEAD Introduce CHERRY_PICK_HEAD t3507: introduce pristine-detach helper
This commit is contained in:
@ -3,7 +3,6 @@
|
||||
#include "object.h"
|
||||
#include "commit.h"
|
||||
#include "tag.h"
|
||||
#include "wt-status.h"
|
||||
#include "run-command.h"
|
||||
#include "exec_cmd.h"
|
||||
#include "utf8.h"
|
||||
@ -198,54 +197,20 @@ static void add_message_to_msg(struct strbuf *msgbuf, const char *message)
|
||||
strbuf_addstr(msgbuf, p);
|
||||
}
|
||||
|
||||
static void set_author_ident_env(const char *message)
|
||||
static void write_cherry_pick_head(void)
|
||||
{
|
||||
const char *p = message;
|
||||
if (!p)
|
||||
die ("Could not read commit message of %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
while (*p && *p != '\n') {
|
||||
const char *eol;
|
||||
int fd;
|
||||
struct strbuf buf = STRBUF_INIT;
|
||||
|
||||
for (eol = p; *eol && *eol != '\n'; eol++)
|
||||
; /* do nothing */
|
||||
if (!prefixcmp(p, "author ")) {
|
||||
char *line, *pend, *email, *timestamp;
|
||||
strbuf_addf(&buf, "%s\n", sha1_to_hex(commit->object.sha1));
|
||||
|
||||
p += 7;
|
||||
line = xmemdupz(p, eol - p);
|
||||
email = strchr(line, '<');
|
||||
if (!email)
|
||||
die ("Could not extract author email from %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
if (email == line)
|
||||
pend = line;
|
||||
else
|
||||
for (pend = email; pend != line + 1 &&
|
||||
isspace(pend[-1]); pend--);
|
||||
; /* do nothing */
|
||||
*pend = '\0';
|
||||
email++;
|
||||
timestamp = strchr(email, '>');
|
||||
if (!timestamp)
|
||||
die ("Could not extract author time from %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
*timestamp = '\0';
|
||||
for (timestamp++; *timestamp && isspace(*timestamp);
|
||||
timestamp++)
|
||||
; /* do nothing */
|
||||
setenv("GIT_AUTHOR_NAME", line, 1);
|
||||
setenv("GIT_AUTHOR_EMAIL", email, 1);
|
||||
setenv("GIT_AUTHOR_DATE", timestamp, 1);
|
||||
free(line);
|
||||
return;
|
||||
}
|
||||
p = eol;
|
||||
if (*p == '\n')
|
||||
p++;
|
||||
}
|
||||
die ("No author information found in %s",
|
||||
sha1_to_hex(commit->object.sha1));
|
||||
fd = open(git_path("CHERRY_PICK_HEAD"), O_WRONLY | O_CREAT, 0666);
|
||||
if (fd < 0)
|
||||
die_errno("Could not open '%s' for writing",
|
||||
git_path("CHERRY_PICK_HEAD"));
|
||||
if (write_in_full(fd, buf.buf, buf.len) != buf.len || close(fd))
|
||||
die_errno("Could not write to '%s'", git_path("CHERRY_PICK_HEAD"));
|
||||
strbuf_release(&buf);
|
||||
}
|
||||
|
||||
static void advise(const char *advice, ...)
|
||||
@ -263,15 +228,18 @@ static void print_advice(void)
|
||||
|
||||
if (msg) {
|
||||
fprintf(stderr, "%s\n", msg);
|
||||
/*
|
||||
* A conflict has occured but the porcelain
|
||||
* (typically rebase --interactive) wants to take care
|
||||
* of the commit itself so remove CHERRY_PICK_HEAD
|
||||
*/
|
||||
unlink(git_path("CHERRY_PICK_HEAD"));
|
||||
return;
|
||||
}
|
||||
|
||||
advise("after resolving the conflicts, mark the corrected paths");
|
||||
advise("with 'git add <paths>' or 'git rm <paths>'");
|
||||
|
||||
if (action == CHERRY_PICK)
|
||||
advise("and commit the result with 'git commit -c %s'",
|
||||
find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV));
|
||||
advise("and commit the result with 'git commit'");
|
||||
}
|
||||
|
||||
static void write_message(struct strbuf *msgbuf, const char *filename)
|
||||
@ -497,13 +465,14 @@ static int do_pick_commit(void)
|
||||
base_label = msg.parent_label;
|
||||
next = commit;
|
||||
next_label = msg.label;
|
||||
set_author_ident_env(msg.message);
|
||||
add_message_to_msg(&msgbuf, msg.message);
|
||||
if (no_replay) {
|
||||
strbuf_addstr(&msgbuf, "(cherry picked from commit ");
|
||||
strbuf_addstr(&msgbuf, sha1_to_hex(commit->object.sha1));
|
||||
strbuf_addstr(&msgbuf, ")\n");
|
||||
}
|
||||
if (!no_commit)
|
||||
write_cherry_pick_head();
|
||||
}
|
||||
|
||||
if (!strategy || !strcmp(strategy, "recursive") || action == REVERT) {
|
||||
|
Reference in New Issue
Block a user