Fossil SCM
Fix the "mv" command so that it will move directories. Patch from Dingyuan Wang.
Commit
0a34967beb57cfa1f86d8e16579307743e8a3be2dd3eadbac56b543fa310c440
Parent
a7056e6499407c3…
1 file changed
+16
-4
+16
-4
| --- src/add.c | ||
| +++ src/add.c | ||
| @@ -859,10 +859,12 @@ | ||
| 859 | 859 | int vid; |
| 860 | 860 | int moveFiles; |
| 861 | 861 | int dryRunFlag; |
| 862 | 862 | int softFlag; |
| 863 | 863 | int hardFlag; |
| 864 | + int origType; | |
| 865 | + int destType; | |
| 864 | 866 | char *zDest; |
| 865 | 867 | Blob dest; |
| 866 | 868 | Stmt q; |
| 867 | 869 | |
| 868 | 870 | db_must_be_within_tree(); |
| @@ -900,15 +902,23 @@ | ||
| 900 | 902 | "UPDATE vfile SET origname=pathname WHERE origname IS NULL;" |
| 901 | 903 | ); |
| 902 | 904 | db_multi_exec( |
| 903 | 905 | "CREATE TEMP TABLE mv(f TEXT UNIQUE ON CONFLICT IGNORE, t TEXT);" |
| 904 | 906 | ); |
| 905 | - if( file_isdir(zDest, RepoFILE)!=1 ){ | |
| 907 | + if( g.argc!=4 ){ | |
| 908 | + origType = -1; | |
| 909 | + }else{ | |
| 910 | + origType = (file_isdir(g.argv[2], RepoFILE) == 1); | |
| 911 | + } | |
| 912 | + destType = file_isdir(zDest, RepoFILE); | |
| 913 | + if( origType==-1 && destType!=1 ){ | |
| 914 | + usage("OLDNAME NEWNAME"); | |
| 915 | + }else if( origType==1 && destType==2 ){ | |
| 916 | + fossil_fatal("cannot rename '%s' to '%s' since another file named" | |
| 917 | + " '%s' exists", g.argv[2], zDest, zDest); | |
| 918 | + }else if( origType==0 && destType!=1 ){ | |
| 906 | 919 | Blob orig; |
| 907 | - if( g.argc!=4 ){ | |
| 908 | - usage("OLDNAME NEWNAME"); | |
| 909 | - } | |
| 910 | 920 | file_tree_name(g.argv[2], &orig, 0, 1); |
| 911 | 921 | db_multi_exec( |
| 912 | 922 | "INSERT INTO mv VALUES(%B,%B)", &orig, &dest |
| 913 | 923 | ); |
| 914 | 924 | }else{ |
| @@ -936,10 +946,12 @@ | ||
| 936 | 946 | const char *zPath = db_column_text(&q, 0); |
| 937 | 947 | int nPath = db_column_bytes(&q, 0); |
| 938 | 948 | const char *zTail; |
| 939 | 949 | if( nPath==nOrig ){ |
| 940 | 950 | zTail = file_tail(zPath); |
| 951 | + }else if( destType==1 ){ | |
| 952 | + zTail = &zPath[nOrig-strlen(file_tail(zOrig))]; | |
| 941 | 953 | }else{ |
| 942 | 954 | zTail = &zPath[nOrig+1]; |
| 943 | 955 | } |
| 944 | 956 | db_multi_exec( |
| 945 | 957 | "INSERT INTO mv VALUES('%q','%q%q')", |
| 946 | 958 |
| --- src/add.c | |
| +++ src/add.c | |
| @@ -859,10 +859,12 @@ | |
| 859 | int vid; |
| 860 | int moveFiles; |
| 861 | int dryRunFlag; |
| 862 | int softFlag; |
| 863 | int hardFlag; |
| 864 | char *zDest; |
| 865 | Blob dest; |
| 866 | Stmt q; |
| 867 | |
| 868 | db_must_be_within_tree(); |
| @@ -900,15 +902,23 @@ | |
| 900 | "UPDATE vfile SET origname=pathname WHERE origname IS NULL;" |
| 901 | ); |
| 902 | db_multi_exec( |
| 903 | "CREATE TEMP TABLE mv(f TEXT UNIQUE ON CONFLICT IGNORE, t TEXT);" |
| 904 | ); |
| 905 | if( file_isdir(zDest, RepoFILE)!=1 ){ |
| 906 | Blob orig; |
| 907 | if( g.argc!=4 ){ |
| 908 | usage("OLDNAME NEWNAME"); |
| 909 | } |
| 910 | file_tree_name(g.argv[2], &orig, 0, 1); |
| 911 | db_multi_exec( |
| 912 | "INSERT INTO mv VALUES(%B,%B)", &orig, &dest |
| 913 | ); |
| 914 | }else{ |
| @@ -936,10 +946,12 @@ | |
| 936 | const char *zPath = db_column_text(&q, 0); |
| 937 | int nPath = db_column_bytes(&q, 0); |
| 938 | const char *zTail; |
| 939 | if( nPath==nOrig ){ |
| 940 | zTail = file_tail(zPath); |
| 941 | }else{ |
| 942 | zTail = &zPath[nOrig+1]; |
| 943 | } |
| 944 | db_multi_exec( |
| 945 | "INSERT INTO mv VALUES('%q','%q%q')", |
| 946 |
| --- src/add.c | |
| +++ src/add.c | |
| @@ -859,10 +859,12 @@ | |
| 859 | int vid; |
| 860 | int moveFiles; |
| 861 | int dryRunFlag; |
| 862 | int softFlag; |
| 863 | int hardFlag; |
| 864 | int origType; |
| 865 | int destType; |
| 866 | char *zDest; |
| 867 | Blob dest; |
| 868 | Stmt q; |
| 869 | |
| 870 | db_must_be_within_tree(); |
| @@ -900,15 +902,23 @@ | |
| 902 | "UPDATE vfile SET origname=pathname WHERE origname IS NULL;" |
| 903 | ); |
| 904 | db_multi_exec( |
| 905 | "CREATE TEMP TABLE mv(f TEXT UNIQUE ON CONFLICT IGNORE, t TEXT);" |
| 906 | ); |
| 907 | if( g.argc!=4 ){ |
| 908 | origType = -1; |
| 909 | }else{ |
| 910 | origType = (file_isdir(g.argv[2], RepoFILE) == 1); |
| 911 | } |
| 912 | destType = file_isdir(zDest, RepoFILE); |
| 913 | if( origType==-1 && destType!=1 ){ |
| 914 | usage("OLDNAME NEWNAME"); |
| 915 | }else if( origType==1 && destType==2 ){ |
| 916 | fossil_fatal("cannot rename '%s' to '%s' since another file named" |
| 917 | " '%s' exists", g.argv[2], zDest, zDest); |
| 918 | }else if( origType==0 && destType!=1 ){ |
| 919 | Blob orig; |
| 920 | file_tree_name(g.argv[2], &orig, 0, 1); |
| 921 | db_multi_exec( |
| 922 | "INSERT INTO mv VALUES(%B,%B)", &orig, &dest |
| 923 | ); |
| 924 | }else{ |
| @@ -936,10 +946,12 @@ | |
| 946 | const char *zPath = db_column_text(&q, 0); |
| 947 | int nPath = db_column_bytes(&q, 0); |
| 948 | const char *zTail; |
| 949 | if( nPath==nOrig ){ |
| 950 | zTail = file_tail(zPath); |
| 951 | }else if( destType==1 ){ |
| 952 | zTail = &zPath[nOrig-strlen(file_tail(zOrig))]; |
| 953 | }else{ |
| 954 | zTail = &zPath[nOrig+1]; |
| 955 | } |
| 956 | db_multi_exec( |
| 957 | "INSERT INTO mv VALUES('%q','%q%q')", |
| 958 |