Fossil SCM
Provide more options on the "2-way diff" drop-down menu on the "fossil merge-info --tk" GUI.
Commit
90742e4c7ecceac8b40ade80f4c94ebd375682bad854e881f5733bd37a7ea137
Parent
51267fb4c372a65…
2 files changed
+102
-27
+6
-3
+102
-27
| --- src/merge.c | ||
| +++ src/merge.c | ||
| @@ -143,20 +143,31 @@ | ||
| 143 | 143 | ** The diffMode variable has these values: |
| 144 | 144 | ** |
| 145 | 145 | ** 0 Standard 3-way diff |
| 146 | 146 | ** 12 2-way diff between baseline and local |
| 147 | 147 | ** 13 2-way diff between baseline and merge-in |
| 148 | +** 14 2-way diff from baseline to checkout | |
| 148 | 149 | ** 23 2-way diff between local and merge-in |
| 150 | +** 24 2-way diff from local to checkout | |
| 151 | +** 34 2-way diff from merge-in to checkout | |
| 152 | +** | |
| 153 | +** For non-zero values of diffMode the two digits represent the left | |
| 154 | +** and right content for a two-way merge, with these meanings: | |
| 155 | +** | |
| 156 | +** 1 The baseline or pivot of the 3-way (baseline) | |
| 157 | +** 2 The local value of the file prior to merge (local) | |
| 158 | +** 3 The file content being merged in (merge-in) | |
| 159 | +** 4 The file content currently in the checkout (current) | |
| 149 | 160 | */ |
| 150 | 161 | static void merge_info_tcl(const char *zFName, int nContext, int diffMode){ |
| 151 | - const char *zTreename;/* Name of the file in the tree */ | |
| 152 | - Stmt q; /* To query the MERGESTAT table */ | |
| 153 | - MergeBuilder mb; /* The merge builder object */ | |
| 154 | - Blob pivot,v1,v2,out; /* Blobs for holding content */ | |
| 155 | - const char *zFN; /* A filename */ | |
| 156 | - int rid; /* RID value */ | |
| 157 | - int sz; /* File size value */ | |
| 162 | + const char *zTreename; /* Name of the file in the tree */ | |
| 163 | + Stmt q; /* To query the MERGESTAT table */ | |
| 164 | + MergeBuilder mb; /* The merge builder object */ | |
| 165 | + Blob pivot,v1,v2,cx,out; /* Blobs for holding content */ | |
| 166 | + const char *zFN; /* A filename */ | |
| 167 | + int rid; /* RID value */ | |
| 168 | + int sz; /* File size value */ | |
| 158 | 169 | |
| 159 | 170 | zTreename = zFName; |
| 160 | 171 | db_prepare(&q, |
| 161 | 172 | /* 0 1 2 3 4 5 6 7 */ |
| 162 | 173 | "SELECT fnp, ridp, fn, ridv, sz, fnm, ridm, fnr" |
| @@ -171,12 +182,12 @@ | ||
| 171 | 182 | } |
| 172 | 183 | mergebuilder_init_tcl(&mb); |
| 173 | 184 | mb.nContext = nContext; |
| 174 | 185 | |
| 175 | 186 | blob_zero(&pivot); |
| 176 | - if( diffMode!=23 ){ | |
| 177 | - /* Set up the pivot or baseline */ | |
| 187 | + if( diffMode<=14 ){ | |
| 188 | + /* For modes 0, 12, 13, and 14, load the baseline content in pivot */ | |
| 178 | 189 | zFN = db_column_text(&q, 0); |
| 179 | 190 | if( zFN==0 ){ |
| 180 | 191 | /* No pivot because the file was added */ |
| 181 | 192 | mb.zPivot = "(no baseline)"; |
| 182 | 193 | }else{ |
| @@ -183,15 +194,30 @@ | ||
| 183 | 194 | mb.zPivot = mprintf("%s (baseline)", file_tail(zFN)); |
| 184 | 195 | rid = db_column_int(&q, 1); |
| 185 | 196 | content_get(rid, &pivot); |
| 186 | 197 | } |
| 187 | 198 | mb.pPivot = &pivot; |
| 199 | + }else{ | |
| 200 | + /* for modes 23, 24, and 34, pivot is not used */ | |
| 201 | + } | |
| 202 | + | |
| 203 | + blob_zero(&cx); | |
| 204 | + if( (diffMode % 10)==4 ){ | |
| 205 | + /* For modes 14, 24, and 34, read current value of the file from | |
| 206 | + ** disk into out. */ | |
| 207 | + char *zFile; | |
| 208 | + zFN = db_column_text(&q, 7); | |
| 209 | + zFile = mprintf("%s%s", g.zLocalRoot, zFN); | |
| 210 | + blob_read_from_file(&cx, zFile, ExtFILE); | |
| 211 | + fossil_free(zFile); | |
| 212 | + }else{ | |
| 213 | + /* cx is uninitialized for modes 0, 12, 13, and 23. */ | |
| 188 | 214 | } |
| 189 | 215 | |
| 190 | 216 | blob_zero(&v2); |
| 191 | - if( diffMode!=12 ){ | |
| 192 | - /* Set up the merge-in as V2 */ | |
| 217 | + if( diffMode==0 || diffMode==34 || (diffMode % 10)==3 ){ | |
| 218 | + /* For modes 0, 13, 23, and 34 read the merge-in content into v2 */ | |
| 193 | 219 | zFN = db_column_text(&q, 5); |
| 194 | 220 | if( zFN==0 ){ |
| 195 | 221 | /* File deleted in the merged-in branch */ |
| 196 | 222 | mb.zV2 = "(deleted file)"; |
| 197 | 223 | }else{ |
| @@ -198,15 +224,17 @@ | ||
| 198 | 224 | mb.zV2 = mprintf("%s (merge-in)", file_tail(zFN)); |
| 199 | 225 | rid = db_column_int(&q, 6); |
| 200 | 226 | content_get(rid, &v2); |
| 201 | 227 | } |
| 202 | 228 | mb.pV2 = &v2; |
| 229 | + }else{ | |
| 230 | + /* v2 is uninitialized for modes 12, 14, and 24 */ | |
| 203 | 231 | } |
| 204 | 232 | |
| 205 | 233 | blob_zero(&v1); |
| 206 | - if( diffMode!=13 ){ | |
| 207 | - /* Set up the local content as V1 */ | |
| 234 | + if( diffMode==0 || diffMode==12 || (diffMode/10)==2 ){ | |
| 235 | + /* For modes 0, 12, 23, and 24, read the local content into v1 */ | |
| 208 | 236 | zFN = db_column_text(&q, 2); |
| 209 | 237 | if( zFN==0 ){ |
| 210 | 238 | /* File added by merge */ |
| 211 | 239 | mb.zV1 = "(no original)"; |
| 212 | 240 | }else{ |
| @@ -233,12 +261,25 @@ | ||
| 233 | 261 | /* The origin file was unchanged when the merge first occurred */ |
| 234 | 262 | content_get(rid, &v1); |
| 235 | 263 | } |
| 236 | 264 | } |
| 237 | 265 | mb.pV1 = &v1; |
| 266 | + }else{ | |
| 267 | + /* v1 is uninitialized for modes 12, 13, and 14 */ | |
| 238 | 268 | } |
| 239 | 269 | |
| 270 | + /* For two-way merges, here is where content is loaded | |
| 271 | + ** | |
| 272 | + ** left right description | |
| 273 | + ** ----- ----- --------------------------- | |
| 274 | + ** 12 pivot v1 baseline vs local | |
| 275 | + ** 13 pivot v2 baseline vs merge-in | |
| 276 | + ** 14 pivot cx baseline vs current | |
| 277 | + ** 23 v1 v2 local vs merge-in | |
| 278 | + ** 24 v1 cx local vs current | |
| 279 | + ** 34 v2 cx merge-in vs current | |
| 280 | + */ | |
| 240 | 281 | blob_zero(&out); |
| 241 | 282 | if( diffMode==0 ){ |
| 242 | 283 | /* Set up the output and do a 3-way diff */ |
| 243 | 284 | zFN = db_column_text(&q, 7); |
| 244 | 285 | if( zFN==0 ){ |
| @@ -254,37 +295,59 @@ | ||
| 254 | 295 | const char *zTagLeft, *zTagRight; |
| 255 | 296 | DiffConfig cfg; |
| 256 | 297 | memset(&cfg, 0, sizeof(cfg)); |
| 257 | 298 | cfg.diffFlags = DIFF_TCL; |
| 258 | 299 | cfg.nContext = mb.nContext; |
| 259 | - if( diffMode==12 || diffMode==13 ){ | |
| 260 | - pLeft = &pivot; | |
| 261 | - zTagLeft = "baseline"; | |
| 262 | - }else{ | |
| 263 | - pLeft = &v1; | |
| 264 | - zTagLeft = "local"; | |
| 265 | - } | |
| 266 | - if( diffMode==12 ){ | |
| 267 | - pRight = &v1; | |
| 268 | - zTagRight = "local"; | |
| 269 | - }else{ | |
| 270 | - pRight = &v2; | |
| 271 | - zTagRight = "merge-in"; | |
| 300 | + switch( diffMode/10 ){ | |
| 301 | + case 1: { | |
| 302 | + pLeft = &pivot; | |
| 303 | + zTagLeft = "baseline"; | |
| 304 | + break; | |
| 305 | + } | |
| 306 | + case 2: { | |
| 307 | + pLeft = &v1; | |
| 308 | + zTagLeft = "local"; | |
| 309 | + break; | |
| 310 | + } | |
| 311 | + default: | |
| 312 | + case 3: { | |
| 313 | + pLeft = &v2; | |
| 314 | + zTagLeft = "merge-in"; | |
| 315 | + break; | |
| 316 | + } | |
| 317 | + } | |
| 318 | + switch( diffMode % 10 ){ | |
| 319 | + case 2: { | |
| 320 | + pRight = &v1; | |
| 321 | + zTagRight = "local"; | |
| 322 | + break; | |
| 323 | + } | |
| 324 | + case 3: { | |
| 325 | + pRight = &v2; | |
| 326 | + zTagRight = "merge-in"; | |
| 327 | + break; | |
| 328 | + } | |
| 329 | + default: | |
| 330 | + case 4: { | |
| 331 | + pRight = &cx; | |
| 332 | + zTagRight = "current"; | |
| 333 | + break; | |
| 334 | + } | |
| 272 | 335 | } |
| 273 | 336 | cfg.azLabel[0] = mprintf("%s (%s)", zFName, zTagLeft); |
| 274 | 337 | cfg.azLabel[1] = mprintf("%s (%s)", zFName, zTagRight); |
| 275 | 338 | diff_print_filenames("", "", &cfg, &out); |
| 276 | 339 | text_diff(pLeft, pRight, &out, &cfg); |
| 277 | 340 | fossil_free((char*)cfg.azLabel[0]); |
| 278 | 341 | fossil_free((char*)cfg.azLabel[1]); |
| 279 | 342 | } |
| 280 | - | |
| 281 | 343 | blob_write_to_file(&out, "-"); |
| 282 | 344 | mb.xDestroy(&mb); |
| 283 | 345 | blob_reset(&pivot); |
| 284 | 346 | blob_reset(&v1); |
| 285 | 347 | blob_reset(&v2); |
| 348 | + blob_reset(&cx); | |
| 286 | 349 | blob_reset(&out); |
| 287 | 350 | db_finalize(&q); |
| 288 | 351 | } |
| 289 | 352 | |
| 290 | 353 | /* |
| @@ -308,11 +371,14 @@ | ||
| 308 | 371 | ** |
| 309 | 372 | ** Options used internally by --tk: |
| 310 | 373 | ** --diff12 FILE Bring up a separate --tk diff for just the baseline |
| 311 | 374 | ** and local variants of FILE. |
| 312 | 375 | ** --diff13 FILE Like --diff12 but for baseline versus merge-in |
| 376 | +** --diff14 FILE Like --diff12 but for baseline versus current | |
| 313 | 377 | ** --diff23 FILE Like --diff12 but for local versus merge-in |
| 378 | +** --diff24 FILE Like --diff12 but for local versus current | |
| 379 | +** --diff34 FILE Like --diff12 but for merge-in versus current | |
| 314 | 380 | ** --tcl FILE Generate (to stdout) a TCL list containing |
| 315 | 381 | ** information needed to display the changes to |
| 316 | 382 | ** FILE caused by the most recent merge. FILE must |
| 317 | 383 | ** be a pathname relative to the root of the check-out. |
| 318 | 384 | ** |
| @@ -344,13 +410,22 @@ | ||
| 344 | 410 | if( (zDiff2 = find_option("diff12", 0, 1))!=0 ){ |
| 345 | 411 | diffMode = 12; |
| 346 | 412 | }else |
| 347 | 413 | if( (zDiff2 = find_option("diff13", 0, 1))!=0 ){ |
| 348 | 414 | diffMode = 13; |
| 415 | + }else | |
| 416 | + if( (zDiff2 = find_option("diff14", 0, 1))!=0 ){ | |
| 417 | + diffMode = 14; | |
| 349 | 418 | }else |
| 350 | 419 | if( (zDiff2 = find_option("diff23", 0, 1))!=0 ){ |
| 351 | 420 | diffMode = 23; |
| 421 | + }else | |
| 422 | + if( (zDiff2 = find_option("diff24", 0, 1))!=0 ){ | |
| 423 | + diffMode = 24; | |
| 424 | + }else | |
| 425 | + if( (zDiff2 = find_option("diff34", 0, 1))!=0 ){ | |
| 426 | + diffMode = 34; | |
| 352 | 427 | } |
| 353 | 428 | |
| 354 | 429 | if( zCnt ){ |
| 355 | 430 | nContext = atoi(zCnt); |
| 356 | 431 | if( nContext<0 ) nContext = 0xfffffff; |
| 357 | 432 |
| --- src/merge.c | |
| +++ src/merge.c | |
| @@ -143,20 +143,31 @@ | |
| 143 | ** The diffMode variable has these values: |
| 144 | ** |
| 145 | ** 0 Standard 3-way diff |
| 146 | ** 12 2-way diff between baseline and local |
| 147 | ** 13 2-way diff between baseline and merge-in |
| 148 | ** 23 2-way diff between local and merge-in |
| 149 | */ |
| 150 | static void merge_info_tcl(const char *zFName, int nContext, int diffMode){ |
| 151 | const char *zTreename;/* Name of the file in the tree */ |
| 152 | Stmt q; /* To query the MERGESTAT table */ |
| 153 | MergeBuilder mb; /* The merge builder object */ |
| 154 | Blob pivot,v1,v2,out; /* Blobs for holding content */ |
| 155 | const char *zFN; /* A filename */ |
| 156 | int rid; /* RID value */ |
| 157 | int sz; /* File size value */ |
| 158 | |
| 159 | zTreename = zFName; |
| 160 | db_prepare(&q, |
| 161 | /* 0 1 2 3 4 5 6 7 */ |
| 162 | "SELECT fnp, ridp, fn, ridv, sz, fnm, ridm, fnr" |
| @@ -171,12 +182,12 @@ | |
| 171 | } |
| 172 | mergebuilder_init_tcl(&mb); |
| 173 | mb.nContext = nContext; |
| 174 | |
| 175 | blob_zero(&pivot); |
| 176 | if( diffMode!=23 ){ |
| 177 | /* Set up the pivot or baseline */ |
| 178 | zFN = db_column_text(&q, 0); |
| 179 | if( zFN==0 ){ |
| 180 | /* No pivot because the file was added */ |
| 181 | mb.zPivot = "(no baseline)"; |
| 182 | }else{ |
| @@ -183,15 +194,30 @@ | |
| 183 | mb.zPivot = mprintf("%s (baseline)", file_tail(zFN)); |
| 184 | rid = db_column_int(&q, 1); |
| 185 | content_get(rid, &pivot); |
| 186 | } |
| 187 | mb.pPivot = &pivot; |
| 188 | } |
| 189 | |
| 190 | blob_zero(&v2); |
| 191 | if( diffMode!=12 ){ |
| 192 | /* Set up the merge-in as V2 */ |
| 193 | zFN = db_column_text(&q, 5); |
| 194 | if( zFN==0 ){ |
| 195 | /* File deleted in the merged-in branch */ |
| 196 | mb.zV2 = "(deleted file)"; |
| 197 | }else{ |
| @@ -198,15 +224,17 @@ | |
| 198 | mb.zV2 = mprintf("%s (merge-in)", file_tail(zFN)); |
| 199 | rid = db_column_int(&q, 6); |
| 200 | content_get(rid, &v2); |
| 201 | } |
| 202 | mb.pV2 = &v2; |
| 203 | } |
| 204 | |
| 205 | blob_zero(&v1); |
| 206 | if( diffMode!=13 ){ |
| 207 | /* Set up the local content as V1 */ |
| 208 | zFN = db_column_text(&q, 2); |
| 209 | if( zFN==0 ){ |
| 210 | /* File added by merge */ |
| 211 | mb.zV1 = "(no original)"; |
| 212 | }else{ |
| @@ -233,12 +261,25 @@ | |
| 233 | /* The origin file was unchanged when the merge first occurred */ |
| 234 | content_get(rid, &v1); |
| 235 | } |
| 236 | } |
| 237 | mb.pV1 = &v1; |
| 238 | } |
| 239 | |
| 240 | blob_zero(&out); |
| 241 | if( diffMode==0 ){ |
| 242 | /* Set up the output and do a 3-way diff */ |
| 243 | zFN = db_column_text(&q, 7); |
| 244 | if( zFN==0 ){ |
| @@ -254,37 +295,59 @@ | |
| 254 | const char *zTagLeft, *zTagRight; |
| 255 | DiffConfig cfg; |
| 256 | memset(&cfg, 0, sizeof(cfg)); |
| 257 | cfg.diffFlags = DIFF_TCL; |
| 258 | cfg.nContext = mb.nContext; |
| 259 | if( diffMode==12 || diffMode==13 ){ |
| 260 | pLeft = &pivot; |
| 261 | zTagLeft = "baseline"; |
| 262 | }else{ |
| 263 | pLeft = &v1; |
| 264 | zTagLeft = "local"; |
| 265 | } |
| 266 | if( diffMode==12 ){ |
| 267 | pRight = &v1; |
| 268 | zTagRight = "local"; |
| 269 | }else{ |
| 270 | pRight = &v2; |
| 271 | zTagRight = "merge-in"; |
| 272 | } |
| 273 | cfg.azLabel[0] = mprintf("%s (%s)", zFName, zTagLeft); |
| 274 | cfg.azLabel[1] = mprintf("%s (%s)", zFName, zTagRight); |
| 275 | diff_print_filenames("", "", &cfg, &out); |
| 276 | text_diff(pLeft, pRight, &out, &cfg); |
| 277 | fossil_free((char*)cfg.azLabel[0]); |
| 278 | fossil_free((char*)cfg.azLabel[1]); |
| 279 | } |
| 280 | |
| 281 | blob_write_to_file(&out, "-"); |
| 282 | mb.xDestroy(&mb); |
| 283 | blob_reset(&pivot); |
| 284 | blob_reset(&v1); |
| 285 | blob_reset(&v2); |
| 286 | blob_reset(&out); |
| 287 | db_finalize(&q); |
| 288 | } |
| 289 | |
| 290 | /* |
| @@ -308,11 +371,14 @@ | |
| 308 | ** |
| 309 | ** Options used internally by --tk: |
| 310 | ** --diff12 FILE Bring up a separate --tk diff for just the baseline |
| 311 | ** and local variants of FILE. |
| 312 | ** --diff13 FILE Like --diff12 but for baseline versus merge-in |
| 313 | ** --diff23 FILE Like --diff12 but for local versus merge-in |
| 314 | ** --tcl FILE Generate (to stdout) a TCL list containing |
| 315 | ** information needed to display the changes to |
| 316 | ** FILE caused by the most recent merge. FILE must |
| 317 | ** be a pathname relative to the root of the check-out. |
| 318 | ** |
| @@ -344,13 +410,22 @@ | |
| 344 | if( (zDiff2 = find_option("diff12", 0, 1))!=0 ){ |
| 345 | diffMode = 12; |
| 346 | }else |
| 347 | if( (zDiff2 = find_option("diff13", 0, 1))!=0 ){ |
| 348 | diffMode = 13; |
| 349 | }else |
| 350 | if( (zDiff2 = find_option("diff23", 0, 1))!=0 ){ |
| 351 | diffMode = 23; |
| 352 | } |
| 353 | |
| 354 | if( zCnt ){ |
| 355 | nContext = atoi(zCnt); |
| 356 | if( nContext<0 ) nContext = 0xfffffff; |
| 357 |
| --- src/merge.c | |
| +++ src/merge.c | |
| @@ -143,20 +143,31 @@ | |
| 143 | ** The diffMode variable has these values: |
| 144 | ** |
| 145 | ** 0 Standard 3-way diff |
| 146 | ** 12 2-way diff between baseline and local |
| 147 | ** 13 2-way diff between baseline and merge-in |
| 148 | ** 14 2-way diff from baseline to checkout |
| 149 | ** 23 2-way diff between local and merge-in |
| 150 | ** 24 2-way diff from local to checkout |
| 151 | ** 34 2-way diff from merge-in to checkout |
| 152 | ** |
| 153 | ** For non-zero values of diffMode the two digits represent the left |
| 154 | ** and right content for a two-way merge, with these meanings: |
| 155 | ** |
| 156 | ** 1 The baseline or pivot of the 3-way (baseline) |
| 157 | ** 2 The local value of the file prior to merge (local) |
| 158 | ** 3 The file content being merged in (merge-in) |
| 159 | ** 4 The file content currently in the checkout (current) |
| 160 | */ |
| 161 | static void merge_info_tcl(const char *zFName, int nContext, int diffMode){ |
| 162 | const char *zTreename; /* Name of the file in the tree */ |
| 163 | Stmt q; /* To query the MERGESTAT table */ |
| 164 | MergeBuilder mb; /* The merge builder object */ |
| 165 | Blob pivot,v1,v2,cx,out; /* Blobs for holding content */ |
| 166 | const char *zFN; /* A filename */ |
| 167 | int rid; /* RID value */ |
| 168 | int sz; /* File size value */ |
| 169 | |
| 170 | zTreename = zFName; |
| 171 | db_prepare(&q, |
| 172 | /* 0 1 2 3 4 5 6 7 */ |
| 173 | "SELECT fnp, ridp, fn, ridv, sz, fnm, ridm, fnr" |
| @@ -171,12 +182,12 @@ | |
| 182 | } |
| 183 | mergebuilder_init_tcl(&mb); |
| 184 | mb.nContext = nContext; |
| 185 | |
| 186 | blob_zero(&pivot); |
| 187 | if( diffMode<=14 ){ |
| 188 | /* For modes 0, 12, 13, and 14, load the baseline content in pivot */ |
| 189 | zFN = db_column_text(&q, 0); |
| 190 | if( zFN==0 ){ |
| 191 | /* No pivot because the file was added */ |
| 192 | mb.zPivot = "(no baseline)"; |
| 193 | }else{ |
| @@ -183,15 +194,30 @@ | |
| 194 | mb.zPivot = mprintf("%s (baseline)", file_tail(zFN)); |
| 195 | rid = db_column_int(&q, 1); |
| 196 | content_get(rid, &pivot); |
| 197 | } |
| 198 | mb.pPivot = &pivot; |
| 199 | }else{ |
| 200 | /* for modes 23, 24, and 34, pivot is not used */ |
| 201 | } |
| 202 | |
| 203 | blob_zero(&cx); |
| 204 | if( (diffMode % 10)==4 ){ |
| 205 | /* For modes 14, 24, and 34, read current value of the file from |
| 206 | ** disk into out. */ |
| 207 | char *zFile; |
| 208 | zFN = db_column_text(&q, 7); |
| 209 | zFile = mprintf("%s%s", g.zLocalRoot, zFN); |
| 210 | blob_read_from_file(&cx, zFile, ExtFILE); |
| 211 | fossil_free(zFile); |
| 212 | }else{ |
| 213 | /* cx is uninitialized for modes 0, 12, 13, and 23. */ |
| 214 | } |
| 215 | |
| 216 | blob_zero(&v2); |
| 217 | if( diffMode==0 || diffMode==34 || (diffMode % 10)==3 ){ |
| 218 | /* For modes 0, 13, 23, and 34 read the merge-in content into v2 */ |
| 219 | zFN = db_column_text(&q, 5); |
| 220 | if( zFN==0 ){ |
| 221 | /* File deleted in the merged-in branch */ |
| 222 | mb.zV2 = "(deleted file)"; |
| 223 | }else{ |
| @@ -198,15 +224,17 @@ | |
| 224 | mb.zV2 = mprintf("%s (merge-in)", file_tail(zFN)); |
| 225 | rid = db_column_int(&q, 6); |
| 226 | content_get(rid, &v2); |
| 227 | } |
| 228 | mb.pV2 = &v2; |
| 229 | }else{ |
| 230 | /* v2 is uninitialized for modes 12, 14, and 24 */ |
| 231 | } |
| 232 | |
| 233 | blob_zero(&v1); |
| 234 | if( diffMode==0 || diffMode==12 || (diffMode/10)==2 ){ |
| 235 | /* For modes 0, 12, 23, and 24, read the local content into v1 */ |
| 236 | zFN = db_column_text(&q, 2); |
| 237 | if( zFN==0 ){ |
| 238 | /* File added by merge */ |
| 239 | mb.zV1 = "(no original)"; |
| 240 | }else{ |
| @@ -233,12 +261,25 @@ | |
| 261 | /* The origin file was unchanged when the merge first occurred */ |
| 262 | content_get(rid, &v1); |
| 263 | } |
| 264 | } |
| 265 | mb.pV1 = &v1; |
| 266 | }else{ |
| 267 | /* v1 is uninitialized for modes 12, 13, and 14 */ |
| 268 | } |
| 269 | |
| 270 | /* For two-way merges, here is where content is loaded |
| 271 | ** |
| 272 | ** left right description |
| 273 | ** ----- ----- --------------------------- |
| 274 | ** 12 pivot v1 baseline vs local |
| 275 | ** 13 pivot v2 baseline vs merge-in |
| 276 | ** 14 pivot cx baseline vs current |
| 277 | ** 23 v1 v2 local vs merge-in |
| 278 | ** 24 v1 cx local vs current |
| 279 | ** 34 v2 cx merge-in vs current |
| 280 | */ |
| 281 | blob_zero(&out); |
| 282 | if( diffMode==0 ){ |
| 283 | /* Set up the output and do a 3-way diff */ |
| 284 | zFN = db_column_text(&q, 7); |
| 285 | if( zFN==0 ){ |
| @@ -254,37 +295,59 @@ | |
| 295 | const char *zTagLeft, *zTagRight; |
| 296 | DiffConfig cfg; |
| 297 | memset(&cfg, 0, sizeof(cfg)); |
| 298 | cfg.diffFlags = DIFF_TCL; |
| 299 | cfg.nContext = mb.nContext; |
| 300 | switch( diffMode/10 ){ |
| 301 | case 1: { |
| 302 | pLeft = &pivot; |
| 303 | zTagLeft = "baseline"; |
| 304 | break; |
| 305 | } |
| 306 | case 2: { |
| 307 | pLeft = &v1; |
| 308 | zTagLeft = "local"; |
| 309 | break; |
| 310 | } |
| 311 | default: |
| 312 | case 3: { |
| 313 | pLeft = &v2; |
| 314 | zTagLeft = "merge-in"; |
| 315 | break; |
| 316 | } |
| 317 | } |
| 318 | switch( diffMode % 10 ){ |
| 319 | case 2: { |
| 320 | pRight = &v1; |
| 321 | zTagRight = "local"; |
| 322 | break; |
| 323 | } |
| 324 | case 3: { |
| 325 | pRight = &v2; |
| 326 | zTagRight = "merge-in"; |
| 327 | break; |
| 328 | } |
| 329 | default: |
| 330 | case 4: { |
| 331 | pRight = &cx; |
| 332 | zTagRight = "current"; |
| 333 | break; |
| 334 | } |
| 335 | } |
| 336 | cfg.azLabel[0] = mprintf("%s (%s)", zFName, zTagLeft); |
| 337 | cfg.azLabel[1] = mprintf("%s (%s)", zFName, zTagRight); |
| 338 | diff_print_filenames("", "", &cfg, &out); |
| 339 | text_diff(pLeft, pRight, &out, &cfg); |
| 340 | fossil_free((char*)cfg.azLabel[0]); |
| 341 | fossil_free((char*)cfg.azLabel[1]); |
| 342 | } |
| 343 | blob_write_to_file(&out, "-"); |
| 344 | mb.xDestroy(&mb); |
| 345 | blob_reset(&pivot); |
| 346 | blob_reset(&v1); |
| 347 | blob_reset(&v2); |
| 348 | blob_reset(&cx); |
| 349 | blob_reset(&out); |
| 350 | db_finalize(&q); |
| 351 | } |
| 352 | |
| 353 | /* |
| @@ -308,11 +371,14 @@ | |
| 371 | ** |
| 372 | ** Options used internally by --tk: |
| 373 | ** --diff12 FILE Bring up a separate --tk diff for just the baseline |
| 374 | ** and local variants of FILE. |
| 375 | ** --diff13 FILE Like --diff12 but for baseline versus merge-in |
| 376 | ** --diff14 FILE Like --diff12 but for baseline versus current |
| 377 | ** --diff23 FILE Like --diff12 but for local versus merge-in |
| 378 | ** --diff24 FILE Like --diff12 but for local versus current |
| 379 | ** --diff34 FILE Like --diff12 but for merge-in versus current |
| 380 | ** --tcl FILE Generate (to stdout) a TCL list containing |
| 381 | ** information needed to display the changes to |
| 382 | ** FILE caused by the most recent merge. FILE must |
| 383 | ** be a pathname relative to the root of the check-out. |
| 384 | ** |
| @@ -344,13 +410,22 @@ | |
| 410 | if( (zDiff2 = find_option("diff12", 0, 1))!=0 ){ |
| 411 | diffMode = 12; |
| 412 | }else |
| 413 | if( (zDiff2 = find_option("diff13", 0, 1))!=0 ){ |
| 414 | diffMode = 13; |
| 415 | }else |
| 416 | if( (zDiff2 = find_option("diff14", 0, 1))!=0 ){ |
| 417 | diffMode = 14; |
| 418 | }else |
| 419 | if( (zDiff2 = find_option("diff23", 0, 1))!=0 ){ |
| 420 | diffMode = 23; |
| 421 | }else |
| 422 | if( (zDiff2 = find_option("diff24", 0, 1))!=0 ){ |
| 423 | diffMode = 24; |
| 424 | }else |
| 425 | if( (zDiff2 = find_option("diff34", 0, 1))!=0 ){ |
| 426 | diffMode = 34; |
| 427 | } |
| 428 | |
| 429 | if( zCnt ){ |
| 430 | nContext = atoi(zCnt); |
| 431 | if( nContext<0 ) nContext = 0xfffffff; |
| 432 |
+6
-3
| --- src/merge.tcl | ||
| +++ src/merge.tcl | ||
| @@ -348,13 +348,16 @@ | ||
| 348 | 348 | } |
| 349 | 349 | |
| 350 | 350 | frame .bb |
| 351 | 351 | ::ttk::menubutton .bb.diff2 -text {2-way diff} -menu .bb.diff2.m |
| 352 | 352 | menu .bb.diff2.m -tearoff 0 |
| 353 | -.bb.diff2.m add command -label {baseline vs. local} -command {two-way 12} | |
| 354 | -.bb.diff2.m add command -label {baseline vs. merge-in} -command {two-way 13} | |
| 355 | -.bb.diff2.m add command -label {local vs. merge-in} -command {two-way 23} | |
| 353 | +.bb.diff2.m add command -label {baseline vs local} -command {two-way 12} | |
| 354 | +.bb.diff2.m add command -label {baseline vs merge-in} -command {two-way 13} | |
| 355 | +.bb.diff2.m add command -label {baseline vs current} -command {two-way 14} | |
| 356 | +.bb.diff2.m add command -label {local vs merge-in} -command {two-way 23} | |
| 357 | +.bb.diff2.m add command -label {local vs current} -command {two-way 24} | |
| 358 | +.bb.diff2.m add command -label {merge-in vs current} -command {two-way 34} | |
| 356 | 359 | |
| 357 | 360 | # Bring up a separate two-way diff between a pair of columns |
| 358 | 361 | # the argument is one of: |
| 359 | 362 | # 12 Baseline versus Local |
| 360 | 363 | # 13 Baseline versus Merge-in |
| 361 | 364 |
| --- src/merge.tcl | |
| +++ src/merge.tcl | |
| @@ -348,13 +348,16 @@ | |
| 348 | } |
| 349 | |
| 350 | frame .bb |
| 351 | ::ttk::menubutton .bb.diff2 -text {2-way diff} -menu .bb.diff2.m |
| 352 | menu .bb.diff2.m -tearoff 0 |
| 353 | .bb.diff2.m add command -label {baseline vs. local} -command {two-way 12} |
| 354 | .bb.diff2.m add command -label {baseline vs. merge-in} -command {two-way 13} |
| 355 | .bb.diff2.m add command -label {local vs. merge-in} -command {two-way 23} |
| 356 | |
| 357 | # Bring up a separate two-way diff between a pair of columns |
| 358 | # the argument is one of: |
| 359 | # 12 Baseline versus Local |
| 360 | # 13 Baseline versus Merge-in |
| 361 |
| --- src/merge.tcl | |
| +++ src/merge.tcl | |
| @@ -348,13 +348,16 @@ | |
| 348 | } |
| 349 | |
| 350 | frame .bb |
| 351 | ::ttk::menubutton .bb.diff2 -text {2-way diff} -menu .bb.diff2.m |
| 352 | menu .bb.diff2.m -tearoff 0 |
| 353 | .bb.diff2.m add command -label {baseline vs local} -command {two-way 12} |
| 354 | .bb.diff2.m add command -label {baseline vs merge-in} -command {two-way 13} |
| 355 | .bb.diff2.m add command -label {baseline vs current} -command {two-way 14} |
| 356 | .bb.diff2.m add command -label {local vs merge-in} -command {two-way 23} |
| 357 | .bb.diff2.m add command -label {local vs current} -command {two-way 24} |
| 358 | .bb.diff2.m add command -label {merge-in vs current} -command {two-way 34} |
| 359 | |
| 360 | # Bring up a separate two-way diff between a pair of columns |
| 361 | # the argument is one of: |
| 362 | # 12 Baseline versus Local |
| 363 | # 13 Baseline versus Merge-in |
| 364 |