mirror of
https://github.com/git/git
synced 2024-08-25 02:35:46 +00:00
![Junio C Hamano](/assets/img/avatar_default.png)
We used to use lock_any_ref_for_update() because the command needs to also update HEAD (which is not under refs/, so lock_ref_sha1() cannot be used). The function however did not check for refs with illegal characters in them. Use check_ref_format() to catch malformed refs. For this check, we specifically do not want to say having less than two levels in the name is illegal to allow HEAD (and perhaps other special refs in the future). Signed-off-by: Junio C Hamano <junkio@cox.net>
69 lines
1.5 KiB
C
69 lines
1.5 KiB
C
#include "cache.h"
|
|
#include "refs.h"
|
|
#include "builtin.h"
|
|
|
|
static const char git_update_ref_usage[] =
|
|
"git-update-ref [-m <reason>] (-d <refname> <value> | <refname> <value> [<oldval>])";
|
|
|
|
int cmd_update_ref(int argc, const char **argv, const char *prefix)
|
|
{
|
|
const char *refname=NULL, *value=NULL, *oldval=NULL, *msg=NULL;
|
|
struct ref_lock *lock;
|
|
unsigned char sha1[20], oldsha1[20];
|
|
int i, delete;
|
|
|
|
delete = 0;
|
|
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 (!strcmp("-d", argv[i])) {
|
|
delete = 1;
|
|
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);
|
|
|
|
if (delete) {
|
|
if (oldval)
|
|
usage(git_update_ref_usage);
|
|
return delete_ref(refname, sha1);
|
|
}
|
|
|
|
hashclr(oldsha1);
|
|
if (oldval && *oldval && get_sha1(oldval, oldsha1))
|
|
die("%s: not a valid old SHA1", oldval);
|
|
|
|
lock = lock_any_ref_for_update(refname, oldval ? oldsha1 : NULL);
|
|
if (!lock)
|
|
die("%s: cannot lock the ref", refname);
|
|
if (write_ref_sha1(lock, sha1, msg) < 0)
|
|
die("%s: cannot update the ref", refname);
|
|
return 0;
|
|
}
|