Fossil SCM
Tolerate "[...]" delimiters enclosing hash identifiers.
Commit
537b498e6cd4f10df71a50befe7d0e69fa156fd07218e5daaef3a561d93938e7
Parent
cee662d96ed9c49…
1 file changed
+18
-4
+18
-4
| --- src/name.c | ||
| +++ src/name.c | ||
| @@ -76,11 +76,11 @@ | ||
| 76 | 76 | } |
| 77 | 77 | |
| 78 | 78 | /* |
| 79 | 79 | ** Convert a symbolic name into a RID. Acceptable forms: |
| 80 | 80 | ** |
| 81 | -** * artifact hash | |
| 81 | +** * artifact hash (optionally enclosed in [...]) | |
| 82 | 82 | ** * 4-character or larger prefix of a artifact |
| 83 | 83 | ** * Symbolic Name |
| 84 | 84 | ** * "tag:" + symbolic name |
| 85 | 85 | ** * Date or date-time |
| 86 | 86 | ** * "date:" + Date or date-time |
| @@ -112,10 +112,12 @@ | ||
| 112 | 112 | int vid; |
| 113 | 113 | int rid = 0; |
| 114 | 114 | int nTag; |
| 115 | 115 | int i; |
| 116 | 116 | int startOfBranch = 0; |
| 117 | + const char *zXTag; /* zTag with optional [...] removed */ | |
| 118 | + int nXTag; /* Size of zXTag */ | |
| 117 | 119 | |
| 118 | 120 | if( zType==0 || zType[0]==0 ){ |
| 119 | 121 | zType = "*"; |
| 120 | 122 | }else if( zType[0]=='b' ){ |
| 121 | 123 | zType = "ci"; |
| @@ -227,17 +229,29 @@ | ||
| 227 | 229 | " AND event.type GLOB '%q'", |
| 228 | 230 | zTagBase, zDate, zType |
| 229 | 231 | ); |
| 230 | 232 | return rid; |
| 231 | 233 | } |
| 234 | + | |
| 235 | + /* Remove optional [...] */ | |
| 236 | + zXTag = zTag; | |
| 237 | + nXTag = nTag; | |
| 238 | + if( zXTag[0]=='[' ){ | |
| 239 | + zXTag++; | |
| 240 | + nXTag--; | |
| 241 | + } | |
| 242 | + if( nXTag>0 && zXTag[nXTag-1]==']' ){ | |
| 243 | + nXTag--; | |
| 244 | + } | |
| 232 | 245 | |
| 233 | 246 | /* artifact hash or prefix */ |
| 234 | - if( nTag>=4 && nTag<=HNAME_MAX && validate16(zTag, nTag) ){ | |
| 247 | + if( nXTag>=4 && nXTag<=HNAME_MAX && validate16(zXTag, nXTag) ){ | |
| 235 | 248 | Stmt q; |
| 236 | 249 | char zUuid[HNAME_MAX+1]; |
| 237 | - memcpy(zUuid, zTag, nTag+1); | |
| 238 | - canonical16(zUuid, nTag); | |
| 250 | + memcpy(zUuid, zXTag, nXTag); | |
| 251 | + zUuid[nXTag] = 0; | |
| 252 | + canonical16(zUuid, nXTag); | |
| 239 | 253 | rid = 0; |
| 240 | 254 | if( zType[0]=='*' ){ |
| 241 | 255 | db_prepare(&q, "SELECT rid FROM blob WHERE uuid GLOB '%q*'", zUuid); |
| 242 | 256 | }else{ |
| 243 | 257 | db_prepare(&q, |
| 244 | 258 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -76,11 +76,11 @@ | |
| 76 | } |
| 77 | |
| 78 | /* |
| 79 | ** Convert a symbolic name into a RID. Acceptable forms: |
| 80 | ** |
| 81 | ** * artifact hash |
| 82 | ** * 4-character or larger prefix of a artifact |
| 83 | ** * Symbolic Name |
| 84 | ** * "tag:" + symbolic name |
| 85 | ** * Date or date-time |
| 86 | ** * "date:" + Date or date-time |
| @@ -112,10 +112,12 @@ | |
| 112 | int vid; |
| 113 | int rid = 0; |
| 114 | int nTag; |
| 115 | int i; |
| 116 | int startOfBranch = 0; |
| 117 | |
| 118 | if( zType==0 || zType[0]==0 ){ |
| 119 | zType = "*"; |
| 120 | }else if( zType[0]=='b' ){ |
| 121 | zType = "ci"; |
| @@ -227,17 +229,29 @@ | |
| 227 | " AND event.type GLOB '%q'", |
| 228 | zTagBase, zDate, zType |
| 229 | ); |
| 230 | return rid; |
| 231 | } |
| 232 | |
| 233 | /* artifact hash or prefix */ |
| 234 | if( nTag>=4 && nTag<=HNAME_MAX && validate16(zTag, nTag) ){ |
| 235 | Stmt q; |
| 236 | char zUuid[HNAME_MAX+1]; |
| 237 | memcpy(zUuid, zTag, nTag+1); |
| 238 | canonical16(zUuid, nTag); |
| 239 | rid = 0; |
| 240 | if( zType[0]=='*' ){ |
| 241 | db_prepare(&q, "SELECT rid FROM blob WHERE uuid GLOB '%q*'", zUuid); |
| 242 | }else{ |
| 243 | db_prepare(&q, |
| 244 |
| --- src/name.c | |
| +++ src/name.c | |
| @@ -76,11 +76,11 @@ | |
| 76 | } |
| 77 | |
| 78 | /* |
| 79 | ** Convert a symbolic name into a RID. Acceptable forms: |
| 80 | ** |
| 81 | ** * artifact hash (optionally enclosed in [...]) |
| 82 | ** * 4-character or larger prefix of a artifact |
| 83 | ** * Symbolic Name |
| 84 | ** * "tag:" + symbolic name |
| 85 | ** * Date or date-time |
| 86 | ** * "date:" + Date or date-time |
| @@ -112,10 +112,12 @@ | |
| 112 | int vid; |
| 113 | int rid = 0; |
| 114 | int nTag; |
| 115 | int i; |
| 116 | int startOfBranch = 0; |
| 117 | const char *zXTag; /* zTag with optional [...] removed */ |
| 118 | int nXTag; /* Size of zXTag */ |
| 119 | |
| 120 | if( zType==0 || zType[0]==0 ){ |
| 121 | zType = "*"; |
| 122 | }else if( zType[0]=='b' ){ |
| 123 | zType = "ci"; |
| @@ -227,17 +229,29 @@ | |
| 229 | " AND event.type GLOB '%q'", |
| 230 | zTagBase, zDate, zType |
| 231 | ); |
| 232 | return rid; |
| 233 | } |
| 234 | |
| 235 | /* Remove optional [...] */ |
| 236 | zXTag = zTag; |
| 237 | nXTag = nTag; |
| 238 | if( zXTag[0]=='[' ){ |
| 239 | zXTag++; |
| 240 | nXTag--; |
| 241 | } |
| 242 | if( nXTag>0 && zXTag[nXTag-1]==']' ){ |
| 243 | nXTag--; |
| 244 | } |
| 245 | |
| 246 | /* artifact hash or prefix */ |
| 247 | if( nXTag>=4 && nXTag<=HNAME_MAX && validate16(zXTag, nXTag) ){ |
| 248 | Stmt q; |
| 249 | char zUuid[HNAME_MAX+1]; |
| 250 | memcpy(zUuid, zXTag, nXTag); |
| 251 | zUuid[nXTag] = 0; |
| 252 | canonical16(zUuid, nXTag); |
| 253 | rid = 0; |
| 254 | if( zType[0]=='*' ){ |
| 255 | db_prepare(&q, "SELECT rid FROM blob WHERE uuid GLOB '%q*'", zUuid); |
| 256 | }else{ |
| 257 | db_prepare(&q, |
| 258 |