77#include "strbuf.h"
88#include "worktree.h"
99#include "for-each-ref.h"
10+ #include "refs/refs-internal.h"
1011
1112#define REFS_MIGRATE_USAGE \
1213 N_("git refs migrate --ref-format=<format> [--no-reflog] [--dry-run]")
1314
1415#define REFS_VERIFY_USAGE \
1516 N_("git refs verify [--strict] [--verbose]")
1617
18+ #define REFS_EXISTS_USAGE \
19+ N_("git refs exists <ref>")
20+
1721static int cmd_refs_migrate (int argc , const char * * argv , const char * prefix ,
1822 struct repository * repo UNUSED )
1923{
@@ -113,6 +117,48 @@ static int cmd_refs_list(int argc, const char **argv, const char *prefix,
113117 return for_each_ref_core (argc , argv , prefix , repo , refs_list_usage );
114118}
115119
120+ static int cmd_refs_exists (int argc , const char * * argv , const char * prefix ,
121+ struct repository * repo UNUSED )
122+ {
123+ struct strbuf unused_referent = STRBUF_INIT ;
124+ struct object_id unused_oid ;
125+ unsigned int unused_type ;
126+ int failure_errno = 0 ;
127+ const char * ref ;
128+ int ret = 0 ;
129+ const char * const exists_usage [] = {
130+ REFS_EXISTS_USAGE ,
131+ NULL ,
132+ };
133+ struct option options [] = {
134+ OPT_END (),
135+ };
136+
137+ argc = parse_options (argc , argv , prefix , options , exists_usage , 0 );
138+ if (argc != 1 )
139+ die (_ ("'git refs exists' requires a reference" ));
140+
141+ ref = * argv ++ ;
142+ if (refs_read_raw_ref (get_main_ref_store (the_repository ), ref ,
143+ & unused_oid , & unused_referent , & unused_type ,
144+ & failure_errno )) {
145+ if (failure_errno == ENOENT || failure_errno == EISDIR ) {
146+ error (_ ("reference does not exist" ));
147+ ret = 2 ;
148+ } else {
149+ errno = failure_errno ;
150+ error_errno (_ ("failed to look up reference" ));
151+ ret = 1 ;
152+ }
153+
154+ goto out ;
155+ }
156+
157+ out :
158+ strbuf_release (& unused_referent );
159+ return ret ;
160+ }
161+
116162int cmd_refs (int argc ,
117163 const char * * argv ,
118164 const char * prefix ,
@@ -122,13 +168,15 @@ int cmd_refs(int argc,
122168 REFS_MIGRATE_USAGE ,
123169 REFS_VERIFY_USAGE ,
124170 "git refs list " COMMON_USAGE_FOR_EACH_REF ,
171+ REFS_EXISTS_USAGE ,
125172 NULL ,
126173 };
127174 parse_opt_subcommand_fn * fn = NULL ;
128175 struct option opts [] = {
129176 OPT_SUBCOMMAND ("migrate" , & fn , cmd_refs_migrate ),
130177 OPT_SUBCOMMAND ("verify" , & fn , cmd_refs_verify ),
131178 OPT_SUBCOMMAND ("list" , & fn , cmd_refs_list ),
179+ OPT_SUBCOMMAND ("exists" , & fn , cmd_refs_exists ),
132180 OPT_END (),
133181 };
134182
0 commit comments