Fossil SCM

fossil add can't add two files whose names only differ by an underscore or dash

Fixed

80d3ba8b0ff0098… · opened 16 years, 1 month ago

Type
Code_Defect
Priority
Severity
Severe
Resolution
Fixed
Subsystem
Created
Feb. 28, 2010 11:34 p.m.

the following steps reproduce this problem. in summary, when adding two files whose names differ only by a dash and underscore, e.g. a-1.txt and a_1.txt, only the file with the dash in its name will be added, even though fossil add reports that both were added. this test was conducted using powershell on windows 7 64 bit. i can test it on windows xp later this week. i don't have a non-windows box to test this on.

PS C:\rev\src> fossil new test.fossil
project-id: 9968296e3e87d77b514493152ecc682e94e015cc
server-id:  37ea13bc92c88ff92f41f5ec8c921a88eeca87a8
admin-user: rev (initial password is "4cabdf")
PS C:\rev\src> md test
PS C:\rev\src> cd test
PS C:\rev\src\test> fossil open ..\test.fossil
PS C:\rev\src\test> echo "hello" > a_1.txt
PS C:\rev\src\test> echo "goodbye" > a-1.txt
PS C:\rev\src\test> ls

    Directory: C:\rev\src\test

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         2/28/2010   6:23 PM         20 a-1.txt
-a---         2/28/2010   6:22 PM         16 a_1.txt
-a---         2/28/2010   6:22 PM       7168 _FOSSIL_

PS C:\rev\src\test> fossil add *.txt
ADDED  a-1.txt
ADDED  a_1.txt
PS C:\rev\src\test> fossil extras
a_1.txt
PS C:\rev\src\test> fossil ls
a-1.txt
PS C:\rev\src\test> fossil commit -m "underscore omitted"
New_Version: e6cb6574e973b8743701ec4e8f7cfaa61066c99a
PS C:\rev\src\test> fossil extras
a_1.txt
PS C:\rev\src\test> fossil ls
a-1.txt
PS C:\rev\src\test>

rwilson added on 2010-03-02 17:17:01:
in the windows build, fossil uses the LIKE operator to compensate for the fact that windows has a case-insensitive file system.

from add.c:

#ifdef __MINGW32__
    if( db_exists("SELECT 1 FROM vfile WHERE pathname LIKE %Q", zPath) ){
      db_multi_exec("UPDATE vfile SET deleted=0 WHERE pathname LIKE %Q", zPath);
    }
#else
    if( db_exists("SELECT 1 FROM vfile WHERE pathname=%Q", zPath) ){
      db_multi_exec("UPDATE vfile SET deleted=0 WHERE pathname=%Q", zPath);
    }
#endif

the problem is that LIKE treats dash and underscore oddly:

PS C:\Documents and Settings\ma088024> sqlite3
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table test (path);
sqlite> insert into test values("a-1.txt");
sqlite> insert into test values("a_1.txt");
sqlite> select * from test;
a-1.txt
a_1.txt
sqlite> select * from test where path like 'a-1.txt';
a-1.txt
sqlite> select * from test where path like 'a_1.txt';
a-1.txt
a_1.txt
sqlite> .quit

apparently, "-" is NOT LIKE "", but "" is LIKE "-". this latter condition results in the confusion that this ticket describes.


rwilson added on 2010-03-02 18:05:30:
sigh, '_' is a wildcard character in LIKE. using LIKE to compare files in fossil add proves problematic because underscores are valid characters in file names.

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button