Fossil SCM
On systems with case-insensitive filenames, allow "fossil rename OLD NEW" where OLD and NEW differ only in case.
Commit
fd2dbf436855e9e6fb74b980338a5cade5e83f76
Parent
22e0427b1048534…
1 file changed
+12
-4
+12
-4
| --- src/add.c | ||
| +++ src/add.c | ||
| @@ -713,12 +713,16 @@ | ||
| 713 | 713 | ){ |
| 714 | 714 | int x = db_int(-1, "SELECT deleted FROM vfile WHERE pathname=%Q %s", |
| 715 | 715 | zNew, filename_collation()); |
| 716 | 716 | if( x>=0 ){ |
| 717 | 717 | if( x==0 ){ |
| 718 | - fossil_fatal("cannot rename '%s' to '%s' since another file named '%s'" | |
| 719 | - " is currently under management", zOrig, zNew, zNew); | |
| 718 | + if( !filenames_are_case_sensitive() && fossil_stricmp(zOrig,zNew)==0 ){ | |
| 719 | + /* Case change only */ | |
| 720 | + }else{ | |
| 721 | + fossil_fatal("cannot rename '%s' to '%s' since another file named '%s'" | |
| 722 | + " is currently under management", zOrig, zNew, zNew); | |
| 723 | + } | |
| 720 | 724 | }else{ |
| 721 | 725 | fossil_fatal("cannot rename '%s' to '%s' since the delete of '%s' has " |
| 722 | 726 | "not yet been committed", zOrig, zNew, zNew); |
| 723 | 727 | } |
| 724 | 728 | } |
| @@ -743,19 +747,23 @@ | ||
| 743 | 747 | const char *zNewName /* The new name of the file on disk. */ |
| 744 | 748 | ){ |
| 745 | 749 | static int tableCreated = 0; |
| 746 | 750 | Blob fullOldName; |
| 747 | 751 | Blob fullNewName; |
| 752 | + char *zOld, *zNew; | |
| 748 | 753 | if( !tableCreated ){ |
| 749 | 754 | db_multi_exec("CREATE TEMP TABLE fmove(x TEXT PRIMARY KEY %s, y TEXT %s)", |
| 750 | 755 | filename_collation(), filename_collation()); |
| 751 | 756 | tableCreated = 1; |
| 752 | 757 | } |
| 753 | 758 | file_tree_name(zOldName, &fullOldName, 1, 1); |
| 759 | + zOld = blob_str(&fullOldName); | |
| 754 | 760 | file_tree_name(zNewName, &fullNewName, 1, 1); |
| 755 | - db_multi_exec("INSERT INTO fmove VALUES('%q','%q');", | |
| 756 | - blob_str(&fullOldName), blob_str(&fullNewName)); | |
| 761 | + zNew = blob_str(&fullNewName); | |
| 762 | + if( filenames_are_case_sensitive() || fossil_stricmp(zOld,zNew)!=0 ){ | |
| 763 | + db_multi_exec("INSERT INTO fmove VALUES('%q','%q');", zOld, zNew); | |
| 764 | + } | |
| 757 | 765 | blob_reset(&fullNewName); |
| 758 | 766 | blob_reset(&fullOldName); |
| 759 | 767 | } |
| 760 | 768 | |
| 761 | 769 | /* |
| 762 | 770 |
| --- src/add.c | |
| +++ src/add.c | |
| @@ -713,12 +713,16 @@ | |
| 713 | ){ |
| 714 | int x = db_int(-1, "SELECT deleted FROM vfile WHERE pathname=%Q %s", |
| 715 | zNew, filename_collation()); |
| 716 | if( x>=0 ){ |
| 717 | if( x==0 ){ |
| 718 | fossil_fatal("cannot rename '%s' to '%s' since another file named '%s'" |
| 719 | " is currently under management", zOrig, zNew, zNew); |
| 720 | }else{ |
| 721 | fossil_fatal("cannot rename '%s' to '%s' since the delete of '%s' has " |
| 722 | "not yet been committed", zOrig, zNew, zNew); |
| 723 | } |
| 724 | } |
| @@ -743,19 +747,23 @@ | |
| 743 | const char *zNewName /* The new name of the file on disk. */ |
| 744 | ){ |
| 745 | static int tableCreated = 0; |
| 746 | Blob fullOldName; |
| 747 | Blob fullNewName; |
| 748 | if( !tableCreated ){ |
| 749 | db_multi_exec("CREATE TEMP TABLE fmove(x TEXT PRIMARY KEY %s, y TEXT %s)", |
| 750 | filename_collation(), filename_collation()); |
| 751 | tableCreated = 1; |
| 752 | } |
| 753 | file_tree_name(zOldName, &fullOldName, 1, 1); |
| 754 | file_tree_name(zNewName, &fullNewName, 1, 1); |
| 755 | db_multi_exec("INSERT INTO fmove VALUES('%q','%q');", |
| 756 | blob_str(&fullOldName), blob_str(&fullNewName)); |
| 757 | blob_reset(&fullNewName); |
| 758 | blob_reset(&fullOldName); |
| 759 | } |
| 760 | |
| 761 | /* |
| 762 |
| --- src/add.c | |
| +++ src/add.c | |
| @@ -713,12 +713,16 @@ | |
| 713 | ){ |
| 714 | int x = db_int(-1, "SELECT deleted FROM vfile WHERE pathname=%Q %s", |
| 715 | zNew, filename_collation()); |
| 716 | if( x>=0 ){ |
| 717 | if( x==0 ){ |
| 718 | if( !filenames_are_case_sensitive() && fossil_stricmp(zOrig,zNew)==0 ){ |
| 719 | /* Case change only */ |
| 720 | }else{ |
| 721 | fossil_fatal("cannot rename '%s' to '%s' since another file named '%s'" |
| 722 | " is currently under management", zOrig, zNew, zNew); |
| 723 | } |
| 724 | }else{ |
| 725 | fossil_fatal("cannot rename '%s' to '%s' since the delete of '%s' has " |
| 726 | "not yet been committed", zOrig, zNew, zNew); |
| 727 | } |
| 728 | } |
| @@ -743,19 +747,23 @@ | |
| 747 | const char *zNewName /* The new name of the file on disk. */ |
| 748 | ){ |
| 749 | static int tableCreated = 0; |
| 750 | Blob fullOldName; |
| 751 | Blob fullNewName; |
| 752 | char *zOld, *zNew; |
| 753 | if( !tableCreated ){ |
| 754 | db_multi_exec("CREATE TEMP TABLE fmove(x TEXT PRIMARY KEY %s, y TEXT %s)", |
| 755 | filename_collation(), filename_collation()); |
| 756 | tableCreated = 1; |
| 757 | } |
| 758 | file_tree_name(zOldName, &fullOldName, 1, 1); |
| 759 | zOld = blob_str(&fullOldName); |
| 760 | file_tree_name(zNewName, &fullNewName, 1, 1); |
| 761 | zNew = blob_str(&fullNewName); |
| 762 | if( filenames_are_case_sensitive() || fossil_stricmp(zOld,zNew)!=0 ){ |
| 763 | db_multi_exec("INSERT INTO fmove VALUES('%q','%q');", zOld, zNew); |
| 764 | } |
| 765 | blob_reset(&fullNewName); |
| 766 | blob_reset(&fullOldName); |
| 767 | } |
| 768 | |
| 769 | /* |
| 770 |