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:
Junio C Hamano
2007-02-06 02:01:19 -08:00
5 changed files with 119 additions and 38 deletions

View File

@@ -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++) {

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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

View File

@@ -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;