summaryrefslogtreecommitdiff
path: root/builtin-check-ref-format.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-07-06 15:38:18 -0700
committerJunio C Hamano <gitster@pobox.com>2011-07-06 15:38:18 -0700
commit71ee7fd15457a0252c089420b5b66de266dcbd2f (patch)
tree98d4d7d1f72c30fd7695f011be78d3e45158c41a /builtin-check-ref-format.c
parent4d9e42f8f11c57b32b976a943c8ddaf6214e64b8 (diff)
parente923eaeb901ff056421b9007adcbbce271caa7b6 (diff)
downloadgit-71ee7fd15457a0252c089420b5b66de266dcbd2f.tar.gz
Merge commit 'v1.7.0' into jc/checkout-reflog-fix
* commit 'v1.7.0': (4188 commits) Git 1.7.0 Fix typo in 1.6.6.2 release notes Re-fix check-ref-format documentation mark-up archive documentation: attributes are taken from the tree by default Documentation: minor fixes to RelNotes-1.7.0 bash: support 'git am's new '--continue' option filter-branch: Fix error message for --prune-empty --commit-filter am: switch --resolved to --continue Update draft release notes to 1.7.0 one more time Git 1.6.6.2 t8003: check exit code of command and error message separately check-ref-format documentation: fix enumeration mark-up Documentation: quote braces in {upstream} notation t3902: Protect against OS X normalization blame: prevent a segv when -L given start > EOF git-push: document all the status flags used in the output Fix parsing of imap.preformattedHTML and imap.sslverify git-add documentation: Fix shell quoting example Revert "pack-objects: fix pack generation when using pack_size_limit" archive: simplify archive format guessing ...
Diffstat (limited to 'builtin-check-ref-format.c')
-rw-r--r--builtin-check-ref-format.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/builtin-check-ref-format.c b/builtin-check-ref-format.c
index fe04be77a9..b106c65d80 100644
--- a/builtin-check-ref-format.c
+++ b/builtin-check-ref-format.c
@@ -5,10 +5,57 @@
#include "cache.h"
#include "refs.h"
#include "builtin.h"
+#include "strbuf.h"
+
+static const char builtin_check_ref_format_usage[] =
+"git check-ref-format [--print] <refname>\n"
+" or: git check-ref-format --branch <branchname-shorthand>";
+
+/*
+ * Replace each run of adjacent slashes in src with a single slash,
+ * and write the result to dst.
+ *
+ * This function is similar to normalize_path_copy(), but stripped down
+ * to meet check_ref_format's simpler needs.
+ */
+static void collapse_slashes(char *dst, const char *src)
+{
+ char ch;
+ char prev = '\0';
+
+ while ((ch = *src++) != '\0') {
+ if (prev == '/' && ch == prev)
+ continue;
+
+ *dst++ = ch;
+ prev = ch;
+ }
+ *dst = '\0';
+}
int cmd_check_ref_format(int argc, const char **argv, const char *prefix)
{
+ if (argc == 2 && !strcmp(argv[1], "-h"))
+ usage(builtin_check_ref_format_usage);
+
+ if (argc == 3 && !strcmp(argv[1], "--branch")) {
+ struct strbuf sb = STRBUF_INIT;
+
+ if (strbuf_check_branch_ref(&sb, argv[2]))
+ die("'%s' is not a valid branch name", argv[2]);
+ printf("%s\n", sb.buf + 11);
+ exit(0);
+ }
+ if (argc == 3 && !strcmp(argv[1], "--print")) {
+ char *refname = xmalloc(strlen(argv[2]) + 1);
+
+ if (check_ref_format(argv[2]))
+ exit(1);
+ collapse_slashes(refname, argv[2]);
+ printf("%s\n", refname);
+ exit(0);
+ }
if (argc != 2)
- usage("git-check-ref-format refname");
+ usage(builtin_check_ref_format_usage);
return !!check_ref_format(argv[1]);
}