@@ -1656,10 +1656,12 @@
1656 1656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.allowSymlinks = !is_false(zAllow);
1657 1657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1658 1658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zRoot==0 ) zRoot = g.zLocalRoot==0 ? "" : g.zLocalRoot;
1659 1659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("db_allow_symlinks() = %d\n", db_allow_symlinks());
1660 1660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("local-root = [%s]\n", zRoot);
1661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_create_function(g.db, "inode", 1, SQLITE_UTF8, 0,
1662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file_inode_sql_func, 0, 0);
1661 1663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=2; i<g.argc; i++){
1662 1664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z;
1663 1665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
emitFileStat(g.argv[i], slashFlag, resetFlag);
1664 1666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
z = file_canonical_name_dup(g.argv[i]);
1665 1667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print(" file_canonical_name = %s\n", z);
@@ -1669,10 +1671,13 @@
1669 1671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
1670 1672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n = file_nondir_objects_on_path(zRoot, z);
1671 1673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("%.*s\n", n, z);
1672 1674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1673 1675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(z);
1676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ z = db_text(0, "SELECT inode(%Q)", g.argv[i]);
1677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print(" file_inode_sql_func = \"%s\"\n", z);
1678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(z);
1674 1679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1675 1680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1676 1681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1677 1682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1678 1683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: test-canonical-name
@@ -2980,5 +2985,62 @@
2980 2985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2981 2986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2982 2987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zCkoutDb);
2983 2988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
2984 2989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
2992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is the implementation of inode(FILENAME) SQL function.
2993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** dev_inode(FILENAME) returns a string. If FILENAME exists and is
2995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a regular file, then the return string is of the form:
2996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** DEV/INODE
2998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Where DEV and INODE are the device number and inode number for
3000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the file. Or, on Windows, the return value is the canonical
3001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** name of the file, because Windows does not have INODEs.
3002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
3003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If FILENAME does not exist, then the return is an empty string.
3004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
3005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The value of inode() can be used to eliminate files from a list
3006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that have duplicates because they have differing names due to links.
3007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
3008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Code that wants to use this SQL function needs to first register
3009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it using a call such as the following:
3010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
3011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_create_function(g.db, "inode", 1, SQLITE_UTF8, 0,
3012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file_inode_sql_func, 0, 0);
3013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
3014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void file_inode_sql_func(
3015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_context *context,
3016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int argc,
3017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_value **argv
3018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
3019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zFilename;
3020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( argc==1 );
3021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zFilename = (const char*)sqlite3_value_text(argv[0]);
3022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zFilename==0 || zFilename[0]==0 || file_access(zFilename,F_OK) ){
3023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_text(context, "", 0, SQLITE_STATIC);
3024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
3025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
3026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(_WIN32)
3027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
3028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zCanonical = file_canonical_name_dup(zFilename);
3029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_text(context, zCanonical, -1, fossil_free);
3030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
3031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
3032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
3033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct stat buf;
3034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
3035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&buf, 0, sizeof(buf));
3036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = stat(zFilename, &buf);
3037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
3038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_text(context, "", 0, SQLITE_STATIC);
3039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
3040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_text(context,
3041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mprintf("%lld/%lld", (i64)buf.st_dev, (i64)buf.st_ino), -1,
3042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free);
3043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
3044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
3045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
3046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2985 3047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!