static void gc_config(void) { const char *value; if (!git_config_get_value("gc.packrefs", &value)) { if (value && !strcmp(value, "notbare")) pack_refs = -1; else pack_refs = git_config_bool("gc.packrefs", value); } git_config_get_int("gc.aggressivewindow", &aggressive_window); git_config_get_int("gc.aggressivedepth", &aggressive_depth); git_config_get_int("gc.auto", &gc_auto_threshold); git_config_get_int("gc.autopacklimit", &gc_auto_pack_limit); git_config_get_bool("gc.autodetach", &detach_auto); if (!git_config_get_string_const("gc.pruneexpire", &prune_expire)) { if (strcmp(prune_expire, "now")) { unsigned long now = approxidate("now"); if (approxidate(prune_expire) >= now) { git_die_config("gc.pruneexpire", _("Invalid gc.pruneexpire: '%s'"), prune_expire); } } } git_config(git_default_config, NULL); }
static void gc_config(void) { const char *value; if (!git_config_get_value("gc.packrefs", &value)) { if (value && !strcmp(value, "notbare")) pack_refs = -1; else pack_refs = git_config_bool("gc.packrefs", value); } git_config_get_int("gc.aggressivewindow", &aggressive_window); git_config_get_int("gc.aggressivedepth", &aggressive_depth); git_config_get_int("gc.auto", &gc_auto_threshold); git_config_get_int("gc.autopacklimit", &gc_auto_pack_limit); git_config_get_bool("gc.writecommitgraph", &gc_write_commit_graph); git_config_get_bool("gc.autodetach", &detach_auto); git_config_get_expiry("gc.pruneexpire", &prune_expire); git_config_get_expiry("gc.worktreepruneexpire", &prune_worktrees_expire); git_config_get_expiry("gc.logexpiry", &gc_log_expire); git_config_get_ulong("gc.bigpackthreshold", &big_pack_threshold); git_config_get_ulong("pack.deltacachesize", &max_delta_cache_size); git_config(git_default_config, NULL); }
static void fetch_pack_config(void) { git_config_get_int("fetch.unpacklimit", &fetch_unpack_limit); git_config_get_int("transfer.unpacklimit", &transfer_unpack_limit); git_config_get_bool("repack.usedeltabaseoffset", &prefer_ofs_delta); git_config_get_bool("fetch.fsckobjects", &fetch_fsck_objects); git_config_get_bool("transfer.fsckobjects", &transfer_fsck_objects); git_config(git_default_config, NULL); }
static void fetch_pack_config(void) { git_config_get_int("fetch.unpacklimit", &fetch_unpack_limit); git_config_get_int("transfer.unpacklimit", &transfer_unpack_limit); git_config_get_bool("repack.usedeltabaseoffset", &prefer_ofs_delta); git_config_get_bool("fetch.fsckobjects", &fetch_fsck_objects); git_config_get_bool("transfer.fsckobjects", &transfer_fsck_objects); git_config_get_string("fetch.negotiationalgorithm", &negotiation_algorithm); git_config(fetch_pack_config_cb, NULL); }
void rerere_gc(struct string_list *rr) { struct string_list to_remove = STRING_LIST_INIT_DUP; DIR *dir; struct dirent *e; int i; time_t now = time(NULL); int cutoff_noresolve = 15; int cutoff_resolve = 60; if (setup_rerere(rr, 0) < 0) return; git_config_get_int("gc.rerereresolved", &cutoff_resolve); git_config_get_int("gc.rerereunresolved", &cutoff_noresolve); git_config(git_default_config, NULL); dir = opendir(git_path("rr-cache")); if (!dir) die_errno("unable to open rr-cache directory"); /* Collect stale conflict IDs ... */ while ((e = readdir(dir))) { struct rerere_dir *rr_dir; struct rerere_id id; int now_empty; if (is_dot_or_dotdot(e->d_name)) continue; rr_dir = find_rerere_dir(e->d_name); if (!rr_dir) continue; /* or should we remove e->d_name? */ now_empty = 1; for (id.variant = 0, id.collection = rr_dir; id.variant < id.collection->status_nr; id.variant++) { prune_one(&id, now, cutoff_resolve, cutoff_noresolve); if (id.collection->status[id.variant]) now_empty = 0; } if (now_empty) string_list_append(&to_remove, e->d_name); } closedir(dir); /* ... and then remove the empty directories */ for (i = 0; i < to_remove.nr; i++) rmdir(git_path("rr-cache/%s", to_remove.items[i].string)); string_list_clear(&to_remove, 0); rollback_lock_file(&write_lock); }
void rerere_gc(struct string_list *rr) { struct string_list to_remove = STRING_LIST_INIT_DUP; DIR *dir; struct dirent *e; int i, cutoff; time_t now = time(NULL), then; int cutoff_noresolve = 15; int cutoff_resolve = 60; if (setup_rerere(rr, 0) < 0) return; git_config_get_int("gc.rerereresolved", &cutoff_resolve); git_config_get_int("gc.rerereunresolved", &cutoff_noresolve); git_config(git_default_config, NULL); dir = opendir(git_path("rr-cache")); if (!dir) die_errno("unable to open rr-cache directory"); /* Collect stale conflict IDs ... */ while ((e = readdir(dir))) { if (is_dot_or_dotdot(e->d_name)) continue; then = rerere_last_used_at(e->d_name); if (then) { cutoff = cutoff_resolve; } else { then = rerere_created_at(e->d_name); if (!then) continue; cutoff = cutoff_noresolve; } if (then < now - cutoff * 86400) string_list_append(&to_remove, e->d_name); } closedir(dir); /* ... and then remove them one-by-one */ for (i = 0; i < to_remove.nr; i++) unlink_rr_item(dirname_to_id(to_remove.items[i].string)); string_list_clear(&to_remove, 0); rollback_lock_file(&write_lock); }
static void gc_config(void) { const char *value; if (!git_config_get_value("gc.packrefs", &value)) { if (value && !strcmp(value, "notbare")) pack_refs = -1; else pack_refs = git_config_bool("gc.packrefs", value); } git_config_get_int("gc.aggressivewindow", &aggressive_window); git_config_get_int("gc.aggressivedepth", &aggressive_depth); git_config_get_int("gc.auto", &gc_auto_threshold); git_config_get_int("gc.autopacklimit", &gc_auto_pack_limit); git_config_get_bool("gc.autodetach", &detach_auto); git_config_date_string("gc.pruneexpire", &prune_expire); git_config_date_string("gc.worktreepruneexpire", &prune_worktrees_expire); git_config(git_default_config, NULL); }
int packed_refs_lock(struct ref_store *ref_store, int flags, struct strbuf *err) { struct packed_ref_store *refs = packed_downcast(ref_store, REF_STORE_WRITE | REF_STORE_MAIN, "packed_refs_lock"); static int timeout_configured = 0; static int timeout_value = 1000; if (!timeout_configured) { git_config_get_int("core.packedrefstimeout", &timeout_value); timeout_configured = 1; } /* * Note that we close the lockfile immediately because we * don't write new content to it, but rather to a separate * tempfile. */ if (hold_lock_file_for_update_timeout( &refs->lock, refs->path, flags, timeout_value) < 0) { unable_to_lock_message(refs->path, errno, err); return -1; } if (close_lock_file_gently(&refs->lock)) { strbuf_addf(err, "unable to close %s: %s", refs->path, strerror(errno)); rollback_lock_file(&refs->lock); return -1; } /* * Now that we hold the `packed-refs` lock, make sure that our * snapshot matches the current version of the file. Normally * `get_snapshot()` does that for us, but that function * assumes that when the file is locked, any existing snapshot * is still valid. We've just locked the file, but it might * have changed the moment *before* we locked it. */ validate_snapshot(refs); /* * Now make sure that the packed-refs file as it exists in the * locked state is loaded into the snapshot: */ get_snapshot(refs); return 0; }
#include "test_helpers.h" #include <git2.h> #include "filebuf.h" #define CONFIG_BASE TEST_RESOURCES "/config" /* * This one is so we know the code isn't completely broken */ BEGIN_TEST(config0, "read a simple configuration") git_config *cfg; int i; must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config0")); must_pass(git_config_get_int(cfg, "core.repositoryformatversion", &i)); must_be_true(i == 0); must_pass(git_config_get_bool(cfg, "core.filemode", &i)); must_be_true(i == 1); must_pass(git_config_get_bool(cfg, "core.bare", &i)); must_be_true(i == 0); must_pass(git_config_get_bool(cfg, "core.logallrefupdates", &i)); must_be_true(i == 1); git_config_free(cfg); END_TEST /* * [this "that"] and [this "That] are different namespaces. Make sure * each returns the correct one. */
#include "test_lib.h" #include "test_helpers.h" #include <git2.h> #define CONFIG_BASE TEST_RESOURCES "/config" /* * This one is so we know the code isn't completely broken */ BEGIN_TEST(config0, "read a simple configuration") git_config *cfg; int i; must_pass(git_config_open_ondisk(&cfg, CONFIG_BASE "/config0")); must_pass(git_config_get_int(cfg, "core.repositoryformatversion", &i)); must_be_true(i == 0); must_pass(git_config_get_bool(cfg, "core.filemode", &i)); must_be_true(i == 1); must_pass(git_config_get_bool(cfg, "core.bare", &i)); must_be_true(i == 0); must_pass(git_config_get_bool(cfg, "core.logallrefupdates", &i)); must_be_true(i == 1); git_config_free(cfg); END_TEST /* * [this "that"] and [this "That] are different namespaces. Make sure * each returns the correct one. */
int cmd_main(int argc, const char **argv) { int i, val; const char *v; const struct string_list *strptr; struct config_set cs; git_configset_init(&cs); if (argc < 2) { fprintf(stderr, "Please, provide a command name on the command-line\n"); goto exit1; } else if (argc == 3 && !strcmp(argv[1], "get_value")) { if (!git_config_get_value(argv[2], &v)) { if (!v) printf("(NULL)\n"); else printf("%s\n", v); goto exit0; } else { printf("Value not found for \"%s\"\n", argv[2]); goto exit1; } } else if (argc == 3 && !strcmp(argv[1], "get_value_multi")) { strptr = git_config_get_value_multi(argv[2]); if (strptr) { for (i = 0; i < strptr->nr; i++) { v = strptr->items[i].string; if (!v) printf("(NULL)\n"); else printf("%s\n", v); } goto exit0; } else { printf("Value not found for \"%s\"\n", argv[2]); goto exit1; } } else if (argc == 3 && !strcmp(argv[1], "get_int")) { if (!git_config_get_int(argv[2], &val)) { printf("%d\n", val); goto exit0; } else { printf("Value not found for \"%s\"\n", argv[2]); goto exit1; } } else if (argc == 3 && !strcmp(argv[1], "get_bool")) { if (!git_config_get_bool(argv[2], &val)) { printf("%d\n", val); goto exit0; } else { printf("Value not found for \"%s\"\n", argv[2]); goto exit1; } } else if (argc == 3 && !strcmp(argv[1], "get_string")) { if (!git_config_get_string_const(argv[2], &v)) { printf("%s\n", v); goto exit0; } else { printf("Value not found for \"%s\"\n", argv[2]); goto exit1; } } else if (!strcmp(argv[1], "configset_get_value")) { for (i = 3; i < argc; i++) { int err; if ((err = git_configset_add_file(&cs, argv[i]))) { fprintf(stderr, "Error (%d) reading configuration file %s.\n", err, argv[i]); goto exit2; } } if (!git_configset_get_value(&cs, argv[2], &v)) { if (!v) printf("(NULL)\n"); else printf("%s\n", v); goto exit0; } else { printf("Value not found for \"%s\"\n", argv[2]); goto exit1; } } else if (!strcmp(argv[1], "configset_get_value_multi")) { for (i = 3; i < argc; i++) { int err; if ((err = git_configset_add_file(&cs, argv[i]))) { fprintf(stderr, "Error (%d) reading configuration file %s.\n", err, argv[i]); goto exit2; } } strptr = git_configset_get_value_multi(&cs, argv[2]); if (strptr) { for (i = 0; i < strptr->nr; i++) { v = strptr->items[i].string; if (!v) printf("(NULL)\n"); else printf("%s\n", v); } goto exit0; } else { printf("Value not found for \"%s\"\n", argv[2]); goto exit1; } } else if (!strcmp(argv[1], "iterate")) { git_config(iterate_cb, NULL); goto exit0; } die("%s: Please check the syntax and the function name", argv[0]); exit0: git_configset_clear(&cs); return 0; exit1: git_configset_clear(&cs); return 1; exit2: git_configset_clear(&cs); return 2; }