Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch short-uuid Excluding Merge-Ins
This is equivalent to a diff from b7ff537d to 5460b0cf
2014-04-22
| ||
12:51 | Handle short UUID collisions for events, tickets and other artifacts in the /info page. ... (check-in: 49467d2a user: drh tags: trunk) | |
2014-04-11
| ||
21:30 | Added new /reports page: byweekday. Most tags and commits happen on Thursdays. Most tickets on Wednesdays. ... (check-in: 2cf6304b user: stephan tags: trunk) | |
18:12 | Merge in latest fixes. ... (Closed-Leaf check-in: 5460b0cf user: andybradford tags: short-uuid) | |
15:44 | Refactored ATTACHMENT crosslinking a bit to remove some duplicate code (tested on libfossil repo). Replaced free() with fossil_free() (consistency). Added fossil_is_uuid(), the c-string counterpart of blob_is_uuid(). ... (check-in: b7ff537d user: stephan tags: trunk) | |
2014-04-10
| ||
08:36 | Add test-cases for function file_relative_name(), three of them failing without [565ba734d2] ... (check-in: 1762a72f user: jan.nijtmans tags: trunk) | |
2014-04-08
| ||
05:52 | Make error message more obvious when short UUID length is less than 4. ... (check-in: 4b1b56c9 user: andybradford tags: short-uuid) | |
Changes to src/info.c.
︙ | ︙ | |||
1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 | ** Figure out what the artifact ID is and jump to it. */ void info_page(void){ const char *zName; Blob uuid; int rid; int rc; zName = P("name"); if( zName==0 ) fossil_redirect_home(); | > > > > > > > > > > | | | | | | > | | | | < < < > > > | 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 | ** Figure out what the artifact ID is and jump to it. */ void info_page(void){ const char *zName; Blob uuid; int rid; int rc; int nLen; zName = P("name"); if( zName==0 ) fossil_redirect_home(); nLen = strlen(zName); blob_set(&uuid, zName); if( name_collisions(zName) ){ cgi_set_parameter("src","info"); ambiguous_page(); return; } rc = name_to_uuid(&uuid, -1, "*"); if( rc==1 ){ if( validate16(zName, nLen) ){ if( db_exists("SELECT 1 FROM ticket WHERE tkt_uuid GLOB '%q*'", zName) ){ tktview_page(); return; } if( db_exists("SELECT 1 FROM tag" " WHERE tagname GLOB 'event-%q*'", zName) ){ event_page(); return; } } style_header("No Such Object"); @ <p>No such object: %h(zName)</p> if( nLen<4 ){ @ <p>Objects of length < 4 are too ambiguous to worry about</p> } style_footer(); return; }else if( rc==2 ){ cgi_set_parameter("src","info"); ambiguous_page(); return; } |
︙ | ︙ |
Changes to src/name.c.
︙ | ︙ | |||
264 265 266 267 268 269 270 | " AND event.type GLOB '%q'", zTag, zType); } } } return rid; } | < | 264 265 266 267 268 269 270 271 272 273 274 275 276 277 | " AND event.type GLOB '%q'", zTag, zType); } } } return rid; } /* ** This routine takes a user-entered UUID which might be in mixed ** case and might only be a prefix of the full UUID and converts it ** into the full-length UUID in canonical form. ** ** If the input is not a UUID or a UUID prefix, then try to resolve ** the name as a tag. If multiple tags match, pick the latest. |
︙ | ︙ | |||
317 318 319 320 321 322 323 324 325 326 327 328 329 330 | if((rid>0) && pUuid){ *pUuid = db_text(NULL, "SELECT uuid FROM blob WHERE rid=%d", rid); } return rid; } /* ** COMMAND: test-name-to-id ** ** Convert a name to a full artifact ID. */ void test_name_to_id(void){ | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 | if((rid>0) && pUuid){ *pUuid = db_text(NULL, "SELECT uuid FROM blob WHERE rid=%d", rid); } return rid; } /* ** name_collisions searches through events, blobs, and tickets for ** collisions of a given UUID based on its length on UUIDs no shorter ** than 4 characters in length. */ int name_collisions(const char *zName){ Stmt q; int c = 0; /* count of collisions for zName */ int nLen; /* length of zName */ nLen = strlen(zName); if( nLen>=4 && nLen<=UUID_SIZE && validate16(zName, nLen) ){ db_prepare(&q, "SELECT count(uuid) FROM" " (SELECT substr(tkt_uuid, 1, %d) AS uuid FROM ticket" " UNION ALL SELECT * FROM" " (SELECT substr(tagname, 7, %d) FROM" " tag WHERE tagname GLOB 'event-*')" " UNION ALL SELECT * FROM" " (SELECT substr(uuid, 1, %d) FROM blob))" " WHERE uuid GLOB '%q*'" " GROUP BY uuid HAVING count(uuid) > 1;", nLen, nLen, nLen, zName); if( db_step(&q)==SQLITE_ROW ){ c = db_column_int(&q, 0); } db_finalize(&q); } return c; } /* ** COMMAND: test-name-to-id ** ** Convert a name to a full artifact ID. */ void test_name_to_id(void){ |
︙ | ︙ | |||
404 405 406 407 408 409 410 411 412 413 414 415 416 417 | while( db_step(&q)==SQLITE_ROW ){ const char *zUuid = db_column_text(&q, 0); int rid = db_column_int(&q, 1); @ <li><p><a href="%s(g.zTop)/%T(zSrc)/%s(zUuid)"> @ %s(zUuid)</a> - object_description(rid, 0, 0); @ </p></li> } @ </ol> db_finalize(&q); style_footer(); } /* | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 | while( db_step(&q)==SQLITE_ROW ){ const char *zUuid = db_column_text(&q, 0); int rid = db_column_int(&q, 1); @ <li><p><a href="%s(g.zTop)/%T(zSrc)/%s(zUuid)"> @ %s(zUuid)</a> - object_description(rid, 0, 0); @ </p></li> } db_finalize(&q); db_prepare(&q, " SELECT tkt_rid, tkt_uuid, title" " FROM ticket, ticketchng" " WHERE ticket.tkt_id = ticketchng.tkt_id" " AND tkt_uuid GLOB '%q*'" " GROUP BY tkt_uuid" " ORDER BY tkt_ctime DESC", z); while( db_step(&q)==SQLITE_ROW ){ int rid = db_column_int(&q, 0); const char *zUuid = db_column_text(&q, 1); const char *zTitle = db_column_text(&q, 2); @ <li><p><a href="%s(g.zTop)/%T(zSrc)/%s(zUuid)"> @ %s(zUuid)</a> - @ <ul></ul> @ Ticket hyperlink_to_uuid(zUuid); @ - %s(zTitle). @ <ul><li> object_description(rid, 0, 0); @ </li></ul> @ </p></li> } db_finalize(&q); db_prepare(&q, "SELECT rid, uuid FROM" " (SELECT tagxref.rid AS rid, substr(tagname, 7) AS uuid" " FROM tagxref, tag WHERE tagxref.tagid = tag.tagid" " AND tagname GLOB 'event-%q*') GROUP BY uuid", z); while( db_step(&q)==SQLITE_ROW ){ int rid = db_column_int(&q, 0); const char* zUuid = db_column_text(&q, 1); @ <li><p><a href="%s(g.zTop)/%T(zSrc)/%s(zUuid)"> @ %s(zUuid)</a> - @ <ul><li> object_description(rid, 0, 0); @ </li></ul> @ </p></li> } @ </ol> db_finalize(&q); style_footer(); } /* |
︙ | ︙ |