Fossil SCM
A proposed, but also unproven, patch for the git export parse_mark() issues discussed in [forum:906c248f2f79de41 | forum thread 906c248f2f].
Commit
076c8def287d53474f239f16c69c9d3214eff554ecb409d00b89597ae09c99ef
Parent
3f8d014f99cf91d…
1 file changed
+10
-9
+10
-9
| --- src/export.c | ||
| +++ src/export.c | ||
| @@ -307,16 +307,24 @@ | ||
| 307 | 307 | char type_; |
| 308 | 308 | cur_tok = strtok(line, " \t"); |
| 309 | 309 | if( !cur_tok || strlen(cur_tok)<2 ){ |
| 310 | 310 | return -1; |
| 311 | 311 | } |
| 312 | - mark->rid = atoi(&cur_tok[1]); | |
| 312 | + mark->rid = fast_uuid_to_rid(mark->uuid) | |
| 313 | + /* forum post bfb325108171eb8b: we want export to work | |
| 314 | + ** even if the RIDs get re-mapped, e.g. a different clone | |
| 315 | + ** is used. */; | |
| 313 | 316 | type_ = cur_tok[0]; |
| 314 | 317 | if( type_!='c' && type_!='b' ){ |
| 315 | 318 | /* This is probably a blob mark */ |
| 316 | 319 | mark->name = NULL; |
| 317 | 320 | return 0; |
| 321 | + } | |
| 322 | + if( !mark->rid ){ | |
| 323 | + fossil_free(mark->name); | |
| 324 | + fossil_trace("Non-existent SHA-1/SHA-3 in marks file: %s\n", mark->uuid); | |
| 325 | + return -1; | |
| 318 | 326 | } |
| 319 | 327 | |
| 320 | 328 | cur_tok = strtok(NULL, " \t"); |
| 321 | 329 | if( !cur_tok ){ |
| 322 | 330 | /* This mark was generated by an older version of Fossil and doesn't |
| @@ -335,24 +343,17 @@ | ||
| 335 | 343 | mark->name = fossil_strdup(cur_tok); |
| 336 | 344 | } |
| 337 | 345 | |
| 338 | 346 | cur_tok = strtok(NULL, "\n"); |
| 339 | 347 | if( !cur_tok || (strlen(cur_tok)!=40 && strlen(cur_tok)!=64) ){ |
| 340 | - free(mark->name); | |
| 348 | + fossil_free(mark->name); | |
| 341 | 349 | fossil_trace("Invalid SHA-1/SHA-3 in marks file: %s\n", cur_tok); |
| 342 | 350 | return -1; |
| 343 | 351 | }else{ |
| 344 | 352 | sqlite3_snprintf(sizeof(mark->uuid), mark->uuid, "%s", cur_tok); |
| 345 | 353 | } |
| 346 | 354 | |
| 347 | - /* make sure that rid corresponds to UUID */ | |
| 348 | - if( fast_uuid_to_rid(mark->uuid)!=mark->rid ){ | |
| 349 | - free(mark->name); | |
| 350 | - fossil_trace("Non-existent SHA-1/SHA-3 in marks file: %s\n", mark->uuid); | |
| 351 | - return -1; | |
| 352 | - } | |
| 353 | - | |
| 354 | 355 | /* insert a cross-ref into the 'xmark' table */ |
| 355 | 356 | insert_commit_xref(mark->rid, mark->name, mark->uuid); |
| 356 | 357 | return 0; |
| 357 | 358 | } |
| 358 | 359 | |
| 359 | 360 |
| --- src/export.c | |
| +++ src/export.c | |
| @@ -307,16 +307,24 @@ | |
| 307 | char type_; |
| 308 | cur_tok = strtok(line, " \t"); |
| 309 | if( !cur_tok || strlen(cur_tok)<2 ){ |
| 310 | return -1; |
| 311 | } |
| 312 | mark->rid = atoi(&cur_tok[1]); |
| 313 | type_ = cur_tok[0]; |
| 314 | if( type_!='c' && type_!='b' ){ |
| 315 | /* This is probably a blob mark */ |
| 316 | mark->name = NULL; |
| 317 | return 0; |
| 318 | } |
| 319 | |
| 320 | cur_tok = strtok(NULL, " \t"); |
| 321 | if( !cur_tok ){ |
| 322 | /* This mark was generated by an older version of Fossil and doesn't |
| @@ -335,24 +343,17 @@ | |
| 335 | mark->name = fossil_strdup(cur_tok); |
| 336 | } |
| 337 | |
| 338 | cur_tok = strtok(NULL, "\n"); |
| 339 | if( !cur_tok || (strlen(cur_tok)!=40 && strlen(cur_tok)!=64) ){ |
| 340 | free(mark->name); |
| 341 | fossil_trace("Invalid SHA-1/SHA-3 in marks file: %s\n", cur_tok); |
| 342 | return -1; |
| 343 | }else{ |
| 344 | sqlite3_snprintf(sizeof(mark->uuid), mark->uuid, "%s", cur_tok); |
| 345 | } |
| 346 | |
| 347 | /* make sure that rid corresponds to UUID */ |
| 348 | if( fast_uuid_to_rid(mark->uuid)!=mark->rid ){ |
| 349 | free(mark->name); |
| 350 | fossil_trace("Non-existent SHA-1/SHA-3 in marks file: %s\n", mark->uuid); |
| 351 | return -1; |
| 352 | } |
| 353 | |
| 354 | /* insert a cross-ref into the 'xmark' table */ |
| 355 | insert_commit_xref(mark->rid, mark->name, mark->uuid); |
| 356 | return 0; |
| 357 | } |
| 358 | |
| 359 |
| --- src/export.c | |
| +++ src/export.c | |
| @@ -307,16 +307,24 @@ | |
| 307 | char type_; |
| 308 | cur_tok = strtok(line, " \t"); |
| 309 | if( !cur_tok || strlen(cur_tok)<2 ){ |
| 310 | return -1; |
| 311 | } |
| 312 | mark->rid = fast_uuid_to_rid(mark->uuid) |
| 313 | /* forum post bfb325108171eb8b: we want export to work |
| 314 | ** even if the RIDs get re-mapped, e.g. a different clone |
| 315 | ** is used. */; |
| 316 | type_ = cur_tok[0]; |
| 317 | if( type_!='c' && type_!='b' ){ |
| 318 | /* This is probably a blob mark */ |
| 319 | mark->name = NULL; |
| 320 | return 0; |
| 321 | } |
| 322 | if( !mark->rid ){ |
| 323 | fossil_free(mark->name); |
| 324 | fossil_trace("Non-existent SHA-1/SHA-3 in marks file: %s\n", mark->uuid); |
| 325 | return -1; |
| 326 | } |
| 327 | |
| 328 | cur_tok = strtok(NULL, " \t"); |
| 329 | if( !cur_tok ){ |
| 330 | /* This mark was generated by an older version of Fossil and doesn't |
| @@ -335,24 +343,17 @@ | |
| 343 | mark->name = fossil_strdup(cur_tok); |
| 344 | } |
| 345 | |
| 346 | cur_tok = strtok(NULL, "\n"); |
| 347 | if( !cur_tok || (strlen(cur_tok)!=40 && strlen(cur_tok)!=64) ){ |
| 348 | fossil_free(mark->name); |
| 349 | fossil_trace("Invalid SHA-1/SHA-3 in marks file: %s\n", cur_tok); |
| 350 | return -1; |
| 351 | }else{ |
| 352 | sqlite3_snprintf(sizeof(mark->uuid), mark->uuid, "%s", cur_tok); |
| 353 | } |
| 354 | |
| 355 | /* insert a cross-ref into the 'xmark' table */ |
| 356 | insert_commit_xref(mark->rid, mark->name, mark->uuid); |
| 357 | return 0; |
| 358 | } |
| 359 | |
| 360 |