Fossil SCM
Fix bug when deleting whole folder
Commit
05537c6fc04045f423ceba6e15c8dd4929efe574
Parent
f67cb93fa661208…
1 file changed
+21
-12
+21
-12
| --- src/import.c | ||
| +++ src/import.c | ||
| @@ -921,10 +921,13 @@ | ||
| 921 | 921 | db_static_prepare(&qTags, "SELECT ttag FROM xtags WHERE trev=:rev"); |
| 922 | 922 | if( !gsvn.flatFlag ){ |
| 923 | 923 | if( gsvn.parent<0 ){ |
| 924 | 924 | gsvn.parent = db_int(-1, "SELECT ifnull(max(trev),-1) FROM xrevisions " |
| 925 | 925 | "WHERE tbranch=%Q", gsvn.zBranch); |
| 926 | + if( gsvn.parent<0 ){ | |
| 927 | + gsvn.parent = db_int(-1, "SELECT ifnull(max(trev),-1) FROM xrevisions"); | |
| 928 | + } | |
| 926 | 929 | } |
| 927 | 930 | db_bind_int(&insRev, ":rev", gsvn.rev); |
| 928 | 931 | db_bind_text(&insRev, ":branch", gsvn.zBranch); |
| 929 | 932 | db_bind_int(&insRev, ":rid", 0); |
| 930 | 933 | db_step(&insRev); |
| @@ -940,17 +943,17 @@ | ||
| 940 | 943 | }else{ |
| 941 | 944 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| 942 | 945 | } |
| 943 | 946 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 944 | 947 | nBaseFilter = blob_size(&gsvn.filter); |
| 945 | - if( strcmp(gsvn.zBranch, gsvn.zTrunk)==0 ){ | |
| 948 | + if( strncmp(gsvn.zBranch, gsvn.zTrunk, gsvn.lenTrunk-1)==0 ){ | |
| 946 | 949 | blob_appendf(&gsvn.filter, "%s*", gsvn.zTrunk); |
| 947 | 950 | }else{ |
| 948 | 951 | blob_appendf(&gsvn.filter, "%s%s/*", gsvn.zBranches, gsvn.zBranch); |
| 949 | 952 | } |
| 950 | 953 | db_bind_text(&qFiles, ":filter", blob_str(&gsvn.filter)); |
| 951 | - nFilter = blob_size(&gsvn.filter); | |
| 954 | + nFilter = blob_size(&gsvn.filter)-1; | |
| 952 | 955 | while( db_step(&qFiles)==SQLITE_ROW ){ |
| 953 | 956 | const char *zFile = db_column_text(&qFiles, 0); |
| 954 | 957 | int rid = db_column_int(&qFiles, 1); |
| 955 | 958 | const char *zPerm = db_column_text(&qFiles, 2); |
| 956 | 959 | const char *zUuid; |
| @@ -966,13 +969,13 @@ | ||
| 966 | 969 | zParentUuid = db_column_text(&qParent, 0); |
| 967 | 970 | blob_appendf(&manifest, "P %s\n", zParentUuid); |
| 968 | 971 | if( !gsvn.flatFlag ){ |
| 969 | 972 | zParentBranch = db_column_text(&qParent, 1); |
| 970 | 973 | if( strcmp(gsvn.zBranch, zParentBranch)!=0 ){ |
| 971 | - blob_appendf(&manifest, "T *branch * %s\n", gsvn.zBranch); | |
| 972 | - blob_appendf(&manifest, "T *sym-%s *\n", gsvn.zBranch); | |
| 973 | - zParentBranch = mprintf("%s", zParentBranch); | |
| 974 | + blob_appendf(&manifest, "T *branch * %F\n", gsvn.zBranch); | |
| 975 | + blob_appendf(&manifest, "T *sym-%F *\n", gsvn.zBranch); | |
| 976 | + zParentBranch = mprintf("%F", zParentBranch); | |
| 974 | 977 | }else{ |
| 975 | 978 | zParentBranch = 0; |
| 976 | 979 | } |
| 977 | 980 | } |
| 978 | 981 | }else{ |
| @@ -1069,10 +1072,11 @@ | ||
| 1069 | 1072 | const char *zTemp; |
| 1070 | 1073 | const char *zUuid; |
| 1071 | 1074 | Stmt addHist; |
| 1072 | 1075 | Stmt insTag; |
| 1073 | 1076 | Stmt cpyPath; |
| 1077 | + Stmt delPath; | |
| 1074 | 1078 | int bHasFiles; |
| 1075 | 1079 | |
| 1076 | 1080 | /* version */ |
| 1077 | 1081 | if( svn_read_rec(pIn, &rec) |
| 1078 | 1082 | && (zTemp = svn_find_header(rec, "SVN-fs-dump-format-version")) ){ |
| @@ -1100,11 +1104,16 @@ | ||
| 1100 | 1104 | " SELECT tpath, trid, tperm, max(trev) trev FROM xhist" |
| 1101 | 1105 | " WHERE trev<=:srcrev GROUP BY tpath" |
| 1102 | 1106 | " ) WHERE trid NOTNULL)" |
| 1103 | 1107 | "INSERT INTO xhist (trev, tpath, trid, tperm)" |
| 1104 | 1108 | " SELECT :rev, :path||substr(tpath, length(:srcpath)+1), trid, tperm" |
| 1105 | - " FROM xsrc WHERE tpath>:srcpath||'/' AND tpath<:srcpath||0" | |
| 1109 | + " FROM xsrc WHERE tpath>:srcpath||'/' AND tpath<:srcpath||'0'" | |
| 1110 | + ); | |
| 1111 | + db_prepare(&delPath, | |
| 1112 | + "INSERT INTO xhist (trev, tpath, trid, tperm)" | |
| 1113 | + " SELECT :rev, tpath, NULL, NULL" | |
| 1114 | + " FROM xfiles WHERE (tpath>:path||'/' AND tpath<:path||'0') OR tpath=:path" | |
| 1106 | 1115 | ); |
| 1107 | 1116 | gsvn.rev = -1; |
| 1108 | 1117 | while( svn_read_rec(pIn, &rec) ){ |
| 1109 | 1118 | if( (zTemp = svn_find_header(rec, "Revision-number")) ){ /* revision node */ |
| 1110 | 1119 | /* finish previous revision */ |
| @@ -1124,10 +1133,11 @@ | ||
| 1124 | 1133 | gsvn.zBranch = 0; |
| 1125 | 1134 | bHasFiles = 0; |
| 1126 | 1135 | fossil_print("\rImporting SVN revision: %d", gsvn.rev); |
| 1127 | 1136 | db_bind_int(&addHist, ":rev", gsvn.rev); |
| 1128 | 1137 | db_bind_int(&cpyPath, ":rev", gsvn.rev); |
| 1138 | + db_bind_int(&delPath, ":rev", gsvn.rev); | |
| 1129 | 1139 | }else |
| 1130 | 1140 | if( (zTemp = svn_find_header(rec, "Node-path")) ){ /* file/dir node */ |
| 1131 | 1141 | const char *zPath = zTemp; |
| 1132 | 1142 | const char *zAction = svn_find_header(rec, "Node-action"); |
| 1133 | 1143 | const char *zKind = svn_find_header(rec, "Node-kind"); |
| @@ -1178,15 +1188,13 @@ | ||
| 1178 | 1188 | } |
| 1179 | 1189 | } |
| 1180 | 1190 | if( strncmp(zAction, "delete", 6)==0 |
| 1181 | 1191 | || strncmp(zAction, "replace", 7)==0 ) |
| 1182 | 1192 | { |
| 1183 | - db_bind_null(&addHist, ":rid"); | |
| 1184 | - db_bind_text(&addHist, ":path", zPath); | |
| 1185 | - db_bind_null(&addHist, ":perm"); | |
| 1186 | - db_step(&addHist); | |
| 1187 | - db_reset(&addHist); | |
| 1193 | + db_bind_text(&delPath, ":path", zPath); | |
| 1194 | + db_step(&delPath); | |
| 1195 | + db_reset(&delPath); | |
| 1188 | 1196 | } /* no 'else' here since 'replace' does both a 'delete' and an 'add' */ |
| 1189 | 1197 | if( strncmp(zAction, "add", 3)==0 |
| 1190 | 1198 | || strncmp(zAction, "replace", 7)==0 ) |
| 1191 | 1199 | { |
| 1192 | 1200 | if( zKind==0 ){ |
| @@ -1271,19 +1279,20 @@ | ||
| 1271 | 1279 | }else{ |
| 1272 | 1280 | fossil_fatal("Unknown record type"); |
| 1273 | 1281 | } |
| 1274 | 1282 | svn_free_rec(&rec); |
| 1275 | 1283 | } |
| 1276 | - if( gsvn.rev>0 ){ | |
| 1284 | + if( bHasFiles ){ | |
| 1277 | 1285 | svn_create_manifest(); |
| 1278 | 1286 | } |
| 1279 | 1287 | fossil_free(gsvn.zUser); |
| 1280 | 1288 | fossil_free(gsvn.zComment); |
| 1281 | 1289 | fossil_free(gsvn.zDate); |
| 1282 | 1290 | db_finalize(&addHist); |
| 1283 | 1291 | db_finalize(&insTag); |
| 1284 | 1292 | db_finalize(&cpyPath); |
| 1293 | + db_finalize(&delPath); | |
| 1285 | 1294 | fossil_print(" Done!\n"); |
| 1286 | 1295 | } |
| 1287 | 1296 | |
| 1288 | 1297 | /* |
| 1289 | 1298 | ** COMMAND: import |
| 1290 | 1299 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -921,10 +921,13 @@ | |
| 921 | db_static_prepare(&qTags, "SELECT ttag FROM xtags WHERE trev=:rev"); |
| 922 | if( !gsvn.flatFlag ){ |
| 923 | if( gsvn.parent<0 ){ |
| 924 | gsvn.parent = db_int(-1, "SELECT ifnull(max(trev),-1) FROM xrevisions " |
| 925 | "WHERE tbranch=%Q", gsvn.zBranch); |
| 926 | } |
| 927 | db_bind_int(&insRev, ":rev", gsvn.rev); |
| 928 | db_bind_text(&insRev, ":branch", gsvn.zBranch); |
| 929 | db_bind_int(&insRev, ":rid", 0); |
| 930 | db_step(&insRev); |
| @@ -940,17 +943,17 @@ | |
| 940 | }else{ |
| 941 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| 942 | } |
| 943 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 944 | nBaseFilter = blob_size(&gsvn.filter); |
| 945 | if( strcmp(gsvn.zBranch, gsvn.zTrunk)==0 ){ |
| 946 | blob_appendf(&gsvn.filter, "%s*", gsvn.zTrunk); |
| 947 | }else{ |
| 948 | blob_appendf(&gsvn.filter, "%s%s/*", gsvn.zBranches, gsvn.zBranch); |
| 949 | } |
| 950 | db_bind_text(&qFiles, ":filter", blob_str(&gsvn.filter)); |
| 951 | nFilter = blob_size(&gsvn.filter); |
| 952 | while( db_step(&qFiles)==SQLITE_ROW ){ |
| 953 | const char *zFile = db_column_text(&qFiles, 0); |
| 954 | int rid = db_column_int(&qFiles, 1); |
| 955 | const char *zPerm = db_column_text(&qFiles, 2); |
| 956 | const char *zUuid; |
| @@ -966,13 +969,13 @@ | |
| 966 | zParentUuid = db_column_text(&qParent, 0); |
| 967 | blob_appendf(&manifest, "P %s\n", zParentUuid); |
| 968 | if( !gsvn.flatFlag ){ |
| 969 | zParentBranch = db_column_text(&qParent, 1); |
| 970 | if( strcmp(gsvn.zBranch, zParentBranch)!=0 ){ |
| 971 | blob_appendf(&manifest, "T *branch * %s\n", gsvn.zBranch); |
| 972 | blob_appendf(&manifest, "T *sym-%s *\n", gsvn.zBranch); |
| 973 | zParentBranch = mprintf("%s", zParentBranch); |
| 974 | }else{ |
| 975 | zParentBranch = 0; |
| 976 | } |
| 977 | } |
| 978 | }else{ |
| @@ -1069,10 +1072,11 @@ | |
| 1069 | const char *zTemp; |
| 1070 | const char *zUuid; |
| 1071 | Stmt addHist; |
| 1072 | Stmt insTag; |
| 1073 | Stmt cpyPath; |
| 1074 | int bHasFiles; |
| 1075 | |
| 1076 | /* version */ |
| 1077 | if( svn_read_rec(pIn, &rec) |
| 1078 | && (zTemp = svn_find_header(rec, "SVN-fs-dump-format-version")) ){ |
| @@ -1100,11 +1104,16 @@ | |
| 1100 | " SELECT tpath, trid, tperm, max(trev) trev FROM xhist" |
| 1101 | " WHERE trev<=:srcrev GROUP BY tpath" |
| 1102 | " ) WHERE trid NOTNULL)" |
| 1103 | "INSERT INTO xhist (trev, tpath, trid, tperm)" |
| 1104 | " SELECT :rev, :path||substr(tpath, length(:srcpath)+1), trid, tperm" |
| 1105 | " FROM xsrc WHERE tpath>:srcpath||'/' AND tpath<:srcpath||0" |
| 1106 | ); |
| 1107 | gsvn.rev = -1; |
| 1108 | while( svn_read_rec(pIn, &rec) ){ |
| 1109 | if( (zTemp = svn_find_header(rec, "Revision-number")) ){ /* revision node */ |
| 1110 | /* finish previous revision */ |
| @@ -1124,10 +1133,11 @@ | |
| 1124 | gsvn.zBranch = 0; |
| 1125 | bHasFiles = 0; |
| 1126 | fossil_print("\rImporting SVN revision: %d", gsvn.rev); |
| 1127 | db_bind_int(&addHist, ":rev", gsvn.rev); |
| 1128 | db_bind_int(&cpyPath, ":rev", gsvn.rev); |
| 1129 | }else |
| 1130 | if( (zTemp = svn_find_header(rec, "Node-path")) ){ /* file/dir node */ |
| 1131 | const char *zPath = zTemp; |
| 1132 | const char *zAction = svn_find_header(rec, "Node-action"); |
| 1133 | const char *zKind = svn_find_header(rec, "Node-kind"); |
| @@ -1178,15 +1188,13 @@ | |
| 1178 | } |
| 1179 | } |
| 1180 | if( strncmp(zAction, "delete", 6)==0 |
| 1181 | || strncmp(zAction, "replace", 7)==0 ) |
| 1182 | { |
| 1183 | db_bind_null(&addHist, ":rid"); |
| 1184 | db_bind_text(&addHist, ":path", zPath); |
| 1185 | db_bind_null(&addHist, ":perm"); |
| 1186 | db_step(&addHist); |
| 1187 | db_reset(&addHist); |
| 1188 | } /* no 'else' here since 'replace' does both a 'delete' and an 'add' */ |
| 1189 | if( strncmp(zAction, "add", 3)==0 |
| 1190 | || strncmp(zAction, "replace", 7)==0 ) |
| 1191 | { |
| 1192 | if( zKind==0 ){ |
| @@ -1271,19 +1279,20 @@ | |
| 1271 | }else{ |
| 1272 | fossil_fatal("Unknown record type"); |
| 1273 | } |
| 1274 | svn_free_rec(&rec); |
| 1275 | } |
| 1276 | if( gsvn.rev>0 ){ |
| 1277 | svn_create_manifest(); |
| 1278 | } |
| 1279 | fossil_free(gsvn.zUser); |
| 1280 | fossil_free(gsvn.zComment); |
| 1281 | fossil_free(gsvn.zDate); |
| 1282 | db_finalize(&addHist); |
| 1283 | db_finalize(&insTag); |
| 1284 | db_finalize(&cpyPath); |
| 1285 | fossil_print(" Done!\n"); |
| 1286 | } |
| 1287 | |
| 1288 | /* |
| 1289 | ** COMMAND: import |
| 1290 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -921,10 +921,13 @@ | |
| 921 | db_static_prepare(&qTags, "SELECT ttag FROM xtags WHERE trev=:rev"); |
| 922 | if( !gsvn.flatFlag ){ |
| 923 | if( gsvn.parent<0 ){ |
| 924 | gsvn.parent = db_int(-1, "SELECT ifnull(max(trev),-1) FROM xrevisions " |
| 925 | "WHERE tbranch=%Q", gsvn.zBranch); |
| 926 | if( gsvn.parent<0 ){ |
| 927 | gsvn.parent = db_int(-1, "SELECT ifnull(max(trev),-1) FROM xrevisions"); |
| 928 | } |
| 929 | } |
| 930 | db_bind_int(&insRev, ":rev", gsvn.rev); |
| 931 | db_bind_text(&insRev, ":branch", gsvn.zBranch); |
| 932 | db_bind_int(&insRev, ":rid", 0); |
| 933 | db_step(&insRev); |
| @@ -940,17 +943,17 @@ | |
| 943 | }else{ |
| 944 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| 945 | } |
| 946 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 947 | nBaseFilter = blob_size(&gsvn.filter); |
| 948 | if( strncmp(gsvn.zBranch, gsvn.zTrunk, gsvn.lenTrunk-1)==0 ){ |
| 949 | blob_appendf(&gsvn.filter, "%s*", gsvn.zTrunk); |
| 950 | }else{ |
| 951 | blob_appendf(&gsvn.filter, "%s%s/*", gsvn.zBranches, gsvn.zBranch); |
| 952 | } |
| 953 | db_bind_text(&qFiles, ":filter", blob_str(&gsvn.filter)); |
| 954 | nFilter = blob_size(&gsvn.filter)-1; |
| 955 | while( db_step(&qFiles)==SQLITE_ROW ){ |
| 956 | const char *zFile = db_column_text(&qFiles, 0); |
| 957 | int rid = db_column_int(&qFiles, 1); |
| 958 | const char *zPerm = db_column_text(&qFiles, 2); |
| 959 | const char *zUuid; |
| @@ -966,13 +969,13 @@ | |
| 969 | zParentUuid = db_column_text(&qParent, 0); |
| 970 | blob_appendf(&manifest, "P %s\n", zParentUuid); |
| 971 | if( !gsvn.flatFlag ){ |
| 972 | zParentBranch = db_column_text(&qParent, 1); |
| 973 | if( strcmp(gsvn.zBranch, zParentBranch)!=0 ){ |
| 974 | blob_appendf(&manifest, "T *branch * %F\n", gsvn.zBranch); |
| 975 | blob_appendf(&manifest, "T *sym-%F *\n", gsvn.zBranch); |
| 976 | zParentBranch = mprintf("%F", zParentBranch); |
| 977 | }else{ |
| 978 | zParentBranch = 0; |
| 979 | } |
| 980 | } |
| 981 | }else{ |
| @@ -1069,10 +1072,11 @@ | |
| 1072 | const char *zTemp; |
| 1073 | const char *zUuid; |
| 1074 | Stmt addHist; |
| 1075 | Stmt insTag; |
| 1076 | Stmt cpyPath; |
| 1077 | Stmt delPath; |
| 1078 | int bHasFiles; |
| 1079 | |
| 1080 | /* version */ |
| 1081 | if( svn_read_rec(pIn, &rec) |
| 1082 | && (zTemp = svn_find_header(rec, "SVN-fs-dump-format-version")) ){ |
| @@ -1100,11 +1104,16 @@ | |
| 1104 | " SELECT tpath, trid, tperm, max(trev) trev FROM xhist" |
| 1105 | " WHERE trev<=:srcrev GROUP BY tpath" |
| 1106 | " ) WHERE trid NOTNULL)" |
| 1107 | "INSERT INTO xhist (trev, tpath, trid, tperm)" |
| 1108 | " SELECT :rev, :path||substr(tpath, length(:srcpath)+1), trid, tperm" |
| 1109 | " FROM xsrc WHERE tpath>:srcpath||'/' AND tpath<:srcpath||'0'" |
| 1110 | ); |
| 1111 | db_prepare(&delPath, |
| 1112 | "INSERT INTO xhist (trev, tpath, trid, tperm)" |
| 1113 | " SELECT :rev, tpath, NULL, NULL" |
| 1114 | " FROM xfiles WHERE (tpath>:path||'/' AND tpath<:path||'0') OR tpath=:path" |
| 1115 | ); |
| 1116 | gsvn.rev = -1; |
| 1117 | while( svn_read_rec(pIn, &rec) ){ |
| 1118 | if( (zTemp = svn_find_header(rec, "Revision-number")) ){ /* revision node */ |
| 1119 | /* finish previous revision */ |
| @@ -1124,10 +1133,11 @@ | |
| 1133 | gsvn.zBranch = 0; |
| 1134 | bHasFiles = 0; |
| 1135 | fossil_print("\rImporting SVN revision: %d", gsvn.rev); |
| 1136 | db_bind_int(&addHist, ":rev", gsvn.rev); |
| 1137 | db_bind_int(&cpyPath, ":rev", gsvn.rev); |
| 1138 | db_bind_int(&delPath, ":rev", gsvn.rev); |
| 1139 | }else |
| 1140 | if( (zTemp = svn_find_header(rec, "Node-path")) ){ /* file/dir node */ |
| 1141 | const char *zPath = zTemp; |
| 1142 | const char *zAction = svn_find_header(rec, "Node-action"); |
| 1143 | const char *zKind = svn_find_header(rec, "Node-kind"); |
| @@ -1178,15 +1188,13 @@ | |
| 1188 | } |
| 1189 | } |
| 1190 | if( strncmp(zAction, "delete", 6)==0 |
| 1191 | || strncmp(zAction, "replace", 7)==0 ) |
| 1192 | { |
| 1193 | db_bind_text(&delPath, ":path", zPath); |
| 1194 | db_step(&delPath); |
| 1195 | db_reset(&delPath); |
| 1196 | } /* no 'else' here since 'replace' does both a 'delete' and an 'add' */ |
| 1197 | if( strncmp(zAction, "add", 3)==0 |
| 1198 | || strncmp(zAction, "replace", 7)==0 ) |
| 1199 | { |
| 1200 | if( zKind==0 ){ |
| @@ -1271,19 +1279,20 @@ | |
| 1279 | }else{ |
| 1280 | fossil_fatal("Unknown record type"); |
| 1281 | } |
| 1282 | svn_free_rec(&rec); |
| 1283 | } |
| 1284 | if( bHasFiles ){ |
| 1285 | svn_create_manifest(); |
| 1286 | } |
| 1287 | fossil_free(gsvn.zUser); |
| 1288 | fossil_free(gsvn.zComment); |
| 1289 | fossil_free(gsvn.zDate); |
| 1290 | db_finalize(&addHist); |
| 1291 | db_finalize(&insTag); |
| 1292 | db_finalize(&cpyPath); |
| 1293 | db_finalize(&delPath); |
| 1294 | fossil_print(" Done!\n"); |
| 1295 | } |
| 1296 | |
| 1297 | /* |
| 1298 | ** COMMAND: import |
| 1299 |