int main(int argc, char **argv) { const char * const usage[] = { "git credential-store [<options>] <action>", NULL }; const char *op; struct credential c = CREDENTIAL_INIT; struct string_list fns = STRING_LIST_INIT_DUP; char *file = NULL; struct option options[] = { OPT_STRING(0, "file", &file, "path", "fetch and store credentials in <path>"), OPT_END() }; umask(077); argc = parse_options(argc, (const char **)argv, NULL, options, usage, 0); if (argc != 1) usage_with_options(usage, options); op = argv[0]; if (file) { string_list_append(&fns, file); } else { if ((file = expand_user_path("~/.git-credentials"))) string_list_append_nodup(&fns, file); file = xdg_config_home("credentials"); if (file) string_list_append_nodup(&fns, file); } if (!fns.nr) die("unable to set up default path; use --file"); if (credential_read(&c, stdin) < 0) die("unable to read credential"); if (!strcmp(op, "get")) lookup_credential(&fns, &c); else if (!strcmp(op, "erase")) remove_credential(&fns, &c); else if (!strcmp(op, "store")) store_credential(&fns, &c); else ; /* Ignore unknown operation. */ string_list_clear(&fns, 0); return 0; }
int string_list_split(struct string_list *list, const char *string, int delim, int maxsplit) { int count = 0; const char *p = string, *end; if (!list->strdup_strings) die("internal error in string_list_split(): " "list->strdup_strings must be set"); for (;;) { count++; if (maxsplit >= 0 && count > maxsplit) { string_list_append(list, p); return count; } end = strchr(p, delim); if (end) { string_list_append_nodup(list, xmemdupz(p, end - p)); p = end + 1; } else { string_list_append(list, p); return count; } } }
static void parse_one_symref_info(struct string_list *symref, const char *val, int len) { char *sym, *target; struct string_list_item *item; if (!len) return; /* just "symref" */ /* e.g. "symref=HEAD:refs/heads/master" */ sym = xmemdupz(val, len); target = strchr(sym, ':'); if (!target) /* just "symref=something" */ goto reject; *(target++) = '\0'; if (check_refname_format(sym, REFNAME_ALLOW_ONELEVEL) || check_refname_format(target, REFNAME_ALLOW_ONELEVEL)) /* "symref=bogus:pair */ goto reject; item = string_list_append_nodup(symref, sym); item->util = target; return; reject: free(sym); return; }
struct string_list_item *string_list_append(struct string_list *list, const char *string) { return string_list_append_nodup( list, list->strdup_strings ? xstrdup(string) : (char *)string); }
static int set_option(const char *name, const char *value) { if (!strcmp(name, "verbosity")) { char *end; int v = strtol(value, &end, 10); if (value == end || *end) return -1; options.verbosity = v; return 0; } else if (!strcmp(name, "progress")) { if (!strcmp(value, "true")) options.progress = 1; else if (!strcmp(value, "false")) options.progress = 0; else return -1; return 0; } else if (!strcmp(name, "depth")) { char *end; unsigned long v = strtoul(value, &end, 10); if (value == end || *end) return -1; options.depth = v; return 0; } else if (!strcmp(name, "deepen-since")) { options.deepen_since = xstrdup(value); return 0; } else if (!strcmp(name, "deepen-not")) { string_list_append(&options.deepen_not, value); return 0; } else if (!strcmp(name, "deepen-relative")) { if (!strcmp(value, "true")) options.deepen_relative = 1; else if (!strcmp(value, "false")) options.deepen_relative = 0; else return -1; return 0; } else if (!strcmp(name, "followtags")) { if (!strcmp(value, "true")) options.followtags = 1; else if (!strcmp(value, "false")) options.followtags = 0; else return -1; return 0; } else if (!strcmp(name, "dry-run")) { if (!strcmp(value, "true")) options.dry_run = 1; else if (!strcmp(value, "false")) options.dry_run = 0; else return -1; return 0; } else if (!strcmp(name, "check-connectivity")) { if (!strcmp(value, "true")) options.check_self_contained_and_connected = 1; else if (!strcmp(value, "false")) options.check_self_contained_and_connected = 0; else return -1; return 0; } else if (!strcmp(name, "cas")) { struct strbuf val = STRBUF_INIT; strbuf_addf(&val, "--" CAS_OPT_NAME "=%s", value); string_list_append(&cas_options, val.buf); strbuf_release(&val); return 0; } else if (!strcmp(name, "cloning")) { if (!strcmp(value, "true")) options.cloning = 1; else if (!strcmp(value, "false")) options.cloning = 0; else return -1; return 0; } else if (!strcmp(name, "update-shallow")) { if (!strcmp(value, "true")) options.update_shallow = 1; else if (!strcmp(value, "false")) options.update_shallow = 0; else return -1; return 0; } else if (!strcmp(name, "pushcert")) { if (!strcmp(value, "true")) options.push_cert = SEND_PACK_PUSH_CERT_ALWAYS; else if (!strcmp(value, "false")) options.push_cert = SEND_PACK_PUSH_CERT_NEVER; else if (!strcmp(value, "if-asked")) options.push_cert = SEND_PACK_PUSH_CERT_IF_ASKED; else return -1; return 0; } else if (!strcmp(name, "push-option")) { if (*value != '"') string_list_append(&options.push_options, value); else { struct strbuf unquoted = STRBUF_INIT; if (unquote_c_style(&unquoted, value, NULL) < 0) die("invalid quoting in push-option value"); string_list_append_nodup(&options.push_options, strbuf_detach(&unquoted, NULL)); } return 0; #if LIBCURL_VERSION_NUM >= 0x070a08 } else if (!strcmp(name, "family")) { if (!strcmp(value, "ipv4")) git_curl_ipresolve = CURL_IPRESOLVE_V4; else if (!strcmp(value, "ipv6")) git_curl_ipresolve = CURL_IPRESOLVE_V6; else if (!strcmp(value, "all")) git_curl_ipresolve = CURL_IPRESOLVE_WHATEVER; else return -1; return 0; #endif /* LIBCURL_VERSION_NUM >= 0x070a08 */ } else if (!strcmp(name, "from-promisor")) { options.from_promisor = 1; return 0; } else if (!strcmp(name, "no-dependents")) { options.no_dependents = 1; return 0; } else if (!strcmp(name, "filter")) { options.filter = xstrdup(value);; return 0; } else { return 1 /* unsupported */; } }