mirror of
https://github.com/git/git.git
synced 2026-03-16 19:50:09 +01:00
Merge branch 'master' into next
* master: annotate: fix for cvsserver. gitweb: fix mismatched parenthesis git-push: allow globbing wildcard refspec. bash: Complete git-remote subcommands. bash: Support git-rebase -m continuation completion.
This commit is contained in:
@@ -12,7 +12,7 @@ int cmd_annotate(int argc, const char **argv, const char *prefix)
|
||||
int i;
|
||||
nargv = xmalloc(sizeof(char *) * (argc + 2));
|
||||
|
||||
nargv[0] = "blame";
|
||||
nargv[0] = "annotate";
|
||||
nargv[1] = "-c";
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
|
||||
@@ -41,6 +41,7 @@ static int max_score_digits;
|
||||
static int show_root;
|
||||
static int blank_boundary;
|
||||
static int incremental;
|
||||
static int cmd_is_annotate;
|
||||
|
||||
#ifndef DEBUG
|
||||
#define DEBUG 0
|
||||
@@ -1554,12 +1555,12 @@ static void emit_other(struct scoreboard *sb, struct blame_entry *ent, int opt)
|
||||
int length = (opt & OUTPUT_LONG_OBJECT_NAME) ? 40 : 8;
|
||||
|
||||
if (suspect->commit->object.flags & UNINTERESTING) {
|
||||
if (!blank_boundary) {
|
||||
if (blank_boundary)
|
||||
memset(hex, ' ', length);
|
||||
else if (!cmd_is_annotate) {
|
||||
length--;
|
||||
putchar('^');
|
||||
}
|
||||
else
|
||||
memset(hex, ' ', length);
|
||||
}
|
||||
|
||||
printf("%.*s", length, hex);
|
||||
@@ -2070,6 +2071,8 @@ int cmd_blame(int argc, const char **argv, const char *prefix)
|
||||
const char *bottomtop = NULL;
|
||||
const char *contents_from = NULL;
|
||||
|
||||
cmd_is_annotate = !strcmp(argv[0], "annotate");
|
||||
|
||||
git_config(git_blame_config);
|
||||
save_commit_buffer = 0;
|
||||
|
||||
|
||||
114
builtin-push.c
114
builtin-push.c
@@ -54,38 +54,84 @@ static void expand_refspecs(void)
|
||||
for_each_ref(expand_one_ref, NULL);
|
||||
}
|
||||
|
||||
struct wildcard_cb {
|
||||
const char *from_prefix;
|
||||
int from_prefix_len;
|
||||
const char *to_prefix;
|
||||
int to_prefix_len;
|
||||
int force;
|
||||
};
|
||||
|
||||
static int expand_wildcard_ref(const char *ref, const unsigned char *sha1, int flag, void *cb_data)
|
||||
{
|
||||
struct wildcard_cb *cb = cb_data;
|
||||
int len = strlen(ref);
|
||||
char *expanded, *newref;
|
||||
|
||||
if (len < cb->from_prefix_len ||
|
||||
memcmp(cb->from_prefix, ref, cb->from_prefix_len))
|
||||
return 0;
|
||||
expanded = xmalloc(len * 2 + cb->force +
|
||||
(cb->to_prefix_len - cb->from_prefix_len) + 2);
|
||||
newref = expanded + cb->force;
|
||||
if (cb->force)
|
||||
expanded[0] = '+';
|
||||
memcpy(newref, ref, len);
|
||||
newref[len] = ':';
|
||||
memcpy(newref + len + 1, cb->to_prefix, cb->to_prefix_len);
|
||||
strcpy(newref + len + 1 + cb->to_prefix_len,
|
||||
ref + cb->from_prefix_len);
|
||||
add_refspec(expanded);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wildcard_ref(const char *ref)
|
||||
{
|
||||
int len;
|
||||
const char *colon;
|
||||
struct wildcard_cb cb;
|
||||
|
||||
memset(&cb, 0, sizeof(cb));
|
||||
if (ref[0] == '+') {
|
||||
cb.force = 1;
|
||||
ref++;
|
||||
}
|
||||
len = strlen(ref);
|
||||
colon = strchr(ref, ':');
|
||||
if (! (colon && ref < colon &&
|
||||
colon[-2] == '/' && colon[-1] == '*' &&
|
||||
/* "<mine>/<asterisk>:<yours>/<asterisk>" is at least 7 bytes */
|
||||
7 <= len &&
|
||||
ref[len-2] == '/' && ref[len-1] == '*') )
|
||||
return 0 ;
|
||||
cb.from_prefix = ref;
|
||||
cb.from_prefix_len = colon - ref - 1;
|
||||
cb.to_prefix = colon + 1;
|
||||
cb.to_prefix_len = len - (colon - ref) - 2;
|
||||
for_each_ref(expand_wildcard_ref, &cb);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void set_refspecs(const char **refs, int nr)
|
||||
{
|
||||
if (nr) {
|
||||
int pass;
|
||||
for (pass = 0; pass < 2; pass++) {
|
||||
/* pass 0 counts and allocates, pass 1 fills */
|
||||
int i, cnt;
|
||||
for (i = cnt = 0; i < nr; i++) {
|
||||
if (!strcmp("tag", refs[i])) {
|
||||
int len;
|
||||
char *tag;
|
||||
if (nr <= ++i)
|
||||
die("tag <tag> shorthand without <tag>");
|
||||
if (pass) {
|
||||
len = strlen(refs[i]) + 11;
|
||||
tag = xmalloc(len);
|
||||
strcpy(tag, "refs/tags/");
|
||||
strcat(tag, refs[i]);
|
||||
refspec[cnt] = tag;
|
||||
}
|
||||
cnt++;
|
||||
continue;
|
||||
}
|
||||
if (pass)
|
||||
refspec[cnt] = refs[i];
|
||||
cnt++;
|
||||
}
|
||||
if (!pass) {
|
||||
size_t bytes = cnt * sizeof(char *);
|
||||
refspec_nr = cnt;
|
||||
refspec = xrealloc(refspec, bytes);
|
||||
int i;
|
||||
for (i = 0; i < nr; i++) {
|
||||
const char *ref = refs[i];
|
||||
if (!strcmp("tag", ref)) {
|
||||
char *tag;
|
||||
int len;
|
||||
if (nr <= ++i)
|
||||
die("tag shorthand without <tag>");
|
||||
len = strlen(refs[i]) + 11;
|
||||
tag = xmalloc(len);
|
||||
strcpy(tag, "refs/tags/");
|
||||
strcat(tag, refs[i]);
|
||||
ref = tag;
|
||||
}
|
||||
else if (wildcard_ref(ref))
|
||||
continue;
|
||||
add_refspec(ref);
|
||||
}
|
||||
}
|
||||
expand_refspecs();
|
||||
@@ -129,8 +175,10 @@ static int get_remotes_uri(const char *repo, const char *uri[MAX_URI])
|
||||
else
|
||||
error("more than %d URL's specified, ignoring the rest", MAX_URI);
|
||||
}
|
||||
else if (is_refspec && !has_explicit_refspec)
|
||||
add_refspec(xstrdup(s));
|
||||
else if (is_refspec && !has_explicit_refspec) {
|
||||
if (!wildcard_ref(s))
|
||||
add_refspec(xstrdup(s));
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
if (!n)
|
||||
@@ -156,8 +204,10 @@ static int get_remote_config(const char* key, const char* value)
|
||||
error("more than %d URL's specified, ignoring the rest", MAX_URI);
|
||||
}
|
||||
else if (config_get_refspecs &&
|
||||
!strcmp(key + 7 + config_repo_len, ".push"))
|
||||
add_refspec(xstrdup(value));
|
||||
!strcmp(key + 7 + config_repo_len, ".push")) {
|
||||
if (!wildcard_ref(value))
|
||||
add_refspec(xstrdup(value));
|
||||
}
|
||||
else if (config_get_receivepack &&
|
||||
!strcmp(key + 7 + config_repo_len, ".receivepack")) {
|
||||
if (!receivepack) {
|
||||
|
||||
@@ -675,7 +675,7 @@ _git_push ()
|
||||
_git_rebase ()
|
||||
{
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
if [ -d .dotest ]; then
|
||||
if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
|
||||
__gitcomp "--continue --skip --abort"
|
||||
return
|
||||
fi
|
||||
@@ -852,6 +852,32 @@ _git_config ()
|
||||
"
|
||||
}
|
||||
|
||||
_git_remote ()
|
||||
{
|
||||
local i c=1 command
|
||||
while [ $c -lt $COMP_CWORD ]; do
|
||||
i="${COMP_WORDS[c]}"
|
||||
case "$i" in
|
||||
add|show|prune) command="$i"; break ;;
|
||||
esac
|
||||
c=$((++c))
|
||||
done
|
||||
|
||||
if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
|
||||
__gitcomp "add show prune"
|
||||
return
|
||||
fi
|
||||
|
||||
case "$command" in
|
||||
show|prune)
|
||||
__gitcomp "$(__git_remotes)"
|
||||
;;
|
||||
*)
|
||||
COMPREPLY=()
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_git_reset ()
|
||||
{
|
||||
local cur="${COMP_WORDS[COMP_CWORD]}"
|
||||
@@ -934,6 +960,7 @@ _git ()
|
||||
pull) _git_pull ;;
|
||||
push) _git_push ;;
|
||||
rebase) _git_rebase ;;
|
||||
remote) _git_remote ;;
|
||||
reset) _git_reset ;;
|
||||
show) _git_show ;;
|
||||
show-branch) _git_log ;;
|
||||
@@ -979,6 +1006,7 @@ complete -o default -o nospace -F _git_pull git-pull
|
||||
complete -o default -o nospace -F _git_push git-push
|
||||
complete -o default -o nospace -F _git_rebase git-rebase
|
||||
complete -o default -o nospace -F _git_config git-config
|
||||
complete -o default -o nospace -F _git_remote git-remote
|
||||
complete -o default -o nospace -F _git_reset git-reset
|
||||
complete -o default -o nospace -F _git_show git-show
|
||||
complete -o default -o nospace -F _git_log git-show-branch
|
||||
|
||||
@@ -1963,7 +1963,7 @@ sub git_print_page_path {
|
||||
|
||||
print "<div class=\"page_path\">";
|
||||
print $cgi->a({-href => href(action=>"tree", hash_base=>$hb),
|
||||
-title => 'tree root'}, to_utf8("[$project]");
|
||||
-title => 'tree root'}, to_utf8("[$project]"));
|
||||
print " / ";
|
||||
if (defined $name) {
|
||||
my @dirname = split '/', $name;
|
||||
|
||||
Reference in New Issue
Block a user