77#include "parse-options.h"
88#include "setup.h"
99
10- static void flush_current_id (struct object_id * id , struct object_id * result )
10+ static void flush_current_id (int patchlen , struct object_id * id , struct object_id * result )
1111{
12- printf ("%s %s\n" , oid_to_hex (result ), oid_to_hex (id ));
12+ if (patchlen )
13+ printf ("%s %s\n" , oid_to_hex (result ), oid_to_hex (id ));
1314}
1415
1516static int remove_space (char * line )
@@ -59,27 +60,9 @@ static int scan_hunk_header(const char *p, int *p_before, int *p_after)
5960 return 1 ;
6061}
6162
62- /*
63- * flag bits to control get_one_patchid()'s behaviour.
64- *
65- * STABLE/VERBATIM are given from the command line option as
66- * --stable/--verbatim. FIND_HEADER conveys the internal state
67- * maintained by the caller to allow the function to avoid mistaking
68- * lines of log message before seeing the "diff" part as the beginning
69- * of the next patch.
70- */
71- enum {
72- GOPID_STABLE = (1 <<0 ), /* --stable */
73- GOPID_VERBATIM = (1 <<1 ), /* --verbatim */
74- GOPID_FIND_HEADER = (1 <<2 ), /* stop at the beginning of patch message */
75- };
76-
7763static int get_one_patchid (struct object_id * next_oid , struct object_id * result ,
78- struct strbuf * line_buf , unsigned flags )
64+ struct strbuf * line_buf , int stable , int verbatim )
7965{
80- int stable = flags & GOPID_STABLE ;
81- int verbatim = flags & GOPID_VERBATIM ;
82- int find_header = flags & GOPID_FIND_HEADER ;
8366 int patchlen = 0 , found_next = 0 ;
8467 int before = -1 , after = -1 ;
8568 int diff_is_binary = 0 ;
@@ -94,40 +77,24 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result,
9477 const char * p = line ;
9578 int len ;
9679
97- /*
98- * The caller hasn't seen us find a patch header and
99- * return to it, or we have started processing patch
100- * and may encounter the beginning of the next patch.
101- */
102- if (find_header ) {
103- /*
104- * If we see a line that begins with "<object name>",
105- * "commit <object name>" or "From <object name>", it is
106- * the beginning of a patch. Return to the caller, as
107- * we are done with the one we have been processing.
108- */
109- if (skip_prefix (line , "commit " , & p ))
110- ;
111- else if (skip_prefix (line , "From " , & p ))
112- ;
113- if (!get_oid_hex (p , next_oid )) {
114- if (verbatim )
115- the_hash_algo -> update_fn (& ctx , line , strlen (line ));
116- found_next = 1 ;
117- break ;
118- }
80+ /* Possibly skip over the prefix added by "log" or "format-patch" */
81+ if (!skip_prefix (line , "commit " , & p ) &&
82+ !skip_prefix (line , "From " , & p ) &&
83+ starts_with (line , "\\ " ) && 12 < strlen (line )) {
84+ if (verbatim )
85+ the_hash_algo -> update_fn (& ctx , line , strlen (line ));
86+ continue ;
87+ }
88+
89+ if (!get_oid_hex (p , next_oid )) {
90+ found_next = 1 ;
91+ break ;
11992 }
12093
12194 /* Ignore commit comments */
12295 if (!patchlen && !starts_with (line , "diff " ))
12396 continue ;
12497
125- /*
126- * We are past the commit log message. Prepare to
127- * stop at the beginning of the next patch header.
128- */
129- find_header = 1 ;
130-
13198 /* Parsing diff header? */
13299 if (before == -1 ) {
133100 if (starts_with (line , "GIT binary patch" ) ||
@@ -160,16 +127,6 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result,
160127 break ;
161128 }
162129
163- /*
164- * A hunk about an incomplete line may have this
165- * marker at the end, which should just be ignored.
166- */
167- if (starts_with (line , "\\ " ) && 12 < strlen (line )) {
168- if (verbatim )
169- the_hash_algo -> update_fn (& ctx , line , strlen (line ));
170- continue ;
171- }
172-
173130 if (diff_is_binary ) {
174131 if (starts_with (line , "diff " )) {
175132 diff_is_binary = 0 ;
@@ -216,20 +173,17 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result,
216173 return patchlen ;
217174}
218175
219- static void generate_id_list (unsigned flags )
176+ static void generate_id_list (int stable , int verbatim )
220177{
221178 struct object_id oid , n , result ;
222179 int patchlen ;
223180 struct strbuf line_buf = STRBUF_INIT ;
224181
225182 oidclr (& oid , the_repository -> hash_algo );
226- flags |= GOPID_FIND_HEADER ;
227183 while (!feof (stdin )) {
228- patchlen = get_one_patchid (& n , & result , & line_buf , flags );
229- if (patchlen )
230- flush_current_id (& oid , & result );
184+ patchlen = get_one_patchid (& n , & result , & line_buf , stable , verbatim );
185+ flush_current_id (patchlen , & oid , & result );
231186 oidcpy (& oid , & n );
232- flags &= ~GOPID_FIND_HEADER ;
233187 }
234188 strbuf_release (& line_buf );
235189}
@@ -265,7 +219,6 @@ int cmd_patch_id(int argc, const char **argv, const char *prefix)
265219 /* if nothing is set, default to unstable */
266220 struct patch_id_opts config = {0 , 0 };
267221 int opts = 0 ;
268- unsigned flags = 0 ;
269222 struct option builtin_patch_id_options [] = {
270223 OPT_CMDMODE (0 , "unstable" , & opts ,
271224 N_ ("use the unstable patch-id algorithm" ), 1 ),
@@ -297,11 +250,7 @@ int cmd_patch_id(int argc, const char **argv, const char *prefix)
297250 if (!the_hash_algo )
298251 repo_set_hash_algo (the_repository , GIT_HASH_SHA1 );
299252
300- if (opts ? opts > 1 : config .stable )
301- flags |= GOPID_STABLE ;
302- if (opts ? opts == 3 : config .verbatim )
303- flags |= GOPID_VERBATIM ;
304- generate_id_list (flags );
305-
253+ generate_id_list (opts ? opts > 1 : config .stable ,
254+ opts ? opts == 3 : config .verbatim );
306255 return 0 ;
307256}
0 commit comments