Signed-off-by: Ian Jackson <ijack...@chiark.greenend.org.uk>
---
 Documentation/git-check-ref-format.txt | 10 ++++++++--
 builtin/check-ref-format.c             | 34 +++++++++++++++++++++++++++++++---
 2 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/Documentation/git-check-ref-format.txt 
b/Documentation/git-check-ref-format.txt
index e9a2657..5a213ce 100644
--- a/Documentation/git-check-ref-format.txt
+++ b/Documentation/git-check-ref-format.txt
@@ -10,8 +10,9 @@ SYNOPSIS
 [verse]
 'git check-ref-format' [--report-errors] [--normalize]
        [--[no-]allow-onelevel] [--refspec-pattern]
-       <refname>
-'git check-ref-format' [--report-errors] --branch <branchname-shorthand>
+       <refname> | --stdin
+'git check-ref-format' [--report-errors] --branch
+       <branchname-shorthand> | --stdin
 
 DESCRIPTION
 -----------
@@ -109,6 +110,11 @@ OPTIONS
        If any ref does not check OK, print a message to stderr.
         (By default, git check-ref-format is silent.)
 
+--stdin::
+       Instead of checking on ref supplied on the command line,
+       read refs, one per line, from stdin.  The exit status is
+       0 if all the refs were OK.
+
 
 EXAMPLES
 --------
diff --git a/builtin/check-ref-format.c b/builtin/check-ref-format.c
index 559d5c2..87f52fa 100644
--- a/builtin/check-ref-format.c
+++ b/builtin/check-ref-format.c
@@ -76,6 +76,7 @@ static int check_one_ref_format(const char *refname)
 int cmd_check_ref_format(int argc, const char **argv, const char *prefix)
 {
        int i;
+       int use_stdin = 0;
 
        if (argc == 2 && !strcmp(argv[1], "-h"))
                usage(builtin_check_ref_format_usage);
@@ -93,6 +94,8 @@ int cmd_check_ref_format(int argc, const char **argv, const 
char *prefix)
                        check_branch = 1;
                else if (!strcmp(argv[i], "--report-errors"))
                        report_errors = 1;
+               else if (!strcmp(argv[i], "--stdin"))
+                       use_stdin = 1;
                else
                        usage(builtin_check_ref_format_usage);
        }
@@ -100,8 +103,33 @@ int cmd_check_ref_format(int argc, const char **argv, 
const char *prefix)
        if (check_branch && (flags || normalize))
                usage(builtin_check_ref_format_usage);
 
-       if (! (i == argc - 1))
-               usage(builtin_check_ref_format_usage);
+       if (!use_stdin) {
+               if (! (i == argc - 1))
+                       usage(builtin_check_ref_format_usage);
+
+               return check_one_ref_format(argv[i]);
+       } else {
+               char buffer[2048];
+               int worst = 0;
 
-       return check_one_ref_format(argv[i]);
+               if (! (i == argc))
+                       usage(builtin_check_ref_format_usage);
+
+               while (fgets(buffer, sizeof(buffer), stdin)) {
+                       char *newline = strchr(buffer, '\n');
+                       if (!newline) {
+                               fprintf(stderr, "%s --stdin: missing final 
newline or line too long\n", *argv);
+                               exit(127);
+                       }
+                       *newline = 0;
+                       int got = check_one_ref_format(buffer);
+                       if (got > worst)
+                               worst = got;
+               }
+               if (!feof(stdin)) {
+                       perror("reading from stdin");
+                       exit(127);
+               }
+               return worst;
+       }
 }
-- 
2.10.1

Reply via email to