@@ -164,12 +164,13 @@
164 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** zFile2. The content of pFile1 is in memory. zFile2 exists on disk.
165 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
166 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If fSwapDiff is 1, show the set of edits to transform zFile2 into pFile1
167 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** instead of the opposite.
168 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Use the internal diff logic if zDiffCmd is NULL. Otherwise call the
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** command zDiffCmd to do the diffing.
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the internal diff logic if nDiffCmdValues is 0. Otherwise pass the
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** command and args in azDiffCmd along with a pair of file names to
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fossil_spawn() to do the diffing externally.
171 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
172 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When using an external diff program, zBinGlob contains the GLOB patterns
173 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for file names to treat as binary. If fIncludeBinary is zero, these files
174 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will be skipped in addition to files that may contain binary content.
175 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -176,18 +177,19 @@
176 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void diff_file(
177 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *pFile1, /* In memory content to compare from */
178 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isBin1, /* Does the 'from' content appear to be binary */
179 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFile2, /* On disk content to compare to */
180 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName, /* Display name of the file */
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zDiffCmd, /* Command for comparison */
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *azDiffCmd[], /* External diff cmd and optional args */
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t nDiffCmdValues, /* Elements in azDiffCmd; 0 for internal */
182 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zBinGlob, /* Treat file names matching this as binary */
183 185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fIncludeBinary, /* Include binary files for external diff */
184 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlags, /* Flags to control the diff */
185 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fSwapDiff, /* Diff from Zfile2 to Pfile1 */
186 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *diffBlob /* Blob to store diff output */
187 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zDiffCmd==0 ){
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nDiffCmdValues==0 ){
189 191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob out; /* Diff output text */
190 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob file2; /* Content of zFile2 */
191 193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName2; /* Name of zFile2 for display */
192 194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
193 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Read content of zFile2 into memory */
@@ -232,12 +234,13 @@
232 234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
233 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
234 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Release memory resources */
235 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&file2);
236 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t n;
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char **azFullDiffCmd;
237 241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob nameFile1; /* Name of temporary file to old pFile1 content */
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob cmd; /* Text of command to run */
239 242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
240 243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !fIncludeBinary ){
241 244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob file2;
242 245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isBin1 ){
243 246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY);
@@ -267,39 +270,90 @@
267 270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Construct a temporary file to hold pFile1 based on the name of
268 271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** zFile2 */
269 272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_tempname(&nameFile1, zFile2, "orig");
270 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_write_to_file(pFile1, blob_str(&nameFile1));
271 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Construct the external diff command */
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&cmd);
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(&cmd, zDiffCmd, -1);
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fSwapDiff ){
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_escaped_arg(&cmd, zFile2);
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_escaped_arg(&cmd, blob_str(&nameFile1));
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nDiffCmdValues==1 ) {
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* With only one element in the command array, take the legacy
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * path, constructing a shell command string to do the external
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * diff. This works for many cases, but because of the risk
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * of double shell interpretation of quotes, spaces, escape
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * characters, and such, we have to run this command string
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * through a number of prophylactic wrappers around system(3)
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * which can cause problems, as when doing diffs on file names
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * that legitimately contain spaces, quotes, etc.
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob cmd; /* Text of command to run */
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&cmd);
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&cmd, azDiffCmd[0], -1);
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fSwapDiff ){
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_escaped_arg(&cmd, zFile2);
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_escaped_arg(&cmd, blob_str(&nameFile1));
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_escaped_arg(&cmd, blob_str(&nameFile1));
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_escaped_arg(&cmd, zFile2);
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Run the external diff command */
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_system(blob_str(&cmd));
278 298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_escaped_arg(&cmd, blob_str(&nameFile1));
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_escaped_arg(&cmd, zFile2);
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Construct an argv style array to do the external diff.
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * This may look more complex, but it bypasses all of the
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * stuff we have to wrap around system(3) because we get a
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * direct binding of our argv[] to the callee's main(argv)
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * on POSIX systems, entirely avoiding the class of double
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * shell interpretation risks. (Windows's API flattens argv,
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * neutering some of this mechanism's benefits, but not all.)
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * Due to the legacy of existing settings, we can't assume
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * it's safe to take this path when the setting is a single
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * string value, since that gets converted to a 1-element
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * array by db_get_array(). Fortunately, most diff type
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * programs offer and benefit from option flags, so you
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * should be able to upgrade to this method by re-applying
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * your settings, making use of the new array storage option:
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * $ fossil set diff-command colordiff -wu
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * as opposed to the legacy method:
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * $ fossil set diff-command 'colordiff -wu'
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * The lack of quoting around those two setting values causes
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * Fossil to store them as an array, which lands you in here.
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd = fossil_malloc((nDiffCmdValues+3)*sizeof(char*));
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( n=0; n<nDiffCmdValues; ++n ) azFullDiffCmd[n] = azDiffCmd[n];
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fSwapDiff ){
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd[n++] = zFile2;
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd[n++] = blob_str(&nameFile1);
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd[n++] = blob_str(&nameFile1);
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd[n++] = zFile2;
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd[n] = 0;
282 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Run the external diff command */
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_system(blob_str(&cmd));
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Run the external diff command */
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_spawn(azFullDiffCmd[0], (char*const*)azFullDiffCmd);
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
285 339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
286 340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Delete the temporary file and clean up memory used */
287 341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_delete(blob_str(&nameFile1));
288 342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&nameFile1);
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&cmd);
290 343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
291 344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
292 345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
293 346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
294 347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Show the difference between two files, both in memory.
295 348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
296 349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The difference is the set of edits needed to transform pFile1 into
297 350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pFile2.
298 351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Use the internal diff logic if zDiffCmd is NULL. Otherwise call the
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** command zDiffCmd to do the diffing.
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the internal diff logic if nDiffCmdValues is 0. Otherwise pass the
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** command and args in azDiffCmd along with a pair of file names to
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fossil_spawn() to do the diffing externally.
301 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
302 356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When using an external diff program, zBinGlob contains the GLOB patterns
303 357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for file names to treat as binary. If fIncludeBinary is zero, these files
304 358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will be skipped in addition to files that may contain binary content.
305 359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -307,17 +361,18 @@
307 361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *pFile1, /* In memory content to compare from */
308 362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *pFile2, /* In memory content to compare to */
309 363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isBin1, /* Does the 'from' content appear to be binary */
310 364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isBin2, /* Does the 'to' content appear to be binary */
311 365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName, /* Display name of the file */
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zDiffCmd, /* Command for comparison */
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *azDiffCmd[], /* External diff cmd and optional args */
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t nDiffCmdValues, /* Elements in azDiffCmd; 0 for internal */
313 368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zBinGlob, /* Treat file names matching this as binary */
314 369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fIncludeBinary, /* Include binary files for external diff */
315 370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlags /* Diff flags */
316 371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
317 372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( diffFlags & DIFF_BRIEF ) return;
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zDiffCmd==0 ){
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nDiffCmdValues==0 ){
319 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob out; /* Diff output text */
320 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
321 376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&out);
322 377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
text_diff(pFile1, pFile2, &out, 0, diffFlags);
323 378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( diffFlags & DIFF_NUMSTAT ){
@@ -328,11 +383,12 @@
328 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
329 384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
330 385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Release memory resources */
331 386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&out);
332 387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob cmd;
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t n;
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char** azFullDiffCmd;
334 390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob temp1;
335 391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob temp2;
336 392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
337 393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !fIncludeBinary ){
338 394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isBin1 || isBin2 ){
@@ -354,44 +410,58 @@
354 410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_tempname(&temp1, zName, "before");
355 411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_tempname(&temp2, zName, "after");
356 412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_write_to_file(pFile1, blob_str(&temp1));
357 413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_write_to_file(pFile2, blob_str(&temp2));
358 414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Construct the external diff command */
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&cmd);
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(&cmd, zDiffCmd, -1);
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_escaped_arg(&cmd, blob_str(&temp1));
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_escaped_arg(&cmd, blob_str(&temp2));
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Run the external diff command */
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_system(blob_str(&cmd));
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nDiffCmdValues==1 ) {
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Legacy system(3) wrapper method; see diff_file for details. */
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob cmd; /* Text of command to run */
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&cmd);
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&cmd, azDiffCmd[0], -1);
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_escaped_arg(&cmd, blob_str(&temp1));
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_escaped_arg(&cmd, blob_str(&temp2));
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Run the external diff command */
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_system(blob_str(&cmd));
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Safer argv[] passing method; see diff_file for details. */
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd = fossil_malloc((nDiffCmdValues+3)*sizeof(char*));
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( n=0; n<nDiffCmdValues; ++n ) azFullDiffCmd[n] = azDiffCmd[n];
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd[n++] = blob_str(&temp1);
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd[n++] = blob_str(&temp2);
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azFullDiffCmd[n] = 0;
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Run the external diff command */
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_spawn(azFullDiffCmd[0], (char*const*)azFullDiffCmd);
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
367 436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
368 437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Delete the temporary file and clean up memory used */
369 438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_delete(blob_str(&temp1));
370 439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
file_delete(blob_str(&temp2));
371 440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
372 441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&temp1);
373 442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&temp2);
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&cmd);
375 443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
376 444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
377 445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
378 446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
379 447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Run a diff between the version zFrom and files on disk. zFrom might
380 448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be NULL which means to simply show the difference between the edited
381 449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** files on disk and the check-out on which they are based.
382 450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Use the internal diff logic if zDiffCmd is NULL. Otherwise call the
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** command zDiffCmd to do the diffing.
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the internal diff logic if nDiffCmdValues is 0. Otherwise pass the
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** command and args in azDiffCmd along with a pair of file names to
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fossil_spawn() to do the diffing externally.
385 454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
386 455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When using an external diff program, zBinGlob contains the GLOB patterns
387 456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for file names to treat as binary. If fIncludeBinary is zero, these files
388 457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will be skipped in addition to files that may contain binary content.
389 458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
390 459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void diff_against_disk(
391 460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFrom, /* Version to difference from */
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zDiffCmd, /* Use this diff command. NULL for built-in */
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *azDiffCmd[], /* External diff cmd and optional args */
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t nDiffCmdValues, /* Elements in azDiffCmd; 0 for internal */
393 463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zBinGlob, /* Treat file names matching this as binary */
394 464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fIncludeBinary, /* Treat file names matching this as binary */
395 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlags, /* Flags controlling diff output */
396 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FileDirList *pFileDir, /* Which files to diff */
397 467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *diffBlob /* Blob to output diff instead of stdout */
@@ -499,11 +569,11 @@
499 569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
500 570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&content);
501 571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
502 572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isBin = fIncludeBinary ? 0 : looks_like_binary(&content);
503 573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
diff_print_index(zPathname, diffFlags, diffBlob);
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- diff_file(&content, isBin, zFullName, zPathname, zDiffCmd,
574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_file(&content, isBin, zFullName, zPathname, azDiffCmd, nDiffCmdValues,
505 575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBinGlob, fIncludeBinary, diffFlags, 0, diffBlob);
506 576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&content);
507 577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
508 578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&fname);
509 579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -512,19 +582,21 @@
512 582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
513 583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
514 584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
515 585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Run a diff between the undo buffer and files on disk.
516 586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Use the internal diff logic if zDiffCmd is NULL. Otherwise call the
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** command zDiffCmd to do the diffing.
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the internal diff logic if nDiffCmdValues is 0. Otherwise pass the
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** command and args in azDiffCmd along with a pair of file names to
589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fossil_spawn() to do the diffing externally.
519 590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
520 591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When using an external diff program, zBinGlob contains the GLOB patterns
521 592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for file names to treat as binary. If fIncludeBinary is zero, these files
522 593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will be skipped in addition to files that may contain binary content.
523 594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
524 595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void diff_against_undo(
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zDiffCmd, /* Use this diff command. NULL for built-in */
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *azDiffCmd[], /* External diff cmd and optional args */
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t nDiffCmdValues, /* Elements in azDiffCmd; 0 for internal */
526 598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zBinGlob, /* Treat file names matching this as binary */
527 599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fIncludeBinary, /* Treat file names matching this as binary */
528 600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlags, /* Flags controlling diff output */
529 601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FileDirList *pFileDir /* List of files and directories to diff */
530 602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
@@ -537,11 +609,11 @@
537 609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFile = (const char*)db_column_text(&q, 0);
538 610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !file_dir_match(pFileDir, zFile) ) continue;
539 611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zFullName = mprintf("%s%s", g.zLocalRoot, zFile);
540 612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_column_blob(&q, 1, &content);
541 613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
diff_file(&content, 0, zFullName, zFile,
542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zDiffCmd, zBinGlob, fIncludeBinary, diffFlags, 0, 0);
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azDiffCmd, nDiffCmdValues, zBinGlob, fIncludeBinary, diffFlags, 0, 0);
543 615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zFullName);
544 616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&content);
545 617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
546 618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
547 619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -548,21 +620,23 @@
548 620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
549 621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
550 622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Show the difference between two files identified by ManifestFile
551 623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** entries.
552 624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Use the internal diff logic if zDiffCmd is NULL. Otherwise call the
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** command zDiffCmd to do the diffing.
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the internal diff logic if nDiffCmdValues is 0. Otherwise pass the
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** command and args in azDiffCmd along with a pair of file names to
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fossil_spawn() to do the diffing externally.
555 628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
556 629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When using an external diff program, zBinGlob contains the GLOB patterns
557 630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for file names to treat as binary. If fIncludeBinary is zero, these files
558 631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will be skipped in addition to files that may contain binary content.
559 632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
560 633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void diff_manifest_entry(
561 634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct ManifestFile *pFrom,
562 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct ManifestFile *pTo,
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zDiffCmd,
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char * azDiffCmd[],
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t nDiffCmdValues,
564 638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zBinGlob,
565 639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fIncludeBinary,
566 640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlags
567 641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
568 642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob f1, f2;
@@ -590,30 +664,32 @@
590 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
591 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&f2);
592 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
593 667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isBin1 = fIncludeBinary ? 0 : looks_like_binary(&f1);
594 668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isBin2 = fIncludeBinary ? 0 : looks_like_binary(&f2);
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- diff_file_mem(&f1, &f2, isBin1, isBin2, zName, zDiffCmd,
669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_file_mem(&f1, &f2, isBin1, isBin2, zName, azDiffCmd, nDiffCmdValues,
596 670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBinGlob, fIncludeBinary, diffFlags);
597 671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&f1);
598 672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&f2);
599 673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
600 674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
601 675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
602 676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Output the differences between two check-ins.
603 677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Use the internal diff logic if zDiffCmd is NULL. Otherwise call the
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** command zDiffCmd to do the diffing.
678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the internal diff logic if nDiffCmdValues is 0. Otherwise pass the
679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** command and args in azDiffCmd along with a pair of file names to
680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fossil_spawn() to do the diffing externally.
606 681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
607 682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When using an external diff program, zBinGlob contains the GLOB patterns
608 683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for file names to treat as binary. If fIncludeBinary is zero, these files
609 684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will be skipped in addition to files that may contain binary content.
610 685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
611 686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void diff_two_versions(
612 687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFrom,
613 688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTo,
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zDiffCmd,
689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *azDiffCmd[],
690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t nDiffCmdValues,
615 691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zBinGlob,
616 692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fIncludeBinary,
617 693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlags,
618 694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FileDirList *pFileDir
619 695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
@@ -641,11 +717,11 @@
641 717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( file_dir_match(pFileDir, pFromFile->zName) ){
642 718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (diffFlags & DIFF_NUMSTAT)==0 ){
643 719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("DELETED %s\n", pFromFile->zName);
644 720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
645 721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( asNewFlag ){
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- diff_manifest_entry(pFromFile, 0, zDiffCmd, zBinGlob,
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_manifest_entry(pFromFile, 0, azDiffCmd, nDiffCmdValues, zBinGlob,
647 723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fIncludeBinary, diffFlags);
648 724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
649 725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
650 726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFromFile = manifest_file_next(pFrom,0);
651 727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( cmp>0 ){
@@ -652,11 +728,11 @@
652 728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( file_dir_match(pFileDir, pToFile->zName) ){
653 729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (diffFlags & DIFF_NUMSTAT)==0 ){
654 730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("ADDED %s\n", pToFile->zName);
655 731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
656 732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( asNewFlag ){
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- diff_manifest_entry(0, pToFile, zDiffCmd, zBinGlob,
733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_manifest_entry(0, pToFile, azDiffCmd, nDiffCmdValues, zBinGlob,
658 734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fIncludeBinary, diffFlags);
659 735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
660 736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
661 737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pToFile = manifest_file_next(pTo,0);
662 738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( fossil_strcmp(pFromFile->zUuid, pToFile->zUuid)==0 ){
@@ -667,11 +743,11 @@
667 743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
668 744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( file_dir_match(pFileDir, pToFile->zName) ){
669 745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( diffFlags & DIFF_BRIEF ){
670 746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("CHANGED %s\n", pFromFile->zName);
671 747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- diff_manifest_entry(pFromFile, pToFile, zDiffCmd, zBinGlob,
748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_manifest_entry(pFromFile, pToFile, azDiffCmd, nDiffCmdValues, zBinGlob,
673 749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fIncludeBinary, diffFlags);
674 750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
675 751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
676 752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFromFile = manifest_file_next(pFrom,0);
677 753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pToFile = manifest_file_next(pTo,0);
@@ -683,26 +759,26 @@
683 759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
684 760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
685 761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the name of the external diff command, or return NULL if
686 762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** no external diff command is defined.
687 763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *diff_command_external(int guiDiff){
764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char ** diff_command_external(size_t *pnValues, int guiDiff){
689 765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zDefault;
690 766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName;
691 767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
692 768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( guiDiff ){
693 769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(_WIN32)
694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zDefault = "WinDiff.exe";
770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDefault = "[\"WinDiff.exe\"]";
695 771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
696 772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zDefault = 0;
697 773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
698 774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName = "gdiff-command";
699 775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
700 776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zDefault = 0;
701 777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName = "diff-command";
702 778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return db_get(zName, zDefault);
779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return db_get_array(pnValues, zName, zDefault);
704 780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
705 781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
706 782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
707 783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Show diff output in a Tcl/Tk window, in response to the --tk option
708 784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to the diff command.
@@ -870,11 +946,12 @@
870 946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int verboseFlag; /* True if -v or --verbose flag is used */
871 947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFrom; /* Source version number */
872 948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTo; /* Target version number */
873 949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCheckin; /* Check-in version number */
874 950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zBranch; /* Branch to diff */
875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zDiffCmd = 0; /* External diff command. NULL for internal diff */
951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char **azDiffCmd; /* External diff cmd and optional args */
952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ size_t nDiffCmdValues = 0; /* Number of elements in azDiffCmd; 0 for internal */
876 953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zBinGlob = 0; /* Treat file names matching this as binary */
877 954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fIncludeBinary = 0; /* Include binary files for external diff */
878 955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int againstUndo = 0; /* Diff against files in the undo buffer */
879 956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u64 diffFlags = 0; /* Flags to control the DIFF */
880 957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FileDirList *pFileDir = 0; /* Restrict the diff to these files */
@@ -917,12 +994,19 @@
917 994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_fatal("must use --from if --to is present");
918 995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
919 996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_find_and_open_repository(0, 0);
920 997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
921 998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !isInternDiff ){
922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zDiffCmd = find_option("command", 0, 1);
923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zDiffCmd==0 ) zDiffCmd = diff_command_external(isGDiff);
999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zDiffCmd = find_option("command", 0, 1);
1000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zDiffCmd ){
1001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azDiffCmd = malloc(2*sizeof(char*));
1002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azDiffCmd[0] = zDiffCmd;
1003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azDiffCmd[1] = 0;
1004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDiffCmdValues = 1;
1005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
1006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azDiffCmd = diff_command_external(&nDiffCmdValues, isGDiff);
1007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
924 1008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
925 1009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBinGlob = diff_get_binary_glob();
926 1010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fIncludeBinary = diff_include_binary_files();
927 1011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
determine_exec_relative_option(1);
928 1012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
verify_all_options();
@@ -958,17 +1042,17 @@
958 1042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( againstUndo ){
959 1043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db_lget_int("undo_available",0)==0 ){
960 1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("No undo or redo is available\n");
961 1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
962 1046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- diff_against_undo(zDiffCmd, zBinGlob, fIncludeBinary,
1047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_against_undo(azDiffCmd, nDiffCmdValues, zBinGlob, fIncludeBinary,
964 1048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
diffFlags, pFileDir);
965 1049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( zTo==0 ){
966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- diff_against_disk(zFrom, zDiffCmd, zBinGlob, fIncludeBinary,
1050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_against_disk(zFrom, azDiffCmd, nDiffCmdValues, zBinGlob, fIncludeBinary,
967 1051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
diffFlags, pFileDir, 0);
968 1052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- diff_two_versions(zFrom, zTo, zDiffCmd, zBinGlob, fIncludeBinary,
1053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_two_versions(zFrom, zTo, azDiffCmd, nDiffCmdValues, zBinGlob, fIncludeBinary,
970 1054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
diffFlags, pFileDir);
971 1055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
972 1056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFileDir ){
973 1057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
974 1058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; pFileDir[i].zName; i++){
@@ -1000,7 +1084,7 @@
1000 1084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
1001 1085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
1002 1086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zFrom==0 || zTo==0 ) fossil_redirect_home();
1003 1087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1004 1088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cgi_set_content_type("text/plain");
1005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- diff_two_versions(zFrom, zTo, 0, 0, 0, DIFF_VERBOSE, 0);
1089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ diff_two_versions(zFrom, zTo, 0, 0, 0, 0, DIFF_VERBOSE, 0);
1006 1090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1007 1091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!