Code

Make git-update-ref a builtin
authorLukas Sandström <lukass@etek.chalmers.se>
Tue, 13 Jun 2006 20:22:00 +0000 (22:22 +0200)
committerJunio C Hamano <junkio@cox.net>
Mon, 19 Jun 2006 05:12:20 +0000 (22:12 -0700)
Signed-off-by: Lukas Sandström <lukass@etek.chalmers.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Makefile
builtin-update-ref.c [new file with mode: 0644]
builtin.h
git.c
update-ref.c [deleted file]

index 915f130306e5a1018ea12bdbdfde779c837ee0f1..99c9ec2054a54fea5abc3a584d808b0944a5db58 100644 (file)
--- 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 (file)
index 0000000..00333c7
--- /dev/null
@@ -0,0 +1,59 @@
+#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_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;
+}
index 03ffdc35e7098119592a00fae04d7041f926be86..f12d5e68f6778fbf96c85b81d250cf7f230edf1d 100644 (file)
--- 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 28c76412913ed91da14452ae8347687496ab09e9..94e9a4a4b98acbd9e08943dbbe57616bd60b28e9 100644 (file)
--- 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 (file)
index a1e6bb9..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#include "cache.h"
-#include "refs.h"
-
-static const char git_update_ref_usage[] =
-"git-update-ref <refname> <value> [<oldval>] [-m <reason>]";
-
-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;
-}