Fossil SCM

Do not silently overwrite existing files when doing 'mv --hard'.

danield 2025-04-01 15:38 trunk
Commit 31e75c3a413a7201d043500415c405f4602f24bf67c8235b450ff31725c013d6
1 file changed +9 -2
+9 -2
--- src/add.c
+++ src/add.c
@@ -896,11 +896,12 @@
896896
*/
897897
static void mv_one_file(
898898
int vid,
899899
const char *zOrig,
900900
const char *zNew,
901
- int dryRunFlag
901
+ int dryRunFlag,
902
+ int moveFiles
902903
){
903904
int x = db_int(-1, "SELECT deleted FROM vfile WHERE pathname=%Q %s",
904905
zNew, filename_collation());
905906
if( x>=0 ){
906907
if( x==0 ){
@@ -912,10 +913,16 @@
912913
}
913914
}else{
914915
fossil_fatal("cannot rename '%s' to '%s' since the delete of '%s' has "
915916
"not yet been committed", zOrig, zNew, zNew);
916917
}
918
+ }
919
+ if( moveFiles ){
920
+ if( file_size(zNew, ExtFILE) != -1 ){
921
+ fossil_fatal("cannot rename '%s' to '%s' on disk since another file"
922
+ " named '%s' already exists", zOrig, zNew, zNew);
923
+ }
917924
}
918925
fossil_print("RENAME %s %s\n", zOrig, zNew);
919926
if( !dryRunFlag ){
920927
db_multi_exec(
921928
"UPDATE vfile SET pathname='%q' WHERE pathname='%q' %s AND vid=%d",
@@ -1135,11 +1142,11 @@
11351142
}
11361143
db_prepare(&q, "SELECT f, t FROM mv ORDER BY f");
11371144
while( db_step(&q)==SQLITE_ROW ){
11381145
const char *zFrom = db_column_text(&q, 0);
11391146
const char *zTo = db_column_text(&q, 1);
1140
- mv_one_file(vid, zFrom, zTo, dryRunFlag);
1147
+ mv_one_file(vid, zFrom, zTo, dryRunFlag, moveFiles);
11411148
if( moveFiles ) add_file_to_move(zFrom, zTo);
11421149
}
11431150
db_finalize(&q);
11441151
undo_reset();
11451152
db_end_transaction(0);
11461153
--- src/add.c
+++ src/add.c
@@ -896,11 +896,12 @@
896 */
897 static void mv_one_file(
898 int vid,
899 const char *zOrig,
900 const char *zNew,
901 int dryRunFlag
 
902 ){
903 int x = db_int(-1, "SELECT deleted FROM vfile WHERE pathname=%Q %s",
904 zNew, filename_collation());
905 if( x>=0 ){
906 if( x==0 ){
@@ -912,10 +913,16 @@
912 }
913 }else{
914 fossil_fatal("cannot rename '%s' to '%s' since the delete of '%s' has "
915 "not yet been committed", zOrig, zNew, zNew);
916 }
 
 
 
 
 
 
917 }
918 fossil_print("RENAME %s %s\n", zOrig, zNew);
919 if( !dryRunFlag ){
920 db_multi_exec(
921 "UPDATE vfile SET pathname='%q' WHERE pathname='%q' %s AND vid=%d",
@@ -1135,11 +1142,11 @@
1135 }
1136 db_prepare(&q, "SELECT f, t FROM mv ORDER BY f");
1137 while( db_step(&q)==SQLITE_ROW ){
1138 const char *zFrom = db_column_text(&q, 0);
1139 const char *zTo = db_column_text(&q, 1);
1140 mv_one_file(vid, zFrom, zTo, dryRunFlag);
1141 if( moveFiles ) add_file_to_move(zFrom, zTo);
1142 }
1143 db_finalize(&q);
1144 undo_reset();
1145 db_end_transaction(0);
1146
--- src/add.c
+++ src/add.c
@@ -896,11 +896,12 @@
896 */
897 static void mv_one_file(
898 int vid,
899 const char *zOrig,
900 const char *zNew,
901 int dryRunFlag,
902 int moveFiles
903 ){
904 int x = db_int(-1, "SELECT deleted FROM vfile WHERE pathname=%Q %s",
905 zNew, filename_collation());
906 if( x>=0 ){
907 if( x==0 ){
@@ -912,10 +913,16 @@
913 }
914 }else{
915 fossil_fatal("cannot rename '%s' to '%s' since the delete of '%s' has "
916 "not yet been committed", zOrig, zNew, zNew);
917 }
918 }
919 if( moveFiles ){
920 if( file_size(zNew, ExtFILE) != -1 ){
921 fossil_fatal("cannot rename '%s' to '%s' on disk since another file"
922 " named '%s' already exists", zOrig, zNew, zNew);
923 }
924 }
925 fossil_print("RENAME %s %s\n", zOrig, zNew);
926 if( !dryRunFlag ){
927 db_multi_exec(
928 "UPDATE vfile SET pathname='%q' WHERE pathname='%q' %s AND vid=%d",
@@ -1135,11 +1142,11 @@
1142 }
1143 db_prepare(&q, "SELECT f, t FROM mv ORDER BY f");
1144 while( db_step(&q)==SQLITE_ROW ){
1145 const char *zFrom = db_column_text(&q, 0);
1146 const char *zTo = db_column_text(&q, 1);
1147 mv_one_file(vid, zFrom, zTo, dryRunFlag, moveFiles);
1148 if( moveFiles ) add_file_to_move(zFrom, zTo);
1149 }
1150 db_finalize(&q);
1151 undo_reset();
1152 db_end_transaction(0);
1153

Keyboard Shortcuts

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