Fossil SCM
Correctly detect when an artifact prefix does not match any artifact. Provide better error messages for non-matching and ambiguous artifact prefixes. Fix for ticket [d0a7fc67e9].
Commit
9acf0bcdbe76cae81152a3485e47e4be1cf938ae
Parent
1e82c4aa850e1b3…
1 file changed
+23
-16
+23
-16
| --- src/name.c | ||
| +++ src/name.c | ||
| @@ -69,33 +69,40 @@ | ||
| 69 | 69 | blob_materialize(pName); |
| 70 | 70 | canonical16(blob_buffer(pName), sz); |
| 71 | 71 | if( sz==UUID_SIZE ){ |
| 72 | 72 | rc = db_int(1, "SELECT 0 FROM blob WHERE uuid=%B", pName); |
| 73 | 73 | if( rc ){ |
| 74 | - fossil_error(iErrPriority, "unknown object: %b", pName); | |
| 74 | + fossil_error(iErrPriority, "no such artifact: %b", pName); | |
| 75 | 75 | blob_reset(pName); |
| 76 | 76 | } |
| 77 | 77 | }else if( sz<UUID_SIZE && sz>=4 ){ |
| 78 | + Stmt q; | |
| 78 | 79 | char zOrig[UUID_SIZE+1]; |
| 79 | 80 | memcpy(zOrig, blob_buffer(pName), sz); |
| 80 | 81 | zOrig[sz] = 0; |
| 81 | 82 | blob_reset(pName); |
| 82 | - db_blob(pName, "SELECT uuid FROM blob WHERE uuid>='%s'", zOrig); | |
| 83 | - if( blob_size(pName)!=UUID_SIZE ){ | |
| 84 | - fossil_error(iErrPriority, "no match: %s", zOrig); | |
| 85 | - rc = 1; | |
| 86 | - }else{ | |
| 87 | - zOrig[sz-1]++; | |
| 88 | - if( db_exists("SELECT 1 FROM blob WHERE uuid>%B AND uuid<'%s'", | |
| 89 | - pName, zOrig) ){ | |
| 90 | - zOrig[sz-1]--; | |
| 91 | - fossil_error(iErrPriority, "non-unique name prefix: %s", zOrig); | |
| 92 | - rc = 1; | |
| 93 | - }else{ | |
| 94 | - rc = 0; | |
| 95 | - } | |
| 96 | - } | |
| 83 | + db_prepare(&q, "SELECT uuid FROM blob" | |
| 84 | + " WHERE uuid>='%s'" | |
| 85 | + " AND substr(uuid,1,%d)='%s'", | |
| 86 | + zOrig, sz, zOrig); | |
| 87 | + if( db_step(&q)!=SQLITE_ROW ){ | |
| 88 | + db_finalize(&q); | |
| 89 | + fossil_error(iErrPriority, "no artifacts match the prefix \"%s\"", zOrig); | |
| 90 | + return 1; | |
| 91 | + } | |
| 92 | + blob_append(pName, db_column_text(&q, 0), db_column_bytes(&q, 0)); | |
| 93 | + if( db_step(&q)==SQLITE_ROW ){ | |
| 94 | + fossil_error(iErrPriority, | |
| 95 | + "multiple artifacts match the prefix \"%s\"", | |
| 96 | + zOrig | |
| 97 | + ); | |
| 98 | + blob_reset(pName); | |
| 99 | + db_finalize(&q); | |
| 100 | + return 1; | |
| 101 | + } | |
| 102 | + db_finalize(&q); | |
| 103 | + rc = 0; | |
| 97 | 104 | }else{ |
| 98 | 105 | rc = 0; |
| 99 | 106 | } |
| 100 | 107 | return rc; |
| 101 | 108 | } |
| 102 | 109 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -69,33 +69,40 @@ | |
| 69 | blob_materialize(pName); |
| 70 | canonical16(blob_buffer(pName), sz); |
| 71 | if( sz==UUID_SIZE ){ |
| 72 | rc = db_int(1, "SELECT 0 FROM blob WHERE uuid=%B", pName); |
| 73 | if( rc ){ |
| 74 | fossil_error(iErrPriority, "unknown object: %b", pName); |
| 75 | blob_reset(pName); |
| 76 | } |
| 77 | }else if( sz<UUID_SIZE && sz>=4 ){ |
| 78 | char zOrig[UUID_SIZE+1]; |
| 79 | memcpy(zOrig, blob_buffer(pName), sz); |
| 80 | zOrig[sz] = 0; |
| 81 | blob_reset(pName); |
| 82 | db_blob(pName, "SELECT uuid FROM blob WHERE uuid>='%s'", zOrig); |
| 83 | if( blob_size(pName)!=UUID_SIZE ){ |
| 84 | fossil_error(iErrPriority, "no match: %s", zOrig); |
| 85 | rc = 1; |
| 86 | }else{ |
| 87 | zOrig[sz-1]++; |
| 88 | if( db_exists("SELECT 1 FROM blob WHERE uuid>%B AND uuid<'%s'", |
| 89 | pName, zOrig) ){ |
| 90 | zOrig[sz-1]--; |
| 91 | fossil_error(iErrPriority, "non-unique name prefix: %s", zOrig); |
| 92 | rc = 1; |
| 93 | }else{ |
| 94 | rc = 0; |
| 95 | } |
| 96 | } |
| 97 | }else{ |
| 98 | rc = 0; |
| 99 | } |
| 100 | return rc; |
| 101 | } |
| 102 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -69,33 +69,40 @@ | |
| 69 | blob_materialize(pName); |
| 70 | canonical16(blob_buffer(pName), sz); |
| 71 | if( sz==UUID_SIZE ){ |
| 72 | rc = db_int(1, "SELECT 0 FROM blob WHERE uuid=%B", pName); |
| 73 | if( rc ){ |
| 74 | fossil_error(iErrPriority, "no such artifact: %b", pName); |
| 75 | blob_reset(pName); |
| 76 | } |
| 77 | }else if( sz<UUID_SIZE && sz>=4 ){ |
| 78 | Stmt q; |
| 79 | char zOrig[UUID_SIZE+1]; |
| 80 | memcpy(zOrig, blob_buffer(pName), sz); |
| 81 | zOrig[sz] = 0; |
| 82 | blob_reset(pName); |
| 83 | db_prepare(&q, "SELECT uuid FROM blob" |
| 84 | " WHERE uuid>='%s'" |
| 85 | " AND substr(uuid,1,%d)='%s'", |
| 86 | zOrig, sz, zOrig); |
| 87 | if( db_step(&q)!=SQLITE_ROW ){ |
| 88 | db_finalize(&q); |
| 89 | fossil_error(iErrPriority, "no artifacts match the prefix \"%s\"", zOrig); |
| 90 | return 1; |
| 91 | } |
| 92 | blob_append(pName, db_column_text(&q, 0), db_column_bytes(&q, 0)); |
| 93 | if( db_step(&q)==SQLITE_ROW ){ |
| 94 | fossil_error(iErrPriority, |
| 95 | "multiple artifacts match the prefix \"%s\"", |
| 96 | zOrig |
| 97 | ); |
| 98 | blob_reset(pName); |
| 99 | db_finalize(&q); |
| 100 | return 1; |
| 101 | } |
| 102 | db_finalize(&q); |
| 103 | rc = 0; |
| 104 | }else{ |
| 105 | rc = 0; |
| 106 | } |
| 107 | return rc; |
| 108 | } |
| 109 |