Fossil SCM

A proposed, but also unproven, patch for the git export parse_mark() issues discussed in [forum:906c248f2f79de41 | forum thread 906c248f2f].

stephan 2025-07-15 08:13 trunk
Commit 076c8def287d53474f239f16c69c9d3214eff554ecb409d00b89597ae09c99ef
1 file changed +10 -9
+10 -9
--- src/export.c
+++ src/export.c
@@ -307,16 +307,24 @@
307307
char type_;
308308
cur_tok = strtok(line, " \t");
309309
if( !cur_tok || strlen(cur_tok)<2 ){
310310
return -1;
311311
}
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. */;
313316
type_ = cur_tok[0];
314317
if( type_!='c' && type_!='b' ){
315318
/* This is probably a blob mark */
316319
mark->name = NULL;
317320
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;
318326
}
319327
320328
cur_tok = strtok(NULL, " \t");
321329
if( !cur_tok ){
322330
/* This mark was generated by an older version of Fossil and doesn't
@@ -335,24 +343,17 @@
335343
mark->name = fossil_strdup(cur_tok);
336344
}
337345
338346
cur_tok = strtok(NULL, "\n");
339347
if( !cur_tok || (strlen(cur_tok)!=40 && strlen(cur_tok)!=64) ){
340
- free(mark->name);
348
+ fossil_free(mark->name);
341349
fossil_trace("Invalid SHA-1/SHA-3 in marks file: %s\n", cur_tok);
342350
return -1;
343351
}else{
344352
sqlite3_snprintf(sizeof(mark->uuid), mark->uuid, "%s", cur_tok);
345353
}
346354
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
-
354355
/* insert a cross-ref into the 'xmark' table */
355356
insert_commit_xref(mark->rid, mark->name, mark->uuid);
356357
return 0;
357358
}
358359
359360
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button