Merge branch 'bw/remote-rename-update-config'
"git remote rename X Y" needs to adjust configuration variables (e.g. branch.<name>.remote) whose value used to be X to Y. branch.<name>.pushRemote is now also updated. * bw/remote-rename-update-config: remote rename/remove: gently handle remote.pushDefault config config: provide access to the current line number remote rename/remove: handle branch.<name>.pushRemote config values remote: clean-up config callback remote: clean-up by returning early to avoid one indentation pull --rebase/remote rename: document and honor single-letter abbreviations rebase typesmaint
commit
d0038f4b31
|
|
@ -81,15 +81,16 @@ branch.<name>.rebase::
|
||||||
"git pull" is run. See "pull.rebase" for doing this in a non
|
"git pull" is run. See "pull.rebase" for doing this in a non
|
||||||
branch-specific manner.
|
branch-specific manner.
|
||||||
+
|
+
|
||||||
When `merges`, pass the `--rebase-merges` option to 'git rebase'
|
When `merges` (or just 'm'), pass the `--rebase-merges` option to 'git rebase'
|
||||||
so that the local merge commits are included in the rebase (see
|
so that the local merge commits are included in the rebase (see
|
||||||
linkgit:git-rebase[1] for details).
|
linkgit:git-rebase[1] for details).
|
||||||
+
|
+
|
||||||
When `preserve` (deprecated in favor of `merges`), also pass
|
When `preserve` (or just 'p', deprecated in favor of `merges`), also pass
|
||||||
`--preserve-merges` along to 'git rebase' so that locally committed merge
|
`--preserve-merges` along to 'git rebase' so that locally committed merge
|
||||||
commits will not be flattened by running 'git pull'.
|
commits will not be flattened by running 'git pull'.
|
||||||
+
|
+
|
||||||
When the value is `interactive`, the rebase is run in interactive mode.
|
When the value is `interactive` (or just 'i'), the rebase is run in interactive
|
||||||
|
mode.
|
||||||
+
|
+
|
||||||
*NOTE*: this is a possibly dangerous operation; do *not* use
|
*NOTE*: this is a possibly dangerous operation; do *not* use
|
||||||
it unless you understand the implications (see linkgit:git-rebase[1]
|
it unless you understand the implications (see linkgit:git-rebase[1]
|
||||||
|
|
|
||||||
|
|
@ -14,15 +14,16 @@ pull.rebase::
|
||||||
pull" is run. See "branch.<name>.rebase" for setting this on a
|
pull" is run. See "branch.<name>.rebase" for setting this on a
|
||||||
per-branch basis.
|
per-branch basis.
|
||||||
+
|
+
|
||||||
When `merges`, pass the `--rebase-merges` option to 'git rebase'
|
When `merges` (or just 'm'), pass the `--rebase-merges` option to 'git rebase'
|
||||||
so that the local merge commits are included in the rebase (see
|
so that the local merge commits are included in the rebase (see
|
||||||
linkgit:git-rebase[1] for details).
|
linkgit:git-rebase[1] for details).
|
||||||
+
|
+
|
||||||
When `preserve` (deprecated in favor of `merges`), also pass
|
When `preserve` (or just 'p', deprecated in favor of `merges`), also pass
|
||||||
`--preserve-merges` along to 'git rebase' so that locally committed merge
|
`--preserve-merges` along to 'git rebase' so that locally committed merge
|
||||||
commits will not be flattened by running 'git pull'.
|
commits will not be flattened by running 'git pull'.
|
||||||
+
|
+
|
||||||
When the value is `interactive`, the rebase is run in interactive mode.
|
When the value is `interactive` (or just 'i'), the rebase is run in interactive
|
||||||
|
mode.
|
||||||
+
|
+
|
||||||
*NOTE*: this is a possibly dangerous operation; do *not* use
|
*NOTE*: this is a possibly dangerous operation; do *not* use
|
||||||
it unless you understand the implications (see linkgit:git-rebase[1]
|
it unless you understand the implications (see linkgit:git-rebase[1]
|
||||||
|
|
|
||||||
1
Makefile
1
Makefile
|
|
@ -955,6 +955,7 @@ LIB_OBJS += quote.o
|
||||||
LIB_OBJS += range-diff.o
|
LIB_OBJS += range-diff.o
|
||||||
LIB_OBJS += reachable.o
|
LIB_OBJS += reachable.o
|
||||||
LIB_OBJS += read-cache.o
|
LIB_OBJS += read-cache.o
|
||||||
|
LIB_OBJS += rebase.o
|
||||||
LIB_OBJS += rebase-interactive.o
|
LIB_OBJS += rebase-interactive.o
|
||||||
LIB_OBJS += reflog-walk.o
|
LIB_OBJS += reflog-walk.o
|
||||||
LIB_OBJS += refs.o
|
LIB_OBJS += refs.o
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
#include "sha1-array.h"
|
#include "sha1-array.h"
|
||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
|
#include "rebase.h"
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "refspec.h"
|
#include "refspec.h"
|
||||||
#include "revision.h"
|
#include "revision.h"
|
||||||
|
|
@ -26,15 +27,6 @@
|
||||||
#include "commit-reach.h"
|
#include "commit-reach.h"
|
||||||
#include "sequencer.h"
|
#include "sequencer.h"
|
||||||
|
|
||||||
enum rebase_type {
|
|
||||||
REBASE_INVALID = -1,
|
|
||||||
REBASE_FALSE = 0,
|
|
||||||
REBASE_TRUE,
|
|
||||||
REBASE_PRESERVE,
|
|
||||||
REBASE_MERGES,
|
|
||||||
REBASE_INTERACTIVE
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the value of --rebase. If value is a false value, returns
|
* Parses the value of --rebase. If value is a false value, returns
|
||||||
* REBASE_FALSE. If value is a true value, returns REBASE_TRUE. If value is
|
* REBASE_FALSE. If value is a true value, returns REBASE_TRUE. If value is
|
||||||
|
|
@ -45,22 +37,9 @@ enum rebase_type {
|
||||||
static enum rebase_type parse_config_rebase(const char *key, const char *value,
|
static enum rebase_type parse_config_rebase(const char *key, const char *value,
|
||||||
int fatal)
|
int fatal)
|
||||||
{
|
{
|
||||||
int v = git_parse_maybe_bool(value);
|
enum rebase_type v = rebase_parse_value(value);
|
||||||
|
if (v != REBASE_INVALID)
|
||||||
if (!v)
|
return v;
|
||||||
return REBASE_FALSE;
|
|
||||||
else if (v > 0)
|
|
||||||
return REBASE_TRUE;
|
|
||||||
else if (!strcmp(value, "preserve") || !strcmp(value, "p"))
|
|
||||||
return REBASE_PRESERVE;
|
|
||||||
else if (!strcmp(value, "merges") || !strcmp(value, "m"))
|
|
||||||
return REBASE_MERGES;
|
|
||||||
else if (!strcmp(value, "interactive") || !strcmp(value, "i"))
|
|
||||||
return REBASE_INTERACTIVE;
|
|
||||||
/*
|
|
||||||
* Please update _git_config() in git-completion.bash when you
|
|
||||||
* add new rebase modes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (fatal)
|
if (fatal)
|
||||||
die(_("Invalid value for %s: %s"), key, value);
|
die(_("Invalid value for %s: %s"), key, value);
|
||||||
|
|
|
||||||
141
builtin/remote.c
141
builtin/remote.c
|
|
@ -6,6 +6,7 @@
|
||||||
#include "string-list.h"
|
#include "string-list.h"
|
||||||
#include "strbuf.h"
|
#include "strbuf.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
|
#include "rebase.h"
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
#include "refspec.h"
|
#include "refspec.h"
|
||||||
#include "object-store.h"
|
#include "object-store.h"
|
||||||
|
|
@ -248,9 +249,8 @@ static int add(int argc, const char **argv)
|
||||||
struct branch_info {
|
struct branch_info {
|
||||||
char *remote_name;
|
char *remote_name;
|
||||||
struct string_list merge;
|
struct string_list merge;
|
||||||
enum {
|
enum rebase_type rebase;
|
||||||
NO_REBASE, NORMAL_REBASE, INTERACTIVE_REBASE, REBASE_MERGES
|
char *push_remote_name;
|
||||||
} rebase;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct string_list branch_list = STRING_LIST_INIT_NODUP;
|
static struct string_list branch_list = STRING_LIST_INIT_NODUP;
|
||||||
|
|
@ -264,37 +264,41 @@ static const char *abbrev_ref(const char *name, const char *prefix)
|
||||||
|
|
||||||
static int config_read_branches(const char *key, const char *value, void *cb)
|
static int config_read_branches(const char *key, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
if (starts_with(key, "branch.")) {
|
|
||||||
const char *orig_key = key;
|
const char *orig_key = key;
|
||||||
char *name;
|
char *name;
|
||||||
struct string_list_item *item;
|
struct string_list_item *item;
|
||||||
struct branch_info *info;
|
struct branch_info *info;
|
||||||
enum { REMOTE, MERGE, REBASE } type;
|
enum { REMOTE, MERGE, REBASE, PUSH_REMOTE } type;
|
||||||
size_t key_len;
|
size_t key_len;
|
||||||
|
|
||||||
key += 7;
|
if (!starts_with(key, "branch."))
|
||||||
if (strip_suffix(key, ".remote", &key_len)) {
|
|
||||||
name = xmemdupz(key, key_len);
|
|
||||||
type = REMOTE;
|
|
||||||
} else if (strip_suffix(key, ".merge", &key_len)) {
|
|
||||||
name = xmemdupz(key, key_len);
|
|
||||||
type = MERGE;
|
|
||||||
} else if (strip_suffix(key, ".rebase", &key_len)) {
|
|
||||||
name = xmemdupz(key, key_len);
|
|
||||||
type = REBASE;
|
|
||||||
} else
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
key += strlen("branch.");
|
||||||
|
if (strip_suffix(key, ".remote", &key_len))
|
||||||
|
type = REMOTE;
|
||||||
|
else if (strip_suffix(key, ".merge", &key_len))
|
||||||
|
type = MERGE;
|
||||||
|
else if (strip_suffix(key, ".rebase", &key_len))
|
||||||
|
type = REBASE;
|
||||||
|
else if (strip_suffix(key, ".pushremote", &key_len))
|
||||||
|
type = PUSH_REMOTE;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
name = xmemdupz(key, key_len);
|
||||||
|
|
||||||
item = string_list_insert(&branch_list, name);
|
item = string_list_insert(&branch_list, name);
|
||||||
|
|
||||||
if (!item->util)
|
if (!item->util)
|
||||||
item->util = xcalloc(1, sizeof(struct branch_info));
|
item->util = xcalloc(1, sizeof(struct branch_info));
|
||||||
info = item->util;
|
info = item->util;
|
||||||
if (type == REMOTE) {
|
switch (type) {
|
||||||
|
case REMOTE:
|
||||||
if (info->remote_name)
|
if (info->remote_name)
|
||||||
warning(_("more than one %s"), orig_key);
|
warning(_("more than one %s"), orig_key);
|
||||||
info->remote_name = xstrdup(value);
|
info->remote_name = xstrdup(value);
|
||||||
} else if (type == MERGE) {
|
break;
|
||||||
|
case MERGE: {
|
||||||
char *space = strchr(value, ' ');
|
char *space = strchr(value, ' ');
|
||||||
value = abbrev_branch(value);
|
value = abbrev_branch(value);
|
||||||
while (space) {
|
while (space) {
|
||||||
|
|
@ -305,18 +309,24 @@ static int config_read_branches(const char *key, const char *value, void *cb)
|
||||||
space = strchr(value, ' ');
|
space = strchr(value, ' ');
|
||||||
}
|
}
|
||||||
string_list_append(&info->merge, xstrdup(value));
|
string_list_append(&info->merge, xstrdup(value));
|
||||||
} else {
|
break;
|
||||||
int v = git_parse_maybe_bool(value);
|
|
||||||
if (v >= 0)
|
|
||||||
info->rebase = v;
|
|
||||||
else if (!strcmp(value, "preserve"))
|
|
||||||
info->rebase = NORMAL_REBASE;
|
|
||||||
else if (!strcmp(value, "merges"))
|
|
||||||
info->rebase = REBASE_MERGES;
|
|
||||||
else if (!strcmp(value, "interactive"))
|
|
||||||
info->rebase = INTERACTIVE_REBASE;
|
|
||||||
}
|
}
|
||||||
|
case REBASE:
|
||||||
|
/*
|
||||||
|
* Consider invalid values as false and check the
|
||||||
|
* truth value with >= REBASE_TRUE.
|
||||||
|
*/
|
||||||
|
info->rebase = rebase_parse_value(value);
|
||||||
|
break;
|
||||||
|
case PUSH_REMOTE:
|
||||||
|
if (info->push_remote_name)
|
||||||
|
warning(_("more than one %s"), orig_key);
|
||||||
|
info->push_remote_name = xstrdup(value);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BUG("unexpected type=%d", type);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -605,6 +615,56 @@ static int migrate_file(struct remote *remote)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct push_default_info
|
||||||
|
{
|
||||||
|
const char *old_name;
|
||||||
|
enum config_scope scope;
|
||||||
|
struct strbuf origin;
|
||||||
|
int linenr;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int config_read_push_default(const char *key, const char *value,
|
||||||
|
void *cb)
|
||||||
|
{
|
||||||
|
struct push_default_info* info = cb;
|
||||||
|
if (strcmp(key, "remote.pushdefault") ||
|
||||||
|
!value || strcmp(value, info->old_name))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
info->scope = current_config_scope();
|
||||||
|
strbuf_reset(&info->origin);
|
||||||
|
strbuf_addstr(&info->origin, current_config_name());
|
||||||
|
info->linenr = current_config_line();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_push_default(const char* old_name, const char* new_name)
|
||||||
|
{
|
||||||
|
struct push_default_info push_default = {
|
||||||
|
old_name, CONFIG_SCOPE_UNKNOWN, STRBUF_INIT, -1 };
|
||||||
|
git_config(config_read_push_default, &push_default);
|
||||||
|
if (push_default.scope >= CONFIG_SCOPE_COMMAND)
|
||||||
|
; /* pass */
|
||||||
|
else if (push_default.scope >= CONFIG_SCOPE_LOCAL) {
|
||||||
|
int result = git_config_set_gently("remote.pushDefault",
|
||||||
|
new_name);
|
||||||
|
if (new_name && result && result != CONFIG_NOTHING_SET)
|
||||||
|
die(_("could not set '%s'"), "remote.pushDefault");
|
||||||
|
else if (!new_name && result && result != CONFIG_NOTHING_SET)
|
||||||
|
die(_("could not unset '%s'"), "remote.pushDefault");
|
||||||
|
} else if (push_default.scope >= CONFIG_SCOPE_SYSTEM) {
|
||||||
|
/* warn */
|
||||||
|
warning(_("The %s configuration remote.pushDefault in:\n"
|
||||||
|
"\t%s:%d\n"
|
||||||
|
"now names the non-existent remote '%s'"),
|
||||||
|
config_scope_name(push_default.scope),
|
||||||
|
push_default.origin.buf, push_default.linenr,
|
||||||
|
old_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int mv(int argc, const char **argv)
|
static int mv(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
|
|
@ -680,6 +740,11 @@ static int mv(int argc, const char **argv)
|
||||||
strbuf_addf(&buf, "branch.%s.remote", item->string);
|
strbuf_addf(&buf, "branch.%s.remote", item->string);
|
||||||
git_config_set(buf.buf, rename.new_name);
|
git_config_set(buf.buf, rename.new_name);
|
||||||
}
|
}
|
||||||
|
if (info->push_remote_name && !strcmp(info->push_remote_name, rename.old_name)) {
|
||||||
|
strbuf_reset(&buf);
|
||||||
|
strbuf_addf(&buf, "branch.%s.pushremote", item->string);
|
||||||
|
git_config_set(buf.buf, rename.new_name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!refspec_updated)
|
if (!refspec_updated)
|
||||||
|
|
@ -735,6 +800,9 @@ static int mv(int argc, const char **argv)
|
||||||
die(_("creating '%s' failed"), buf.buf);
|
die(_("creating '%s' failed"), buf.buf);
|
||||||
}
|
}
|
||||||
string_list_clear(&remote_branches, 1);
|
string_list_clear(&remote_branches, 1);
|
||||||
|
|
||||||
|
handle_push_default(rename.old_name, rename.new_name);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -781,6 +849,13 @@ static int rm(int argc, const char **argv)
|
||||||
die(_("could not unset '%s'"), buf.buf);
|
die(_("could not unset '%s'"), buf.buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (info->push_remote_name && !strcmp(info->push_remote_name, remote->name)) {
|
||||||
|
strbuf_reset(&buf);
|
||||||
|
strbuf_addf(&buf, "branch.%s.pushremote", item->string);
|
||||||
|
result = git_config_set_gently(buf.buf, NULL);
|
||||||
|
if (result && result != CONFIG_NOTHING_SET)
|
||||||
|
die(_("could not unset '%s'"), buf.buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
@ -813,6 +888,8 @@ static int rm(int argc, const char **argv)
|
||||||
strbuf_addf(&buf, "remote.%s", remote->name);
|
strbuf_addf(&buf, "remote.%s", remote->name);
|
||||||
if (git_config_rename_section(buf.buf, NULL) < 1)
|
if (git_config_rename_section(buf.buf, NULL) < 1)
|
||||||
return error(_("Could not remove config section '%s'"), buf.buf);
|
return error(_("Could not remove config section '%s'"), buf.buf);
|
||||||
|
|
||||||
|
handle_push_default(remote->name, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
@ -943,7 +1020,7 @@ static int add_local_to_show_info(struct string_list_item *branch_item, void *cb
|
||||||
return 0;
|
return 0;
|
||||||
if ((n = strlen(branch_item->string)) > show_info->width)
|
if ((n = strlen(branch_item->string)) > show_info->width)
|
||||||
show_info->width = n;
|
show_info->width = n;
|
||||||
if (branch_info->rebase)
|
if (branch_info->rebase >= REBASE_TRUE)
|
||||||
show_info->any_rebase = 1;
|
show_info->any_rebase = 1;
|
||||||
|
|
||||||
item = string_list_insert(show_info->list, branch_item->string);
|
item = string_list_insert(show_info->list, branch_item->string);
|
||||||
|
|
@ -960,16 +1037,16 @@ static int show_local_info_item(struct string_list_item *item, void *cb_data)
|
||||||
int width = show_info->width + 4;
|
int width = show_info->width + 4;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (branch_info->rebase && branch_info->merge.nr > 1) {
|
if (branch_info->rebase >= REBASE_TRUE && branch_info->merge.nr > 1) {
|
||||||
error(_("invalid branch.%s.merge; cannot rebase onto > 1 branch"),
|
error(_("invalid branch.%s.merge; cannot rebase onto > 1 branch"),
|
||||||
item->string);
|
item->string);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(" %-*s ", show_info->width, item->string);
|
printf(" %-*s ", show_info->width, item->string);
|
||||||
if (branch_info->rebase) {
|
if (branch_info->rebase >= REBASE_TRUE) {
|
||||||
const char *msg;
|
const char *msg;
|
||||||
if (branch_info->rebase == INTERACTIVE_REBASE)
|
if (branch_info->rebase == REBASE_INTERACTIVE)
|
||||||
msg = _("rebases interactively onto remote %s");
|
msg = _("rebases interactively onto remote %s");
|
||||||
else if (branch_info->rebase == REBASE_MERGES)
|
else if (branch_info->rebase == REBASE_MERGES)
|
||||||
msg = _("rebases interactively (with merges) onto "
|
msg = _("rebases interactively (with merges) onto "
|
||||||
|
|
|
||||||
8
config.c
8
config.c
|
|
@ -3338,6 +3338,14 @@ enum config_scope current_config_scope(void)
|
||||||
return current_parsing_scope;
|
return current_parsing_scope;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int current_config_line(void)
|
||||||
|
{
|
||||||
|
if (current_config_kvi)
|
||||||
|
return current_config_kvi->linenr;
|
||||||
|
else
|
||||||
|
return cf->linenr;
|
||||||
|
}
|
||||||
|
|
||||||
int lookup_config(const char **mapping, int nr_mapping, const char *var)
|
int lookup_config(const char **mapping, int nr_mapping, const char *var)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
||||||
1
config.h
1
config.h
|
|
@ -309,6 +309,7 @@ int git_config_parse_parameter(const char *, config_fn_t fn, void *data);
|
||||||
enum config_scope current_config_scope(void);
|
enum config_scope current_config_scope(void);
|
||||||
const char *current_config_origin_type(void);
|
const char *current_config_origin_type(void);
|
||||||
const char *current_config_name(void);
|
const char *current_config_name(void);
|
||||||
|
int current_config_line(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Include Directives
|
* Include Directives
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
#include "rebase.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parses textual value for pull.rebase, branch.<name>.rebase, etc.
|
||||||
|
* Unrecognised value yields REBASE_INVALID, which traditionally is
|
||||||
|
* treated the same way as REBASE_FALSE.
|
||||||
|
*
|
||||||
|
* The callers that care if (any) rebase is requested should say
|
||||||
|
* if (REBASE_TRUE <= rebase_parse_value(string))
|
||||||
|
*
|
||||||
|
* The callers that want to differenciate an unrecognised value and
|
||||||
|
* false can do so by treating _INVALID and _FALSE differently.
|
||||||
|
*/
|
||||||
|
enum rebase_type rebase_parse_value(const char *value)
|
||||||
|
{
|
||||||
|
int v = git_parse_maybe_bool(value);
|
||||||
|
|
||||||
|
if (!v)
|
||||||
|
return REBASE_FALSE;
|
||||||
|
else if (v > 0)
|
||||||
|
return REBASE_TRUE;
|
||||||
|
else if (!strcmp(value, "preserve") || !strcmp(value, "p"))
|
||||||
|
return REBASE_PRESERVE;
|
||||||
|
else if (!strcmp(value, "merges") || !strcmp(value, "m"))
|
||||||
|
return REBASE_MERGES;
|
||||||
|
else if (!strcmp(value, "interactive") || !strcmp(value, "i"))
|
||||||
|
return REBASE_INTERACTIVE;
|
||||||
|
/*
|
||||||
|
* Please update _git_config() in git-completion.bash when you
|
||||||
|
* add new rebase modes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
return REBASE_INVALID;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef REBASE_H
|
||||||
|
#define REBASE_H
|
||||||
|
|
||||||
|
enum rebase_type {
|
||||||
|
REBASE_INVALID = -1,
|
||||||
|
REBASE_FALSE = 0,
|
||||||
|
REBASE_TRUE,
|
||||||
|
REBASE_PRESERVE,
|
||||||
|
REBASE_MERGES,
|
||||||
|
REBASE_INTERACTIVE
|
||||||
|
};
|
||||||
|
|
||||||
|
enum rebase_type rebase_parse_value(const char *value);
|
||||||
|
|
||||||
|
#endif /* REBASE */
|
||||||
|
|
@ -48,6 +48,7 @@ static int iterate_cb(const char *var, const char *value, void *data)
|
||||||
printf("value=%s\n", value ? value : "(null)");
|
printf("value=%s\n", value ? value : "(null)");
|
||||||
printf("origin=%s\n", current_config_origin_type());
|
printf("origin=%s\n", current_config_origin_type());
|
||||||
printf("name=%s\n", current_config_name());
|
printf("name=%s\n", current_config_name());
|
||||||
|
printf("lno=%d\n", current_config_line());
|
||||||
printf("scope=%s\n", config_scope_name(current_config_scope()));
|
printf("scope=%s\n", config_scope_name(current_config_scope()));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
|
|
@ -238,8 +238,8 @@ test_expect_success 'error on modifying repo config without repo' '
|
||||||
|
|
||||||
cmdline_config="'foo.bar=from-cmdline'"
|
cmdline_config="'foo.bar=from-cmdline'"
|
||||||
test_expect_success 'iteration shows correct origins' '
|
test_expect_success 'iteration shows correct origins' '
|
||||||
echo "[foo]bar = from-repo" >.git/config &&
|
printf "[ignore]\n\tthis = please\n[foo]bar = from-repo\n" >.git/config &&
|
||||||
echo "[foo]bar = from-home" >.gitconfig &&
|
printf "[foo]\n\tbar = from-home\n" >.gitconfig &&
|
||||||
if test_have_prereq MINGW
|
if test_have_prereq MINGW
|
||||||
then
|
then
|
||||||
# Use Windows path (i.e. *not* $HOME)
|
# Use Windows path (i.e. *not* $HOME)
|
||||||
|
|
@ -253,18 +253,28 @@ test_expect_success 'iteration shows correct origins' '
|
||||||
value=from-home
|
value=from-home
|
||||||
origin=file
|
origin=file
|
||||||
name=$HOME_GITCONFIG
|
name=$HOME_GITCONFIG
|
||||||
|
lno=2
|
||||||
scope=global
|
scope=global
|
||||||
|
|
||||||
|
key=ignore.this
|
||||||
|
value=please
|
||||||
|
origin=file
|
||||||
|
name=.git/config
|
||||||
|
lno=2
|
||||||
|
scope=local
|
||||||
|
|
||||||
key=foo.bar
|
key=foo.bar
|
||||||
value=from-repo
|
value=from-repo
|
||||||
origin=file
|
origin=file
|
||||||
name=.git/config
|
name=.git/config
|
||||||
|
lno=3
|
||||||
scope=local
|
scope=local
|
||||||
|
|
||||||
key=foo.bar
|
key=foo.bar
|
||||||
value=from-cmdline
|
value=from-cmdline
|
||||||
origin=command line
|
origin=command line
|
||||||
name=
|
name=
|
||||||
|
lno=-1
|
||||||
scope=command
|
scope=command
|
||||||
EOF
|
EOF
|
||||||
GIT_CONFIG_PARAMETERS=$cmdline_config test-tool config iterate >actual &&
|
GIT_CONFIG_PARAMETERS=$cmdline_config test-tool config iterate >actual &&
|
||||||
|
|
|
||||||
|
|
@ -734,15 +734,53 @@ test_expect_success 'reject adding remote with an invalid name' '
|
||||||
# the last two ones check if the config is updated.
|
# the last two ones check if the config is updated.
|
||||||
|
|
||||||
test_expect_success 'rename a remote' '
|
test_expect_success 'rename a remote' '
|
||||||
|
test_config_global remote.pushDefault origin &&
|
||||||
git clone one four &&
|
git clone one four &&
|
||||||
(
|
(
|
||||||
cd four &&
|
cd four &&
|
||||||
|
git config branch.master.pushRemote origin &&
|
||||||
git remote rename origin upstream &&
|
git remote rename origin upstream &&
|
||||||
test -z "$(git for-each-ref refs/remotes/origin)" &&
|
test -z "$(git for-each-ref refs/remotes/origin)" &&
|
||||||
test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/master" &&
|
test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/master" &&
|
||||||
test "$(git rev-parse upstream/master)" = "$(git rev-parse master)" &&
|
test "$(git rev-parse upstream/master)" = "$(git rev-parse master)" &&
|
||||||
test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*" &&
|
test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*" &&
|
||||||
test "$(git config branch.master.remote)" = "upstream"
|
test "$(git config branch.master.remote)" = "upstream" &&
|
||||||
|
test "$(git config branch.master.pushRemote)" = "upstream" &&
|
||||||
|
test "$(git config --global remote.pushDefault)" = "origin"
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rename a remote renames repo remote.pushDefault' '
|
||||||
|
git clone one four.1 &&
|
||||||
|
(
|
||||||
|
cd four.1 &&
|
||||||
|
git config remote.pushDefault origin &&
|
||||||
|
git remote rename origin upstream &&
|
||||||
|
test "$(git config --local remote.pushDefault)" = "upstream"
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rename a remote renames repo remote.pushDefault but ignores global' '
|
||||||
|
test_config_global remote.pushDefault other &&
|
||||||
|
git clone one four.2 &&
|
||||||
|
(
|
||||||
|
cd four.2 &&
|
||||||
|
git config remote.pushDefault origin &&
|
||||||
|
git remote rename origin upstream &&
|
||||||
|
test "$(git config --global remote.pushDefault)" = "other" &&
|
||||||
|
test "$(git config --local remote.pushDefault)" = "upstream"
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'rename a remote renames repo remote.pushDefault but keeps global' '
|
||||||
|
test_config_global remote.pushDefault origin &&
|
||||||
|
git clone one four.3 &&
|
||||||
|
(
|
||||||
|
cd four.3 &&
|
||||||
|
git config remote.pushDefault origin &&
|
||||||
|
git remote rename origin upstream &&
|
||||||
|
test "$(git config --global remote.pushDefault)" = "origin" &&
|
||||||
|
test "$(git config --local remote.pushDefault)" = "upstream"
|
||||||
)
|
)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
|
@ -784,6 +822,54 @@ test_expect_success 'rename succeeds with existing remote.<target>.prune' '
|
||||||
git -C four.four remote rename origin upstream
|
git -C four.four remote rename origin upstream
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'remove a remote' '
|
||||||
|
test_config_global remote.pushDefault origin &&
|
||||||
|
git clone one four.five &&
|
||||||
|
(
|
||||||
|
cd four.five &&
|
||||||
|
git config branch.master.pushRemote origin &&
|
||||||
|
git remote remove origin &&
|
||||||
|
test -z "$(git for-each-ref refs/remotes/origin)" &&
|
||||||
|
test_must_fail git config branch.master.remote &&
|
||||||
|
test_must_fail git config branch.master.pushRemote &&
|
||||||
|
test "$(git config --global remote.pushDefault)" = "origin"
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'remove a remote removes repo remote.pushDefault' '
|
||||||
|
git clone one four.five.1 &&
|
||||||
|
(
|
||||||
|
cd four.five.1 &&
|
||||||
|
git config remote.pushDefault origin &&
|
||||||
|
git remote remove origin &&
|
||||||
|
test_must_fail git config --local remote.pushDefault
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'remove a remote removes repo remote.pushDefault but ignores global' '
|
||||||
|
test_config_global remote.pushDefault other &&
|
||||||
|
git clone one four.five.2 &&
|
||||||
|
(
|
||||||
|
cd four.five.2 &&
|
||||||
|
git config remote.pushDefault origin &&
|
||||||
|
git remote remove origin &&
|
||||||
|
test "$(git config --global remote.pushDefault)" = "other" &&
|
||||||
|
test_must_fail git config --local remote.pushDefault
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'remove a remote removes repo remote.pushDefault but keeps global' '
|
||||||
|
test_config_global remote.pushDefault origin &&
|
||||||
|
git clone one four.five.3 &&
|
||||||
|
(
|
||||||
|
cd four.five.3 &&
|
||||||
|
git config remote.pushDefault origin &&
|
||||||
|
git remote remove origin &&
|
||||||
|
test "$(git config --global remote.pushDefault)" = "origin" &&
|
||||||
|
test_must_fail git config --local remote.pushDefault
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
cat >remotes_origin <<EOF
|
cat >remotes_origin <<EOF
|
||||||
URL: $(pwd)/one
|
URL: $(pwd)/one
|
||||||
Push: refs/heads/master:refs/heads/upstream
|
Push: refs/heads/master:refs/heads/upstream
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue