Thread (2 messages) flat view 2 messages, 2 authors, 2016-06-15

Re: [PATCH/RFC/GSOC] make git-pull a builtin

From: Paul Tan <hidden>
Date: 2016-06-15 23:04:14

Hi,

On Thu, Mar 19, 2015 at 6:26 AM, Junio C Hamano [off-list ref] wrote:
Paul Tan [off-list ref] writes:
quoted
+/* Global vars since they are used often */
+static char *head_name;
+static const char *head_name_short;
+static unsigned char head_sha1[20];
+static int head_flags;
+
+enum rebase_type {
+     REBASE_FALSE = 0,
+     REBASE_TRUE = 1,
+     REBASE_PRESERVE = 2
+};
+
+/**
+ * Parse rebase config/option value and return corresponding int
+ */
+static int parse_rebase(const char *arg)
+{
+     if (!strcmp(arg, "true"))
+             return REBASE_TRUE;
+     else if (!strcmp(arg, "false"))
+             return REBASE_FALSE;
+     else if (!strcmp(arg, "preserve"))
+             return REBASE_PRESERVE;
+     else
+             return -1; /* Invalid value */
+}
Even though the original does not use bool-or-string-config, we
would want to do the same by doing something like

        case (config_maybe_bool()) {
        case 0:
                return REBASE_FALSE;
        case 1:
                return REBASE_TRUE;
        default:
                if (!strcmp(arg, "preserve"))
                        return REBASE_PRESERVE;
                return -1;
        }

and then use that in rebase_config_default().
If you mean letting "yes", "on", "no", "off" be accepted on the
command line as well, then yes I guess it will be a good idea.
quoted
+
+/**
+ * Returns default rebase option value
+ */
+static int rebase_config_default(void)
+{
+     struct strbuf name = STRBUF_INIT;
+     const char *value = NULL;
+     int boolval;
+
+     strbuf_addf(&name, "branch.%s.rebase", head_name_short);
+     if (git_config_get_value(name.buf, &value))
+             git_config_get_value("pull.rebase", &value);
What happens when neither is defined?
quoted
+     strbuf_release(&name);
+     if (!value)
+             return REBASE_FALSE;
Hmph, are you sure about this?  Isn't this "[pull] rebase" that does
not have "= value", in which case pull.rebase is "true"?

You cannot use NULL as the sentinel value to tell that you did not
find either branch.*.rebase nor pull.rebase (in which case you want
to default to 'false').  Either of them can be spelled as an
equal-less true, which you will see as value==NULL, and you want to
take that as 'true'.

        const char *value = "false";
        ...
        if (get_value(..., &value))
                get_value(..., &value));
        strbuf_release(&name);
        if (!value)
                return REBASE_TRUE;
        return parse_rebase(value);

or something along that line, perhaps?
Whoops, didn't take into account the possibility that the config value
could be NULL. Thanks.
quoted
+     boolval = git_config_maybe_bool("pull.rebase", value);
+     if (boolval >= 0)
+             return boolval ? REBASE_TRUE : REBASE_FALSE;
+     else if (value && !strcmp(value, "preserve"))
+             return REBASE_PRESERVE;
Is value something you need to free before returning from this
function?
From my reading if config.c, the memory of value comes from the
config_set the_config_set (the config cache), so there is no need to
free it.
quoted
+static int parse_opt_recurse_submodules(const struct option *opt, const char *arg, int unset)
+{
+     if (!arg)
+             *(int *)opt->value = unset ? RS_NO : RS_YES;
+     else if (!strcmp(arg, "no"))
+             *(int *)opt->value = RS_NO;
+     else if (!strcmp(arg, "yes"))
+             *(int *)opt->value = RS_YES;
+     else if (!strcmp(arg, "on-demand"))
+             *(int *)opt->value = RS_ON_DEMAND;
+     else
+             return -1;
+     return 0;
I suspect that maybe-bool-or-string comment applies equally here for
the UI consistency.
Yup, I'll keep that in mind.
I'll stop here for now.  Thanks.
Thanks.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help