@@ -2408,5 +2408,66 @@
2408 2408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
2409 2409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char * file_extension(const char *zFileName){
2410 2410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char * zExt = zFileName ? strrchr(zFileName, '.') : 0;
2411 2411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return zExt ? &zExt[1] : 0;
2412 2412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
2415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Returns true if the given filename ends with any of fossil's
2416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checkout database filenames: _FOSSIL_ or .fslckout. Specifically,
2417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it returns 1 if it's an exact match and 2 if it's the tail match
2418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** on a longer input.
2419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zFilename must, for efficiency's sake, be a
2421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** canonicalized/normalized name, e.g. using only '/' as directory
2422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** separators.
2423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nFilename must be the strlen of zFilename. If it is negative,
2425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** strlen() is used to calculate it.
2426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** TODO: https://fossil-scm.org/sec2020/info/972cf9c302f5413f
2428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** TL;DR: check for the -wal, -shm, -journal suffix forms of the db
2429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** names.
2430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
2431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int filename_is_ckout_db(const char *zFilename, int nFilename){
2432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zEnd;
2433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(nFilename>=0 && nFilename<8/*strlen _FOSSIL_*/) return 0;
2435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if(nFilename<0) nFilename = (int)strlen(zFilename);
2436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(nFilename<8) return 0;
2437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zEnd = zFilename + nFilename;
2438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch(zEnd[-1]){
2439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case '_': {
2440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return fossil_strcmp("_FOSSIL_", &zEnd[-8])
2441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? 0 : (8==nFilename ? 1 : ('/'==zEnd[-9] ? 2 : 0));
2442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 't': {
2444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (nFilename<9
2445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || '.'!=zEnd[-9]
2446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || fossil_strcmp(".fslckout", &zEnd[-9]))
2447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ? 0 : (9==nFilename ? 1 : ('/'==zEnd[-10] ? 2 : 0));
2448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default:
2450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
2451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
2455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** COMMAND: test-is-ckout-db
2456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil test-is-ckout-db FILENAMES...
2458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Passes each given name to filename_is_ckout_db() and outputs one
2460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** line per file: the result value of that function followed by the
2461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** name.
2462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
2463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void test_is_ckout_name_cmd(void){
2464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
2465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(g.argc<3){
2467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ usage("FILENAME_1 [...FILENAME_N]");
2468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( i = 2; i < g.argc; ++i ){
2470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int check = filename_is_ckout_db(g.argv[i], -1);
2471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("%d %s\n", check, g.argv[i]);
2472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2413 2474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!