7
7
#include "parse-options.h"
8
8
#include "setup.h"
9
9
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 )
11
11
{
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 ));
13
14
}
14
15
15
16
static int remove_space (char * line )
@@ -59,27 +60,9 @@ static int scan_hunk_header(const char *p, int *p_before, int *p_after)
59
60
return 1 ;
60
61
}
61
62
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
-
77
63
static 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 )
79
65
{
80
- int stable = flags & GOPID_STABLE ;
81
- int verbatim = flags & GOPID_VERBATIM ;
82
- int find_header = flags & GOPID_FIND_HEADER ;
83
66
int patchlen = 0 , found_next = 0 ;
84
67
int before = -1 , after = -1 ;
85
68
int diff_is_binary = 0 ;
@@ -94,40 +77,24 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result,
94
77
const char * p = line ;
95
78
int len ;
96
79
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 ;
119
92
}
120
93
121
94
/* Ignore commit comments */
122
95
if (!patchlen && !starts_with (line , "diff " ))
123
96
continue ;
124
97
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
-
131
98
/* Parsing diff header? */
132
99
if (before == -1 ) {
133
100
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,
160
127
break ;
161
128
}
162
129
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
-
173
130
if (diff_is_binary ) {
174
131
if (starts_with (line , "diff " )) {
175
132
diff_is_binary = 0 ;
@@ -216,20 +173,17 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result,
216
173
return patchlen ;
217
174
}
218
175
219
- static void generate_id_list (unsigned flags )
176
+ static void generate_id_list (int stable , int verbatim )
220
177
{
221
178
struct object_id oid , n , result ;
222
179
int patchlen ;
223
180
struct strbuf line_buf = STRBUF_INIT ;
224
181
225
182
oidclr (& oid , the_repository -> hash_algo );
226
- flags |= GOPID_FIND_HEADER ;
227
183
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 );
231
186
oidcpy (& oid , & n );
232
- flags &= ~GOPID_FIND_HEADER ;
233
187
}
234
188
strbuf_release (& line_buf );
235
189
}
@@ -265,7 +219,6 @@ int cmd_patch_id(int argc, const char **argv, const char *prefix)
265
219
/* if nothing is set, default to unstable */
266
220
struct patch_id_opts config = {0 , 0 };
267
221
int opts = 0 ;
268
- unsigned flags = 0 ;
269
222
struct option builtin_patch_id_options [] = {
270
223
OPT_CMDMODE (0 , "unstable" , & opts ,
271
224
N_ ("use the unstable patch-id algorithm" ), 1 ),
@@ -297,11 +250,7 @@ int cmd_patch_id(int argc, const char **argv, const char *prefix)
297
250
if (!the_hash_algo )
298
251
repo_set_hash_algo (the_repository , GIT_HASH_SHA1 );
299
252
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 );
306
255
return 0 ;
307
256
}
0 commit comments