This gives direct access to the abbreviate_ref() function. The operation mode defaults to the core.warnambiguousrefs value, like the refname:short format, but can be explicitly changed with the --{,no}-strict option. The bash completion script utilizes this new command. Signed-off-by: Bert Wesarg <bert.wesarg@xxxxxxxxxxxxxx> --- Junio, if this is not a porcelain, tell me. Cc: git@xxxxxxxxxxxxxxx Cc: szeder@xxxxxxxxxx Cc: "Shawn O. Pearce" <spearce@xxxxxxxxxxx> .gitignore | 1 + Documentation/git-abbrev-ref.txt | 34 +++++++++++++++++++++++++++ Makefile | 1 + builtin-abbrev-ref.c | 40 ++++++++++++++++++++++++++++++++ builtin.h | 1 + contrib/completion/git-completion.bash | 16 ++++++------ git.c | 1 + 7 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 Documentation/git-abbrev-ref.txt create mode 100644 builtin-abbrev-ref.c diff --git a/.gitignore b/.gitignore index bbaf9de..c2d0ce4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ GIT-CFLAGS GIT-GUI-VARS GIT-VERSION-FILE git +git-abbrev-ref git-add git-add--interactive git-am diff --git a/Documentation/git-abbrev-ref.txt b/Documentation/git-abbrev-ref.txt new file mode 100644 index 0000000..67f6733 --- /dev/null +++ b/Documentation/git-abbrev-ref.txt @@ -0,0 +1,34 @@ +git-abbrev-ref(1) +================= + +NAME +---- +git-abbrev-ref - Abbreviate a named ref + +SYNOPSIS +-------- +'git abbrev-ref' [--strict] <ref>... + +DESCRIPTION +----------- + + +OPTIONS +------- +<ref>...:: + Refnames to be abbreviated. + +--strict:: + Operates in strict mode. Defaults to core.warnambiguousrefs. + +Author +------ +Written by Bert Wesarg <bert.wesarg@xxxxxxxxxxxxxx> + +Documentation +-------------- +Documentation by Bert Wesarg and the git-list <git@xxxxxxxxxxxxxxx>. + +GIT +--- +Part of the linkgit:git[1] suite diff --git a/Makefile b/Makefile index 3c0664a..f78e75f 100644 --- a/Makefile +++ b/Makefile @@ -493,6 +493,7 @@ LIB_OBJS += ws.o LIB_OBJS += wt-status.o LIB_OBJS += xdiff-interface.o +BUILTIN_OBJS += builtin-abbrev-ref.o BUILTIN_OBJS += builtin-add.o BUILTIN_OBJS += builtin-annotate.o BUILTIN_OBJS += builtin-apply.o diff --git a/builtin-abbrev-ref.c b/builtin-abbrev-ref.c new file mode 100644 index 0000000..4c4d42c --- /dev/null +++ b/builtin-abbrev-ref.c @@ -0,0 +1,40 @@ +#include "builtin.h" +#include "cache.h" +#include "refs.h" +#include "parse-options.h" + +static const char * const git_abbrev_ref_usage[] = { + "git abbrev-ref [options] ref...", + NULL +}; + +int cmd_abbrev_ref(int argc, const char **argv, const char *prefix) +{ + int i; + int strict = 0; + struct option options[] = { + OPT_BOOLEAN( 0 , "strict", &strict, "use strict mode"), + OPT_END(), + }; + + git_config(git_default_config, NULL); + strict = warn_ambiguous_refs; + argc = parse_options(argc, argv, options, git_abbrev_ref_usage, 0); + + for (i = 0; i < argc; i++) { + unsigned char sha1[20]; + char *ref; + char *abbrev_ref; + + if (!dwim_ref(argv[i], strlen(argv[i]), sha1, &ref)) + die("No such ref %s", argv[i]); + + abbreviate_refname(ref, strict, &abbrev_ref); + puts(abbrev_ref); + + free(ref); + free(abbrev_ref); + } + + return 0; +} diff --git a/builtin.h b/builtin.h index e67cb20..8271a4e 100644 --- a/builtin.h +++ b/builtin.h @@ -20,6 +20,7 @@ extern int commit_tree(const char *msg, unsigned char *tree, struct commit_list *parents, unsigned char *ret); extern int check_pager_config(const char *cmd); +extern int cmd_abbrev_ref(int argc, const char **argv, const char *prefix); extern int cmd_add(int argc, const char **argv, const char *prefix); extern int cmd_annotate(int argc, const char **argv, const char *prefix); extern int cmd_apply(int argc, const char **argv, const char *prefix); diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 93f0881..7f002c0 100755 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -112,9 +112,9 @@ __git_ps1 () fi if [ -n "$1" ]; then - printf "$1" "${b##refs/heads/}$r" + printf "$1" "$(git abbrev-ref $b)$r" else - printf " (%s)" "${b##refs/heads/}$r" + printf " (%s)" "$(git abbrev-ref $b)$r" fi fi } @@ -162,7 +162,7 @@ __git_heads () case "$is_hash,$i" in y,*) is_hash=n ;; n,*^{}) is_hash=y ;; - n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;; + n,refs/heads/*) is_hash=y; echo "$(git abbrev-ref $i)" ;; n,*) is_hash=y; echo "$i" ;; esac done @@ -180,7 +180,7 @@ __git_tags () case "$is_hash,$i" in y,*) is_hash=n ;; n,*^{}) is_hash=y ;; - n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;; + n,refs/tags/*) is_hash=y; echo "$(git abbrev-ref $i)" ;; n,*) is_hash=y; echo "$i" ;; esac done @@ -199,9 +199,9 @@ __git_refs () case "$is_hash,$i" in y,*) is_hash=n ;; n,*^{}) is_hash=y ;; - n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;; - n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;; - n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;; + n,refs/tags/*) is_hash=y; echo "$(git abbrev-ref $i)" ;; + n,refs/heads/*) is_hash=y; echo "$(git abbrev-ref $i)" ;; + n,refs/remotes/*) is_hash=y; echo "$(git abbrev-ref $i)" ;; n,*) is_hash=y; echo "$i" ;; esac done @@ -222,7 +222,7 @@ __git_refs_remotes () case "$is_hash,$i" in n,refs/heads/*) is_hash=y - echo "$i:refs/remotes/$1/${i#refs/heads/}" + echo "$i:refs/remotes/$1/$(git abbrev-ref $i)" ;; y,*) is_hash=n ;; n,*^{}) is_hash=y ;; diff --git a/git.c b/git.c index 905acc2..052ebb5 100644 --- a/git.c +++ b/git.c @@ -263,6 +263,7 @@ static void handle_internal_command(int argc, const char **argv) { const char *cmd = argv[0]; static struct cmd_struct commands[] = { + { "abbrev-ref", cmd_abbrev_ref, RUN_SETUP }, { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE }, { "annotate", cmd_annotate, RUN_SETUP }, { "apply", cmd_apply }, -- 1.6.0.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html