Fossil SCM
support for deleted files
Commit
332788691888bea6a139488b5e89f2861d7a8138
Parent
bb1d783544b88de…
1 file changed
+26
-6
+26
-6
| --- src/import.c | ||
| +++ src/import.c | ||
| @@ -949,10 +949,11 @@ | ||
| 949 | 949 | int ver; |
| 950 | 950 | const char *zTemp; |
| 951 | 951 | const char *zUuid; |
| 952 | 952 | Stmt insRev; |
| 953 | 953 | Stmt insFile; |
| 954 | + Stmt delFile; | |
| 954 | 955 | int rev = 0; |
| 955 | 956 | |
| 956 | 957 | /* version */ |
| 957 | 958 | if( svn_read_rec(pIn, &rec) |
| 958 | 959 | && (zTemp = svn_find_header(rec, "SVN-fs-dump-format-version")) ){ |
| @@ -969,17 +970,21 @@ | ||
| 969 | 970 | fossil_fatal("Missing UUID!"); |
| 970 | 971 | } |
| 971 | 972 | svn_free_rec(&rec); |
| 972 | 973 | /* content */ |
| 973 | 974 | db_prepare(&insRev, |
| 974 | - "INSERT INTO xrevisions (trev, tuser, tmsg, ttime)" | |
| 975 | + "INSERT INTO xrevisions (trev, tuser, tmsg, ttime) " | |
| 975 | 976 | "VALUES(:rev, :user, :msg, :time)" |
| 976 | 977 | ); |
| 977 | 978 | db_prepare(&insFile, |
| 978 | - "INSERT INTO xfiles (trev, tpath, trid, tperm)" | |
| 979 | + "INSERT INTO xfiles (trev, tpath, trid, tperm) " | |
| 979 | 980 | "VALUES(:rev, :path, :rid, :perm)" |
| 980 | 981 | ); |
| 982 | + db_prepare(&delFile, | |
| 983 | + "DELETE FROM xfiles " | |
| 984 | + "WHERE trev=:rev AND (tpath=:path OR tpath GLOB :path || '/*')" | |
| 985 | + ); | |
| 981 | 986 | while( svn_read_rec(pIn, &rec) ){ |
| 982 | 987 | if( zTemp = svn_find_header(rec, "Revision-number") ){ |
| 983 | 988 | const char *zUser = svn_find_prop(rec, "svn:author"); |
| 984 | 989 | const char *zLog = svn_find_prop(rec, "svn:log"); |
| 985 | 990 | const char *zDate = svn_find_prop(rec, "svn:date"); |
| @@ -990,10 +995,15 @@ | ||
| 990 | 995 | db_bind_text(&insRev, ":msg", zLog); |
| 991 | 996 | db_bind_text(&insRev, ":time", zDate); |
| 992 | 997 | db_step(&insRev); |
| 993 | 998 | db_reset(&insRev); |
| 994 | 999 | fossil_free(zDate); |
| 1000 | + if( rev>0 ){ | |
| 1001 | + db_multi_exec("INSERT INTO xfiles (trev, tpath, trid, tperm) " | |
| 1002 | + "SELECT %d, tpath, trid, tperm FROM xfiles " | |
| 1003 | + "WHERE trev=%d", rev, rev-1); | |
| 1004 | + } | |
| 995 | 1005 | }else |
| 996 | 1006 | if( zTemp = svn_find_header(rec, "Node-path") ){ |
| 997 | 1007 | const char *zPath = zTemp; |
| 998 | 1008 | const char *zAction = svn_find_header(rec, "Node-action"); |
| 999 | 1009 | const char *zKind = svn_find_header(rec, "Node-kind"); |
| @@ -1003,13 +1013,17 @@ | ||
| 1003 | 1013 | int rid = 0; |
| 1004 | 1014 | if( zKind && strncmp(zKind, "dir", 3)==0 ){ |
| 1005 | 1015 | svn_free_rec(&rec); |
| 1006 | 1016 | continue; |
| 1007 | 1017 | } |
| 1008 | - zTemp = svn_find_header(rec, "Node-copyfrom-rev"); | |
| 1009 | - if( zTemp ){ | |
| 1010 | - srcRev = atoi(zTemp); | |
| 1018 | + if( zSrcPath ){ | |
| 1019 | + zTemp = svn_find_header(rec, "Node-copyfrom-rev"); | |
| 1020 | + if( zTemp ){ | |
| 1021 | + srcRev = atoi(zTemp); | |
| 1022 | + }else{ | |
| 1023 | + fossil_fatal("Missing copyfrom-rev"); | |
| 1024 | + } | |
| 1011 | 1025 | } |
| 1012 | 1026 | rid = content_put(&rec.content); |
| 1013 | 1027 | if( strncmp(zAction, "add", 3)==0 ){ |
| 1014 | 1028 | db_bind_int(&insFile, ":rev", rev); |
| 1015 | 1029 | db_bind_int(&insFile, ":rid", rid); |
| @@ -1025,10 +1039,14 @@ | ||
| 1025 | 1039 | db_bind_text(&insFile, ":perm", zPerm); |
| 1026 | 1040 | db_step(&insFile); |
| 1027 | 1041 | db_reset(&insFile); |
| 1028 | 1042 | }else |
| 1029 | 1043 | if( strncmp(zAction, "delete", 6)==0 ){ |
| 1044 | + db_bind_int(&delFile, ":rev", rev); | |
| 1045 | + db_bind_text(&delFile, ":path", zPath); | |
| 1046 | + db_step(&delFile); | |
| 1047 | + db_reset(&delFile); | |
| 1030 | 1048 | }else |
| 1031 | 1049 | if( strncmp(zAction, "replace", 7)==0 ){ |
| 1032 | 1050 | }else{ |
| 1033 | 1051 | } |
| 1034 | 1052 | }else{ |
| @@ -1037,10 +1055,11 @@ | ||
| 1037 | 1055 | svn_free_rec(&rec); |
| 1038 | 1056 | } |
| 1039 | 1057 | svn_create_manifests(); |
| 1040 | 1058 | db_finalize(&insRev); |
| 1041 | 1059 | db_finalize(&insFile); |
| 1060 | + db_finalize(&delFile); | |
| 1042 | 1061 | } |
| 1043 | 1062 | |
| 1044 | 1063 | /* |
| 1045 | 1064 | ** COMMAND: import |
| 1046 | 1065 | ** |
| @@ -1135,11 +1154,12 @@ | ||
| 1135 | 1154 | db_multi_exec( |
| 1136 | 1155 | "CREATE TEMP TABLE xrevisions(" |
| 1137 | 1156 | " trev INT, tuser TEXT, tmsg TEXT, ttime DATETIME" |
| 1138 | 1157 | ");" |
| 1139 | 1158 | "CREATE TEMP TABLE xfiles(" |
| 1140 | - " trev INT, tpath TEXT, trid TEXT, tperm TEXT" | |
| 1159 | + " trev INT, tpath TEXT, trid TEXT, tperm TEXT," | |
| 1160 | + " UNIQUE (trev, tpath) ON CONFLICT REPLACE" | |
| 1141 | 1161 | ");" |
| 1142 | 1162 | ); |
| 1143 | 1163 | |
| 1144 | 1164 | svn_dump_import(pIn); |
| 1145 | 1165 | } |
| 1146 | 1166 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -949,10 +949,11 @@ | |
| 949 | int ver; |
| 950 | const char *zTemp; |
| 951 | const char *zUuid; |
| 952 | Stmt insRev; |
| 953 | Stmt insFile; |
| 954 | int rev = 0; |
| 955 | |
| 956 | /* version */ |
| 957 | if( svn_read_rec(pIn, &rec) |
| 958 | && (zTemp = svn_find_header(rec, "SVN-fs-dump-format-version")) ){ |
| @@ -969,17 +970,21 @@ | |
| 969 | fossil_fatal("Missing UUID!"); |
| 970 | } |
| 971 | svn_free_rec(&rec); |
| 972 | /* content */ |
| 973 | db_prepare(&insRev, |
| 974 | "INSERT INTO xrevisions (trev, tuser, tmsg, ttime)" |
| 975 | "VALUES(:rev, :user, :msg, :time)" |
| 976 | ); |
| 977 | db_prepare(&insFile, |
| 978 | "INSERT INTO xfiles (trev, tpath, trid, tperm)" |
| 979 | "VALUES(:rev, :path, :rid, :perm)" |
| 980 | ); |
| 981 | while( svn_read_rec(pIn, &rec) ){ |
| 982 | if( zTemp = svn_find_header(rec, "Revision-number") ){ |
| 983 | const char *zUser = svn_find_prop(rec, "svn:author"); |
| 984 | const char *zLog = svn_find_prop(rec, "svn:log"); |
| 985 | const char *zDate = svn_find_prop(rec, "svn:date"); |
| @@ -990,10 +995,15 @@ | |
| 990 | db_bind_text(&insRev, ":msg", zLog); |
| 991 | db_bind_text(&insRev, ":time", zDate); |
| 992 | db_step(&insRev); |
| 993 | db_reset(&insRev); |
| 994 | fossil_free(zDate); |
| 995 | }else |
| 996 | if( zTemp = svn_find_header(rec, "Node-path") ){ |
| 997 | const char *zPath = zTemp; |
| 998 | const char *zAction = svn_find_header(rec, "Node-action"); |
| 999 | const char *zKind = svn_find_header(rec, "Node-kind"); |
| @@ -1003,13 +1013,17 @@ | |
| 1003 | int rid = 0; |
| 1004 | if( zKind && strncmp(zKind, "dir", 3)==0 ){ |
| 1005 | svn_free_rec(&rec); |
| 1006 | continue; |
| 1007 | } |
| 1008 | zTemp = svn_find_header(rec, "Node-copyfrom-rev"); |
| 1009 | if( zTemp ){ |
| 1010 | srcRev = atoi(zTemp); |
| 1011 | } |
| 1012 | rid = content_put(&rec.content); |
| 1013 | if( strncmp(zAction, "add", 3)==0 ){ |
| 1014 | db_bind_int(&insFile, ":rev", rev); |
| 1015 | db_bind_int(&insFile, ":rid", rid); |
| @@ -1025,10 +1039,14 @@ | |
| 1025 | db_bind_text(&insFile, ":perm", zPerm); |
| 1026 | db_step(&insFile); |
| 1027 | db_reset(&insFile); |
| 1028 | }else |
| 1029 | if( strncmp(zAction, "delete", 6)==0 ){ |
| 1030 | }else |
| 1031 | if( strncmp(zAction, "replace", 7)==0 ){ |
| 1032 | }else{ |
| 1033 | } |
| 1034 | }else{ |
| @@ -1037,10 +1055,11 @@ | |
| 1037 | svn_free_rec(&rec); |
| 1038 | } |
| 1039 | svn_create_manifests(); |
| 1040 | db_finalize(&insRev); |
| 1041 | db_finalize(&insFile); |
| 1042 | } |
| 1043 | |
| 1044 | /* |
| 1045 | ** COMMAND: import |
| 1046 | ** |
| @@ -1135,11 +1154,12 @@ | |
| 1135 | db_multi_exec( |
| 1136 | "CREATE TEMP TABLE xrevisions(" |
| 1137 | " trev INT, tuser TEXT, tmsg TEXT, ttime DATETIME" |
| 1138 | ");" |
| 1139 | "CREATE TEMP TABLE xfiles(" |
| 1140 | " trev INT, tpath TEXT, trid TEXT, tperm TEXT" |
| 1141 | ");" |
| 1142 | ); |
| 1143 | |
| 1144 | svn_dump_import(pIn); |
| 1145 | } |
| 1146 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -949,10 +949,11 @@ | |
| 949 | int ver; |
| 950 | const char *zTemp; |
| 951 | const char *zUuid; |
| 952 | Stmt insRev; |
| 953 | Stmt insFile; |
| 954 | Stmt delFile; |
| 955 | int rev = 0; |
| 956 | |
| 957 | /* version */ |
| 958 | if( svn_read_rec(pIn, &rec) |
| 959 | && (zTemp = svn_find_header(rec, "SVN-fs-dump-format-version")) ){ |
| @@ -969,17 +970,21 @@ | |
| 970 | fossil_fatal("Missing UUID!"); |
| 971 | } |
| 972 | svn_free_rec(&rec); |
| 973 | /* content */ |
| 974 | db_prepare(&insRev, |
| 975 | "INSERT INTO xrevisions (trev, tuser, tmsg, ttime) " |
| 976 | "VALUES(:rev, :user, :msg, :time)" |
| 977 | ); |
| 978 | db_prepare(&insFile, |
| 979 | "INSERT INTO xfiles (trev, tpath, trid, tperm) " |
| 980 | "VALUES(:rev, :path, :rid, :perm)" |
| 981 | ); |
| 982 | db_prepare(&delFile, |
| 983 | "DELETE FROM xfiles " |
| 984 | "WHERE trev=:rev AND (tpath=:path OR tpath GLOB :path || '/*')" |
| 985 | ); |
| 986 | while( svn_read_rec(pIn, &rec) ){ |
| 987 | if( zTemp = svn_find_header(rec, "Revision-number") ){ |
| 988 | const char *zUser = svn_find_prop(rec, "svn:author"); |
| 989 | const char *zLog = svn_find_prop(rec, "svn:log"); |
| 990 | const char *zDate = svn_find_prop(rec, "svn:date"); |
| @@ -990,10 +995,15 @@ | |
| 995 | db_bind_text(&insRev, ":msg", zLog); |
| 996 | db_bind_text(&insRev, ":time", zDate); |
| 997 | db_step(&insRev); |
| 998 | db_reset(&insRev); |
| 999 | fossil_free(zDate); |
| 1000 | if( rev>0 ){ |
| 1001 | db_multi_exec("INSERT INTO xfiles (trev, tpath, trid, tperm) " |
| 1002 | "SELECT %d, tpath, trid, tperm FROM xfiles " |
| 1003 | "WHERE trev=%d", rev, rev-1); |
| 1004 | } |
| 1005 | }else |
| 1006 | if( zTemp = svn_find_header(rec, "Node-path") ){ |
| 1007 | const char *zPath = zTemp; |
| 1008 | const char *zAction = svn_find_header(rec, "Node-action"); |
| 1009 | const char *zKind = svn_find_header(rec, "Node-kind"); |
| @@ -1003,13 +1013,17 @@ | |
| 1013 | int rid = 0; |
| 1014 | if( zKind && strncmp(zKind, "dir", 3)==0 ){ |
| 1015 | svn_free_rec(&rec); |
| 1016 | continue; |
| 1017 | } |
| 1018 | if( zSrcPath ){ |
| 1019 | zTemp = svn_find_header(rec, "Node-copyfrom-rev"); |
| 1020 | if( zTemp ){ |
| 1021 | srcRev = atoi(zTemp); |
| 1022 | }else{ |
| 1023 | fossil_fatal("Missing copyfrom-rev"); |
| 1024 | } |
| 1025 | } |
| 1026 | rid = content_put(&rec.content); |
| 1027 | if( strncmp(zAction, "add", 3)==0 ){ |
| 1028 | db_bind_int(&insFile, ":rev", rev); |
| 1029 | db_bind_int(&insFile, ":rid", rid); |
| @@ -1025,10 +1039,14 @@ | |
| 1039 | db_bind_text(&insFile, ":perm", zPerm); |
| 1040 | db_step(&insFile); |
| 1041 | db_reset(&insFile); |
| 1042 | }else |
| 1043 | if( strncmp(zAction, "delete", 6)==0 ){ |
| 1044 | db_bind_int(&delFile, ":rev", rev); |
| 1045 | db_bind_text(&delFile, ":path", zPath); |
| 1046 | db_step(&delFile); |
| 1047 | db_reset(&delFile); |
| 1048 | }else |
| 1049 | if( strncmp(zAction, "replace", 7)==0 ){ |
| 1050 | }else{ |
| 1051 | } |
| 1052 | }else{ |
| @@ -1037,10 +1055,11 @@ | |
| 1055 | svn_free_rec(&rec); |
| 1056 | } |
| 1057 | svn_create_manifests(); |
| 1058 | db_finalize(&insRev); |
| 1059 | db_finalize(&insFile); |
| 1060 | db_finalize(&delFile); |
| 1061 | } |
| 1062 | |
| 1063 | /* |
| 1064 | ** COMMAND: import |
| 1065 | ** |
| @@ -1135,11 +1154,12 @@ | |
| 1154 | db_multi_exec( |
| 1155 | "CREATE TEMP TABLE xrevisions(" |
| 1156 | " trev INT, tuser TEXT, tmsg TEXT, ttime DATETIME" |
| 1157 | ");" |
| 1158 | "CREATE TEMP TABLE xfiles(" |
| 1159 | " trev INT, tpath TEXT, trid TEXT, tperm TEXT," |
| 1160 | " UNIQUE (trev, tpath) ON CONFLICT REPLACE" |
| 1161 | ");" |
| 1162 | ); |
| 1163 | |
| 1164 | svn_dump_import(pIn); |
| 1165 | } |
| 1166 |