checkout: factor out functions to new lib file
authorThomas Gummerer <t.gummerer@gmail.com>
Sun, 26 Nov 2017 19:43:51 +0000 (19:43 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 27 Nov 2017 00:48:06 +0000 (09:48 +0900)
Factor the functions out, so they can be re-used from other places.  In
particular these functions will be re-used in builtin/worktree.c to make
git worktree add dwim more.

While there add some docs to the function.

Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Makefile
builtin/checkout.c
checkout.c [new file with mode: 0644]
checkout.h [new file with mode: 0644]

index e53750c..a80a8fc 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -759,6 +759,7 @@ LIB_OBJS += branch.o
 LIB_OBJS += bulk-checkin.o
 LIB_OBJS += bundle.o
 LIB_OBJS += cache-tree.o
+LIB_OBJS += checkout.o
 LIB_OBJS += color.o
 LIB_OBJS += column.o
 LIB_OBJS += combine-diff.o
index 7d8bcc3..ad8f940 100644 (file)
@@ -1,5 +1,6 @@
 #include "builtin.h"
 #include "config.h"
+#include "checkout.h"
 #include "lockfile.h"
 #include "parse-options.h"
 #include "refs.h"
@@ -872,46 +873,6 @@ static int git_checkout_config(const char *var, const char *value, void *cb)
        return git_xmerge_config(var, value, NULL);
 }
 
-struct tracking_name_data {
-       /* const */ char *src_ref;
-       char *dst_ref;
-       struct object_id *dst_oid;
-       int unique;
-};
-
-static int check_tracking_name(struct remote *remote, void *cb_data)
-{
-       struct tracking_name_data *cb = cb_data;
-       struct refspec query;
-       memset(&query, 0, sizeof(struct refspec));
-       query.src = cb->src_ref;
-       if (remote_find_tracking(remote, &query) ||
-           get_oid(query.dst, cb->dst_oid)) {
-               free(query.dst);
-               return 0;
-       }
-       if (cb->dst_ref) {
-               free(query.dst);
-               cb->unique = 0;
-               return 0;
-       }
-       cb->dst_ref = query.dst;
-       return 0;
-}
-
-static const char *unique_tracking_name(const char *name, struct object_id *oid)
-{
-       struct tracking_name_data cb_data = { NULL, NULL, NULL, 1 };
-       cb_data.src_ref = xstrfmt("refs/heads/%s", name);
-       cb_data.dst_oid = oid;
-       for_each_remote(check_tracking_name, &cb_data);
-       free(cb_data.src_ref);
-       if (cb_data.unique)
-               return cb_data.dst_ref;
-       free(cb_data.dst_ref);
-       return NULL;
-}
-
 static int parse_branchname_arg(int argc, const char **argv,
                                int dwim_new_local_branch_ok,
                                struct branch_info *new,
diff --git a/checkout.c b/checkout.c
new file mode 100644 (file)
index 0000000..ac42630
--- /dev/null
@@ -0,0 +1,43 @@
+#include "cache.h"
+#include "remote.h"
+#include "checkout.h"
+
+struct tracking_name_data {
+       /* const */ char *src_ref;
+       char *dst_ref;
+       struct object_id *dst_oid;
+       int unique;
+};
+
+static int check_tracking_name(struct remote *remote, void *cb_data)
+{
+       struct tracking_name_data *cb = cb_data;
+       struct refspec query;
+       memset(&query, 0, sizeof(struct refspec));
+       query.src = cb->src_ref;
+       if (remote_find_tracking(remote, &query) ||
+           get_oid(query.dst, cb->dst_oid)) {
+               free(query.dst);
+               return 0;
+       }
+       if (cb->dst_ref) {
+               free(query.dst);
+               cb->unique = 0;
+               return 0;
+       }
+       cb->dst_ref = query.dst;
+       return 0;
+}
+
+const char *unique_tracking_name(const char *name, struct object_id *oid)
+{
+       struct tracking_name_data cb_data = { NULL, NULL, NULL, 1 };
+       cb_data.src_ref = xstrfmt("refs/heads/%s", name);
+       cb_data.dst_oid = oid;
+       for_each_remote(check_tracking_name, &cb_data);
+       free(cb_data.src_ref);
+       if (cb_data.unique)
+               return cb_data.dst_ref;
+       free(cb_data.dst_ref);
+       return NULL;
+}
diff --git a/checkout.h b/checkout.h
new file mode 100644 (file)
index 0000000..9980711
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef CHECKOUT_H
+#define CHECKOUT_H
+
+#include "cache.h"
+
+/*
+ * Check if the branch name uniquely matches a branch name on a remote
+ * tracking branch.  Return the name of the remote if such a branch
+ * exists, NULL otherwise.
+ */
+extern const char *unique_tracking_name(const char *name, struct object_id *oid);
+
+#endif /* CHECKOUT_H */