Fossil SCM

Fix the "mv" command so that it will move directories. Patch from Dingyuan Wang.

drh 2018-05-29 14:23 trunk
Commit 0a34967beb57cfa1f86d8e16579307743e8a3be2dd3eadbac56b543fa310c440
1 file changed +16 -4
+16 -4
--- src/add.c
+++ src/add.c
@@ -859,10 +859,12 @@
859859
int vid;
860860
int moveFiles;
861861
int dryRunFlag;
862862
int softFlag;
863863
int hardFlag;
864
+ int origType;
865
+ int destType;
864866
char *zDest;
865867
Blob dest;
866868
Stmt q;
867869
868870
db_must_be_within_tree();
@@ -900,15 +902,23 @@
900902
"UPDATE vfile SET origname=pathname WHERE origname IS NULL;"
901903
);
902904
db_multi_exec(
903905
"CREATE TEMP TABLE mv(f TEXT UNIQUE ON CONFLICT IGNORE, t TEXT);"
904906
);
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 ){
906919
Blob orig;
907
- if( g.argc!=4 ){
908
- usage("OLDNAME NEWNAME");
909
- }
910920
file_tree_name(g.argv[2], &orig, 0, 1);
911921
db_multi_exec(
912922
"INSERT INTO mv VALUES(%B,%B)", &orig, &dest
913923
);
914924
}else{
@@ -936,10 +946,12 @@
936946
const char *zPath = db_column_text(&q, 0);
937947
int nPath = db_column_bytes(&q, 0);
938948
const char *zTail;
939949
if( nPath==nOrig ){
940950
zTail = file_tail(zPath);
951
+ }else if( destType==1 ){
952
+ zTail = &zPath[nOrig-strlen(file_tail(zOrig))];
941953
}else{
942954
zTail = &zPath[nOrig+1];
943955
}
944956
db_multi_exec(
945957
"INSERT INTO mv VALUES('%q','%q%q')",
946958
--- 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

Keyboard Shortcuts

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