Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Fix `fossil clean` on symlinks by refactoring file_isfile_or_link() to take eFType as well, so that SymFILE doesn't get dropped but passed along instead. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | fix-clean-symlinks |
| Files: | files | file ages | folders |
| SHA3-256: |
9e06f72b710808c58f9f463366761699 |
| User & Date: | js 2025-06-15 17:12:25.977 |
Context
|
2025-06-21
| ||
| 23:36 | Fix `fossil clean` on symlinks by refactoring file_isfile_or_link() to take eFType as well, so that SymFILE doesn't get dropped but passed along instead. Closed-Leaf check-in: 4b6dbb2e3a user: js tags: morphos | |
|
2025-06-15
| ||
| 17:12 | Fix `fossil clean` on symlinks by refactoring file_isfile_or_link() to take eFType as well, so that SymFILE doesn't get dropped but passed along instead. Closed-Leaf check-in: 9e06f72b71 user: js tags: fix-clean-symlinks | |
|
2025-06-08
| ||
| 22:46 | Replace a couple old references to fossil-scm.org/fossil with /home. check-in: ca5ecf2223 user: stephan tags: trunk | |
Changes
Changes to src/add.c.
| ︙ | ︙ | |||
293 294 295 296 297 298 299 |
}
if(bIsAdd==0){
/* Restore contents of missing un-rm'd files. We don't do this
** unconditionally because we might cause data loss if a file
** is modified, rm'd, then un-rm'd.
*/
++nReset;
| | | 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 |
}
if(bIsAdd==0){
/* Restore contents of missing un-rm'd files. We don't do this
** unconditionally because we might cause data loss if a file
** is modified, rm'd, then un-rm'd.
*/
++nReset;
if(!file_isfile_or_link(blob_str(&relName), RepoFILE)){
if(bDryRun==0){
vfile_to_disk(0, id, 0, 0);
if(bVerbose){
fossil_print("Restored missing file: %b\n", &relName);
}
}else{
fossil_print("Dry-run: not restoring missing file: %b\n", &relName);
|
| ︙ | ︙ | |||
868 869 870 871 872 873 874 |
);
while( db_step(&q)==SQLITE_ROW ){
const char *zFile;
const char *zPath;
zFile = db_column_text(&q, 0);
zPath = db_column_text(&q, 1);
| | | 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 |
);
while( db_step(&q)==SQLITE_ROW ){
const char *zFile;
const char *zPath;
zFile = db_column_text(&q, 0);
zPath = db_column_text(&q, 1);
if( !file_isfile_or_link(zPath, RepoFILE) ){
if( !dryRunFlag ){
db_multi_exec("UPDATE vfile SET deleted=1 WHERE pathname=%Q", zFile);
}
fossil_print("DELETED %s\n", zFile);
nDelete++;
}
}
|
| ︙ | ︙ |
Changes to src/checkin.c.
| ︙ | ︙ | |||
216 217 218 219 220 221 222 |
int size = db_column_int(&q, 2);
int isDeleted = db_column_int(&q, 3);
int isChnged = db_column_int(&q, 4);
int isNew = isManaged && !db_column_int(&q, 5);
int isRenamed = db_column_int(&q, 6);
const char *zOrigName = 0;
char *zFullName = mprintf("%s%s", g.zLocalRoot, zPathname);
| | | 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
int size = db_column_int(&q, 2);
int isDeleted = db_column_int(&q, 3);
int isChnged = db_column_int(&q, 4);
int isNew = isManaged && !db_column_int(&q, 5);
int isRenamed = db_column_int(&q, 6);
const char *zOrigName = 0;
char *zFullName = mprintf("%s%s", g.zLocalRoot, zPathname);
int isMissing = !file_isfile_or_link(zFullName, RepoFILE);
/* Determine the file change classification, if any. */
if( isDeleted ){
if( flags & C_DELETED ){
zClass = "DELETED";
}
}else if( isMissing ){
|
| ︙ | ︙ | |||
924 925 926 927 928 929 930 |
char *zFullName = mprintf("%s%s", g.zLocalRoot, zPathname);
const char *type = "";
if( verboseFlag ){
if( isNew ){
type = "ADDED ";
}else if( isDeleted ){
type = "DELETED ";
| | | 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 |
char *zFullName = mprintf("%s%s", g.zLocalRoot, zPathname);
const char *type = "";
if( verboseFlag ){
if( isNew ){
type = "ADDED ";
}else if( isDeleted ){
type = "DELETED ";
}else if( !file_isfile_or_link(zFullName, RepoFILE) ){
if( file_access(zFullName, F_OK)==0 ){
type = "NOT_A_FILE ";
}else{
type = "MISSING ";
}
}else if( chnged ){
if( chnged==2 ){
|
| ︙ | ︙ |
Changes to src/file.c.
| ︙ | ︙ | |||
215 216 217 218 219 220 221 | ** Return TRUE if either of the following are true: ** ** (1) zFilename is an ordinary file ** ** (2) allow_symlinks is on and zFilename is a symbolic link to ** a file, directory, or other object */ | | | | 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
** Return TRUE if either of the following are true:
**
** (1) zFilename is an ordinary file
**
** (2) allow_symlinks is on and zFilename is a symbolic link to
** a file, directory, or other object
*/
int file_isfile_or_link(const char *zFilename, int eFType){
if( getStat(zFilename, eFType) ){
return 0; /* stat() failed. Return false. */
}
return S_ISREG(fx.fileStat.st_mode) || S_ISLNK(fx.fileStat.st_mode);
}
/*
** Return TRUE if the named file is an ordinary file. Return false
|
| ︙ | ︙ | |||
1610 1611 1612 1613 1614 1615 1616 |
memset(zBuf, 0, sizeof(zBuf));
blob_zero(&x);
file_canonical_name(zPath, &x, slash);
zFull = blob_str(&x);
fossil_print("[%s] -> [%s]\n", zPath, zFull);
memset(&testFileStat, 0, sizeof(struct fossilStat));
rc = fossil_stat(zPath, &testFileStat, 0);
| | | | | > | | | | > | | | > | > | > | > | | | > | > | > | | > | > | > | | 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 |
memset(zBuf, 0, sizeof(zBuf));
blob_zero(&x);
file_canonical_name(zPath, &x, slash);
zFull = blob_str(&x);
fossil_print("[%s] -> [%s]\n", zPath, zFull);
memset(&testFileStat, 0, sizeof(struct fossilStat));
rc = fossil_stat(zPath, &testFileStat, 0);
fossil_print(" stat_rc = %d\n", rc);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", testFileStat.st_size);
fossil_print(" stat_size = %s\n", zBuf);
if( g.db==0 ) sqlite3_open(":memory:", &g.db);
z = db_text(0, "SELECT datetime(%lld, 'unixepoch')", testFileStat.st_mtime);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld (%s)", testFileStat.st_mtime, z);
fossil_free(z);
fossil_print(" stat_mtime = %s\n", zBuf);
fossil_print(" stat_mode = 0%o\n",
testFileStat.st_mode);
memset(&testFileStat, 0, sizeof(struct fossilStat));
rc = fossil_stat(zPath, &testFileStat, 1);
fossil_print(" l_stat_rc = %d\n", rc);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", testFileStat.st_size);
fossil_print(" l_stat_size = %s\n", zBuf);
z = db_text(0, "SELECT datetime(%lld, 'unixepoch')", testFileStat.st_mtime);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld (%s)", testFileStat.st_mtime, z);
fossil_free(z);
fossil_print(" l_stat_mtime = %s\n", zBuf);
fossil_print(" l_stat_mode = 0%o\n",
testFileStat.st_mode);
if( reset ) resetStat();
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", file_size(zPath,ExtFILE));
fossil_print(" file_size(ExtFILE) = %s\n", zBuf);
iMtime = file_mtime(zPath, ExtFILE);
z = db_text(0, "SELECT datetime(%lld, 'unixepoch')", iMtime);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld (%s)", iMtime, z);
fossil_free(z);
fossil_print(" file_mtime(ExtFILE) = %s\n", zBuf);
fossil_print(" file_mode(ExtFILE) = 0%o\n",
file_mode(zPath,ExtFILE));
fossil_print(" file_isfile(ExtFILE) = %d\n",
file_isfile(zPath,ExtFILE));
fossil_print(" file_isdir(ExtFILE) = %d\n",
file_isdir(zPath,ExtFILE));
fossil_print(" file_issocket() = %d\n",
file_issocket(zPath));
if( reset ) resetStat();
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", file_size(zPath,RepoFILE));
fossil_print(" file_size(RepoFILE) = %s\n", zBuf);
iMtime = file_mtime(zPath,RepoFILE);
z = db_text(0, "SELECT datetime(%lld, 'unixepoch')", iMtime);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld (%s)", iMtime, z);
fossil_free(z);
fossil_print(" file_mtime(RepoFILE) = %s\n", zBuf);
fossil_print(" file_mode(RepoFILE) = 0%o\n",
file_mode(zPath,RepoFILE));
fossil_print(" file_isfile(RepoFILE) = %d\n",
file_isfile(zPath,RepoFILE));
fossil_print(" file_isfile_or_link(RepoFILE) = %d\n",
file_isfile_or_link(zPath,RepoFILE));
fossil_print(" file_islink = %d\n", file_islink(zPath));
fossil_print(" file_isexe(RepoFILE) = %d\n",
file_isexe(zPath,RepoFILE));
fossil_print(" file_isdir(RepoFILE) = %d\n",
file_isdir(zPath,RepoFILE));
fossil_print(" file_is_repository = %d\n",
file_is_repository(zPath));
fossil_print(" file_is_reserved_name = %d\n",
file_is_reserved_name(zFull,-1));
fossil_print(" file_in_cwd = %d\n", file_in_cwd(zPath));
blob_reset(&x);
if( reset ) resetStat();
}
/*
|
| ︙ | ︙ | |||
1742 1743 1744 1745 1746 1747 1748 |
fossil_print("[%s] -> [%s]\n", zName, blob_buffer(&x));
blob_reset(&x);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", file_size(zName,RepoFILE));
fossil_print(" file_size = %s\n", zBuf);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", file_mtime(zName,RepoFILE));
fossil_print(" file_mtime = %s\n", zBuf);
fossil_print(" file_isfile = %d\n", file_isfile(zName,RepoFILE));
| | > | 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 |
fossil_print("[%s] -> [%s]\n", zName, blob_buffer(&x));
blob_reset(&x);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", file_size(zName,RepoFILE));
fossil_print(" file_size = %s\n", zBuf);
sqlite3_snprintf(sizeof(zBuf), zBuf, "%lld", file_mtime(zName,RepoFILE));
fossil_print(" file_mtime = %s\n", zBuf);
fossil_print(" file_isfile = %d\n", file_isfile(zName,RepoFILE));
fossil_print(" file_isfile_or_link = %d\n",
file_isfile_or_link(zName,RepoFILE));
fossil_print(" file_islink = %d\n", file_islink(zName));
fossil_print(" file_isexe = %d\n", file_isexe(zName,RepoFILE));
fossil_print(" file_isdir = %d\n", file_isdir(zName,RepoFILE));
}
}
/*
|
| ︙ | ︙ |
Changes to src/json_status.c.
| ︙ | ︙ | |||
113 114 115 116 117 118 119 |
char const * zStatus = "???";
char * zFullName = mprintf("%s%s", g.zLocalRoot, zPathname);
if( isDeleted ){
zStatus = "deleted";
}else if( isNew ){
zStatus = "new" /* maintenance reminder: MUST come
BEFORE the isChnged checks. */;
| | | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
char const * zStatus = "???";
char * zFullName = mprintf("%s%s", g.zLocalRoot, zPathname);
if( isDeleted ){
zStatus = "deleted";
}else if( isNew ){
zStatus = "new" /* maintenance reminder: MUST come
BEFORE the isChnged checks. */;
}else if( !file_isfile_or_link(zFullName, RepoFILE) ){
if( file_access(zFullName, F_OK)==0 ){
zStatus = "notAFile";
++nErr;
}else{
zStatus = "missing";
++nErr;
}
|
| ︙ | ︙ |
Changes to src/merge.c.
| ︙ | ︙ | |||
1558 1559 1560 1561 1562 1563 1564 |
"CASE WHEN rid<>mrid"
" THEN (SELECT uuid FROM blob WHERE blob.rid=vfile.mrid) END "
"FROM vfile WHERE id=%d",
vid, integrateFlag?5:3, idm
);
zName = db_column_text(&q, 1);
zFullName = mprintf("%s%s", g.zLocalRoot, zName);
| | | 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 |
"CASE WHEN rid<>mrid"
" THEN (SELECT uuid FROM blob WHERE blob.rid=vfile.mrid) END "
"FROM vfile WHERE id=%d",
vid, integrateFlag?5:3, idm
);
zName = db_column_text(&q, 1);
zFullName = mprintf("%s%s", g.zLocalRoot, zName);
if( file_isfile_or_link(zFullName, RepoFILE)
&& !db_exists("SELECT 1 FROM fv WHERE fn=%Q", zName) ){
/* Name of backup file with Original content */
char *zOrig = file_newname(zFullName, "original", 1);
/* Backup previously unanaged file before to be overwritten */
file_copy(zFullName, zOrig);
fossil_free(zOrig);
fossil_print("ADDED %s (overwrites an unmanaged file)", zName);
|
| ︙ | ︙ |
Changes to src/update.c.
| ︙ | ︙ | |||
446 447 448 449 450 451 452 |
fossil_print("CONFLICT %s\n", zName);
nConflict++;
zOp = "CONFLICT";
nc = 1;
zErrMsg = "duplicate file";
}else if( idt>0 && idv==0 ){
/* File added in the target. */
| | | 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 |
fossil_print("CONFLICT %s\n", zName);
nConflict++;
zOp = "CONFLICT";
nc = 1;
zErrMsg = "duplicate file";
}else if( idt>0 && idv==0 ){
/* File added in the target. */
if( file_isfile_or_link(zFullPath, RepoFILE) ){
/* Name of backup file with Original content */
char *zOrig = file_newname(zFullPath, "original", 1);
/* Backup previously unanaged file before to be overwritten */
file_copy(zFullPath, zOrig);
fossil_free(zOrig);
fossil_print("ADD %s - overwrites an unmanaged file", zName);
if( !dryRunFlag ) fossil_print(", original copy backed up locally");
|
| ︙ | ︙ |
Changes to src/vfile.c.
| ︙ | ︙ | |||
209 210 211 212 213 214 215 |
#ifndef _WIN32
origPerm = db_column_int(&q, 8);
currentPerm = file_perm(zName, RepoFILE);
#endif
if( chnged==0 && (isDeleted || rid==0) ){
/* "fossil rm" or "fossil add" always change the file */
chnged = 1;
| | | 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 |
#ifndef _WIN32
origPerm = db_column_int(&q, 8);
currentPerm = file_perm(zName, RepoFILE);
#endif
if( chnged==0 && (isDeleted || rid==0) ){
/* "fossil rm" or "fossil add" always change the file */
chnged = 1;
}else if( !file_isfile_or_link(0, RepoFILE) && currentSize>=0 ){
if( cksigFlags & CKSIG_ENOTFILE ){
fossil_warning("not an ordinary file: %s", zName);
nErr++;
}
chnged = 1;
}
if( origSize!=currentSize ){
|
| ︙ | ︙ | |||
535 536 537 538 539 540 541 |
}else if( file_isdir(zPath, eFType)==1 ){
#endif
if( !vfile_top_of_checkout(zPath) ){
vfile_scan(pPath, nPrefix, scanFlags, pIgnore1, pIgnore2, eFType);
}
#ifdef _DIRENT_HAVE_D_TYPE
}else if( (pEntry->d_type==DT_UNKNOWN || pEntry->d_type==DT_LNK)
| | | | 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 |
}else if( file_isdir(zPath, eFType)==1 ){
#endif
if( !vfile_top_of_checkout(zPath) ){
vfile_scan(pPath, nPrefix, scanFlags, pIgnore1, pIgnore2, eFType);
}
#ifdef _DIRENT_HAVE_D_TYPE
}else if( (pEntry->d_type==DT_UNKNOWN || pEntry->d_type==DT_LNK)
? (file_isfile_or_link(zPath, eFType)) : (pEntry->d_type==DT_REG) ){
#else
}else if( file_isfile_or_link(zPath, eFType) ){
#endif
if( (scanFlags & SCAN_TEMP)==0 || is_temporary_file(zUtf8) ){
db_bind_text(&ins, ":file", &zPath[nPrefix+1]);
if( scanFlags & SCAN_MTIME ){
db_bind_int(&ins, ":mtime", file_mtime(zPath, eFType));
}
if( scanFlags & SCAN_SIZE ){
|
| ︙ | ︙ | |||
667 668 669 670 671 672 673 |
db_step(&ins);
db_reset(&ins);
fossil_free(zSavePath);
result += count; /* found X normal files? */
}
#ifdef _DIRENT_HAVE_D_TYPE
}else if( (pEntry->d_type==DT_UNKNOWN || pEntry->d_type==DT_LNK)
| | | | 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 |
db_step(&ins);
db_reset(&ins);
fossil_free(zSavePath);
result += count; /* found X normal files? */
}
#ifdef _DIRENT_HAVE_D_TYPE
}else if( (pEntry->d_type==DT_UNKNOWN || pEntry->d_type==DT_LNK)
? (file_isfile_or_link(zPath, eFType)) : (pEntry->d_type==DT_REG) ){
#else
}else if( file_isfile_or_link(zPath, eFType) ){
#endif
db_bind_text(&upd, ":file", zOrigPath);
db_step(&upd);
db_reset(&upd);
result++; /* found 1 normal file */
}
fossil_path_free(zUtf8);
|
| ︙ | ︙ |