4040#include "cache.h"
4141#include "quote.h"
4242#include "cache-tree.h"
43+ #include "parse-options.h"
4344
4445#define CHECKOUT_ALL 4
4546static int line_termination = '\n' ;
@@ -153,18 +154,92 @@ static void checkout_all(const char *prefix, int prefix_length)
153154 exit (128 );
154155}
155156
156- static const char checkout_cache_usage [] =
157- "git checkout-index [-u] [-q] [-a] [-f] [-n] [--stage=[123]|all] [--prefix=<string>] [--temp] [--] <file>..." ;
157+ static const char * const builtin_checkout_index_usage [] = {
158+ "git checkout-index [options] [--] <file>..." ,
159+ NULL
160+ };
158161
159162static struct lock_file lock_file ;
160163
164+ static int option_parse_u (const struct option * opt ,
165+ const char * arg , int unset )
166+ {
167+ int * newfd = opt -> value ;
168+
169+ state .refresh_cache = 1 ;
170+ if (* newfd < 0 )
171+ * newfd = hold_locked_index (& lock_file , 1 );
172+ return 0 ;
173+ }
174+
175+ static int option_parse_z (const struct option * opt ,
176+ const char * arg , int unset )
177+ {
178+ if (unset )
179+ line_termination = '\n' ;
180+ else
181+ line_termination = 0 ;
182+ return 0 ;
183+ }
184+
185+ static int option_parse_prefix (const struct option * opt ,
186+ const char * arg , int unset )
187+ {
188+ state .base_dir = arg ;
189+ state .base_dir_len = strlen (arg );
190+ return 0 ;
191+ }
192+
193+ static int option_parse_stage (const struct option * opt ,
194+ const char * arg , int unset )
195+ {
196+ if (!strcmp (arg , "all" )) {
197+ to_tempfile = 1 ;
198+ checkout_stage = CHECKOUT_ALL ;
199+ } else {
200+ int ch = arg [0 ];
201+ if ('1' <= ch && ch <= '3' )
202+ checkout_stage = arg [0 ] - '0' ;
203+ else
204+ die ("stage should be between 1 and 3 or all" );
205+ }
206+ return 0 ;
207+ }
208+
161209int cmd_checkout_index (int argc , const char * * argv , const char * prefix )
162210{
163211 int i ;
164212 int newfd = -1 ;
165213 int all = 0 ;
166214 int read_from_stdin = 0 ;
167215 int prefix_length ;
216+ int force = 0 , quiet = 0 , not_new = 0 ;
217+ struct option builtin_checkout_index_options [] = {
218+ OPT_BOOLEAN ('a' , "all" , & all ,
219+ "checks out all files in the index" ),
220+ OPT_BOOLEAN ('f' , "force" , & force ,
221+ "forces overwrite of existing files" ),
222+ OPT__QUIET (& quiet ),
223+ OPT_BOOLEAN ('n' , "no-create" , & not_new ,
224+ "don't checkout new files" ),
225+ { OPTION_CALLBACK , 'u' , "index" , & newfd , NULL ,
226+ "update stat information in the index file" ,
227+ PARSE_OPT_NOARG , option_parse_u },
228+ { OPTION_CALLBACK , 'z' , NULL , NULL , NULL ,
229+ "paths are separated with NUL character" ,
230+ PARSE_OPT_NOARG , option_parse_z },
231+ OPT_BOOLEAN (0 , "stdin" , & read_from_stdin ,
232+ "read list of paths from the standard input" ),
233+ OPT_BOOLEAN (0 , "temp" , & to_tempfile ,
234+ "write the content to temporary files" ),
235+ OPT_CALLBACK (0 , "prefix" , NULL , "string" ,
236+ "when creating files, prepend <string>" ,
237+ option_parse_prefix ),
238+ OPT_CALLBACK (0 , "stage" , NULL , NULL ,
239+ "copy out the files from named stage" ,
240+ option_parse_stage ),
241+ OPT_END ()
242+ };
168243
169244 git_config (git_default_config , NULL );
170245 state .base_dir = "" ;
@@ -174,72 +249,11 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
174249 die ("invalid cache" );
175250 }
176251
177- for (i = 1 ; i < argc ; i ++ ) {
178- const char * arg = argv [i ];
179-
180- if (!strcmp (arg , "--" )) {
181- i ++ ;
182- break ;
183- }
184- if (!strcmp (arg , "-a" ) || !strcmp (arg , "--all" )) {
185- all = 1 ;
186- continue ;
187- }
188- if (!strcmp (arg , "-f" ) || !strcmp (arg , "--force" )) {
189- state .force = 1 ;
190- continue ;
191- }
192- if (!strcmp (arg , "-q" ) || !strcmp (arg , "--quiet" )) {
193- state .quiet = 1 ;
194- continue ;
195- }
196- if (!strcmp (arg , "-n" ) || !strcmp (arg , "--no-create" )) {
197- state .not_new = 1 ;
198- continue ;
199- }
200- if (!strcmp (arg , "-u" ) || !strcmp (arg , "--index" )) {
201- state .refresh_cache = 1 ;
202- if (newfd < 0 )
203- newfd = hold_locked_index (& lock_file , 1 );
204- continue ;
205- }
206- if (!strcmp (arg , "-z" )) {
207- line_termination = 0 ;
208- continue ;
209- }
210- if (!strcmp (arg , "--stdin" )) {
211- if (i != argc - 1 )
212- die ("--stdin must be at the end" );
213- read_from_stdin = 1 ;
214- i ++ ; /* do not consider arg as a file name */
215- break ;
216- }
217- if (!strcmp (arg , "--temp" )) {
218- to_tempfile = 1 ;
219- continue ;
220- }
221- if (!prefixcmp (arg , "--prefix=" )) {
222- state .base_dir = arg + 9 ;
223- state .base_dir_len = strlen (state .base_dir );
224- continue ;
225- }
226- if (!prefixcmp (arg , "--stage=" )) {
227- if (!strcmp (arg + 8 , "all" )) {
228- to_tempfile = 1 ;
229- checkout_stage = CHECKOUT_ALL ;
230- } else {
231- int ch = arg [8 ];
232- if ('1' <= ch && ch <= '3' )
233- checkout_stage = arg [8 ] - '0' ;
234- else
235- die ("stage should be between 1 and 3 or all" );
236- }
237- continue ;
238- }
239- if (arg [0 ] == '-' )
240- usage (checkout_cache_usage );
241- break ;
242- }
252+ argc = parse_options (argc , argv , builtin_checkout_index_options ,
253+ builtin_checkout_index_usage , 0 );
254+ state .force = force ;
255+ state .quiet = quiet ;
256+ state .not_new = not_new ;
243257
244258 if (state .base_dir_len || to_tempfile ) {
245259 /* when --prefix is specified we do not
@@ -253,7 +267,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
253267 }
254268
255269 /* Check out named files first */
256- for ( ; i < argc ; i ++ ) {
270+ for (i = 0 ; i < argc ; i ++ ) {
257271 const char * arg = argv [i ];
258272 const char * p ;
259273
0 commit comments