From: Lukas Sandström Date: Tue, 13 Jun 2006 20:22:00 +0000 (+0200) Subject: Make git-update-ref a builtin X-Git-Tag: v1.4.1-rc1~18^2~1 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=854b4629f97fb216a91805706cd61b33beb49172;p=git.git Make git-update-ref a builtin Signed-off-by: Lukas Sandström Signed-off-by: Junio C Hamano --- diff --git a/Makefile b/Makefile index 915f13030..99c9ec205 100644 --- a/Makefile +++ b/Makefile @@ -159,11 +159,11 @@ PROGRAMS = \ git-ssh-upload$X git-unpack-file$X \ git-unpack-objects$X git-update-server-info$X \ git-upload-pack$X git-verify-pack$X \ - git-update-ref$X git-symbolic-ref$X \ + git-symbolic-ref$X \ git-name-rev$X git-pack-redundant$X git-repo-config$X git-var$X \ git-describe$X git-merge-tree$X git-blame$X git-imap-send$X -BUILT_INS = git-log$X git-whatchanged$X git-show$X \ +BUILT_INS = git-log$X git-whatchanged$X git-show$X git-update-ref$X \ git-count-objects$X git-diff$X git-push$X git-mailsplit$X \ git-grep$X git-add$X git-rm$X git-rev-list$X git-stripspace$X \ git-check-ref-format$X git-rev-parse$X git-mailinfo$X \ @@ -226,7 +226,8 @@ BUILTIN_OBJS = \ builtin-read-tree.o builtin-commit-tree.o builtin-mailinfo.o \ builtin-apply.o builtin-show-branch.o builtin-diff-files.o \ builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o \ - builtin-cat-file.o builtin-mailsplit.o builtin-stripspace.o + builtin-cat-file.o builtin-mailsplit.o builtin-stripspace.o \ + builtin-update-ref.o GITLIBS = $(LIB_FILE) $(XDIFF_LIB) LIBS = $(GITLIBS) -lz diff --git a/builtin-update-ref.c b/builtin-update-ref.c new file mode 100644 index 000000000..00333c7e7 --- /dev/null +++ b/builtin-update-ref.c @@ -0,0 +1,59 @@ +#include "cache.h" +#include "refs.h" +#include "builtin.h" + +static const char git_update_ref_usage[] = +"git-update-ref [] [-m ]"; + +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_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; +} diff --git a/builtin.h b/builtin.h index 03ffdc35e..f12d5e68f 100644 --- a/builtin.h +++ b/builtin.h @@ -48,6 +48,7 @@ extern int cmd_diff_tree(int argc, const char **argv, char **envp); extern int cmd_cat_file(int argc, const char **argv, char **envp); extern int cmd_rev_parse(int argc, const char **argv, char **envp); extern int cmd_update_index(int argc, const char **argv, char **envp); +extern int cmd_update_ref(int argc, const char **argv, char **envp); extern int cmd_write_tree(int argc, const char **argv, char **envp); extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix); diff --git a/git.c b/git.c index 28c764129..94e9a4a4b 100644 --- a/git.c +++ b/git.c @@ -183,7 +183,8 @@ static void handle_internal_command(int argc, const char **argv, char **envp) { "mailsplit", cmd_mailsplit }, { "mailinfo", cmd_mailinfo }, { "stripspace", cmd_stripspace }, - { "update-index", cmd_update_index } + { "update-index", cmd_update_index }, + { "update-ref", cmd_update_ref } }; int i; diff --git a/update-ref.c b/update-ref.c deleted file mode 100644 index a1e6bb90f..000000000 --- a/update-ref.c +++ /dev/null @@ -1,56 +0,0 @@ -#include "cache.h" -#include "refs.h" - -static const char git_update_ref_usage[] = -"git-update-ref [] [-m ]"; - -int main(int argc, char **argv) -{ - const char *refname=NULL, *value=NULL, *oldval=NULL, *msg=NULL; - struct ref_lock *lock; - unsigned char sha1[20], oldsha1[20]; - int i; - - 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; - return 0; -}