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].

drh 2008-10-26 15:59 trunk
Commit 9acf0bcdbe76cae81152a3485e47e4be1cf938ae
1 file changed +23 -16
+23 -16
--- src/name.c
+++ src/name.c
@@ -69,33 +69,40 @@
6969
blob_materialize(pName);
7070
canonical16(blob_buffer(pName), sz);
7171
if( sz==UUID_SIZE ){
7272
rc = db_int(1, "SELECT 0 FROM blob WHERE uuid=%B", pName);
7373
if( rc ){
74
- fossil_error(iErrPriority, "unknown object: %b", pName);
74
+ fossil_error(iErrPriority, "no such artifact: %b", pName);
7575
blob_reset(pName);
7676
}
7777
}else if( sz<UUID_SIZE && sz>=4 ){
78
+ Stmt q;
7879
char zOrig[UUID_SIZE+1];
7980
memcpy(zOrig, blob_buffer(pName), sz);
8081
zOrig[sz] = 0;
8182
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;
97104
}else{
98105
rc = 0;
99106
}
100107
return rc;
101108
}
102109
--- 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

Keyboard Shortcuts

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