mirror of
https://github.com/git/git
synced 2024-10-30 04:01:21 +00:00
0b0fe4a65d
Apparently calling setup_ident() after git_config causes the user.name and user.email values read from the config file to be replaced with the data obtained from the host. This means that users who have setup their email address in user.email will instead be writing reflog entries with their hostname. Moving setup_ident() to before git_config in update-ref resolves this ordering problem. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
60 lines
1.4 KiB
C
60 lines
1.4 KiB
C
#include "cache.h"
|
|
#include "refs.h"
|
|
#include "builtin.h"
|
|
|
|
static const char git_update_ref_usage[] =
|
|
"git-update-ref <refname> <value> [<oldval>] [-m <reason>]";
|
|
|
|
int cmd_update_ref(int argc, const char **argv, char **envp)
|
|
{
|
|
const char *refname=NULL, *value=NULL, *oldval=NULL, *msg=NULL;
|
|
struct ref_lock *lock;
|
|
unsigned char sha1[20], oldsha1[20];
|
|
int i;
|
|
|
|
setup_ident();
|
|
setup_git_directory();
|
|
git_config(git_default_config);
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
if (!strcmp("-m", argv[i])) {
|
|
if (i+1 >= argc)
|
|
usage(git_update_ref_usage);
|
|
msg = argv[++i];
|
|
if (!*msg)
|
|
die("Refusing to perform update with empty message.");
|
|
if (strchr(msg, '\n'))
|
|
die("Refusing to perform update with \\n in message.");
|
|
continue;
|
|
}
|
|
if (!refname) {
|
|
refname = argv[i];
|
|
continue;
|
|
}
|
|
if (!value) {
|
|
value = argv[i];
|
|
continue;
|
|
}
|
|
if (!oldval) {
|
|
oldval = argv[i];
|
|
continue;
|
|
}
|
|
}
|
|
if (!refname || !value)
|
|
usage(git_update_ref_usage);
|
|
|
|
if (get_sha1(value, sha1))
|
|
die("%s: not a valid SHA1", value);
|
|
memset(oldsha1, 0, 20);
|
|
if (oldval && get_sha1(oldval, oldsha1))
|
|
die("%s: not a valid old SHA1", oldval);
|
|
|
|
lock = lock_any_ref_for_update(refname, oldval ? oldsha1 : NULL, 0);
|
|
if (!lock)
|
|
return 1;
|
|
if (write_ref_sha1(lock, sha1, msg) < 0)
|
|
return 1;
|
|
|
|
/* write_ref_sha1 always unlocks the ref, no need to do it explicitly */
|
|
return 0;
|
|
}
|