Fossil SCM
Do not silently overwrite existing files when doing 'mv --hard'.
Commit
31e75c3a413a7201d043500415c405f4602f24bf67c8235b450ff31725c013d6
Parent
0d41eb4790df995…
1 file changed
+9
-2
+9
-2
| --- src/add.c | ||
| +++ src/add.c | ||
| @@ -896,11 +896,12 @@ | ||
| 896 | 896 | */ |
| 897 | 897 | static void mv_one_file( |
| 898 | 898 | int vid, |
| 899 | 899 | const char *zOrig, |
| 900 | 900 | const char *zNew, |
| 901 | - int dryRunFlag | |
| 901 | + int dryRunFlag, | |
| 902 | + int moveFiles | |
| 902 | 903 | ){ |
| 903 | 904 | int x = db_int(-1, "SELECT deleted FROM vfile WHERE pathname=%Q %s", |
| 904 | 905 | zNew, filename_collation()); |
| 905 | 906 | if( x>=0 ){ |
| 906 | 907 | if( x==0 ){ |
| @@ -912,10 +913,16 @@ | ||
| 912 | 913 | } |
| 913 | 914 | }else{ |
| 914 | 915 | fossil_fatal("cannot rename '%s' to '%s' since the delete of '%s' has " |
| 915 | 916 | "not yet been committed", zOrig, zNew, zNew); |
| 916 | 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 | + } | |
| 917 | 924 | } |
| 918 | 925 | fossil_print("RENAME %s %s\n", zOrig, zNew); |
| 919 | 926 | if( !dryRunFlag ){ |
| 920 | 927 | db_multi_exec( |
| 921 | 928 | "UPDATE vfile SET pathname='%q' WHERE pathname='%q' %s AND vid=%d", |
| @@ -1135,11 +1142,11 @@ | ||
| 1135 | 1142 | } |
| 1136 | 1143 | db_prepare(&q, "SELECT f, t FROM mv ORDER BY f"); |
| 1137 | 1144 | while( db_step(&q)==SQLITE_ROW ){ |
| 1138 | 1145 | const char *zFrom = db_column_text(&q, 0); |
| 1139 | 1146 | 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); | |
| 1141 | 1148 | if( moveFiles ) add_file_to_move(zFrom, zTo); |
| 1142 | 1149 | } |
| 1143 | 1150 | db_finalize(&q); |
| 1144 | 1151 | undo_reset(); |
| 1145 | 1152 | db_end_transaction(0); |
| 1146 | 1153 |
| --- 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 |