Fossil SCM
Deleting a branch closes it
Commit
86ab1f468b0929fada525a74bbd580b3aa1dafe2
Parent
befd44c747405c1…
1 file changed
+95
-66
+95
-66
| --- src/import.c | ||
| +++ src/import.c | ||
| @@ -913,10 +913,12 @@ | ||
| 913 | 913 | |
| 914 | 914 | #define SVN_UNKNOWN 0 |
| 915 | 915 | #define SVN_TRUNK 1 |
| 916 | 916 | #define SVN_BRANCH 2 |
| 917 | 917 | #define SVN_TAG 3 |
| 918 | + | |
| 919 | +#define MAX_INT_32 (1<<31 - 1) | |
| 918 | 920 | |
| 919 | 921 | static void svn_finish_revision(){ |
| 920 | 922 | Blob manifest; |
| 921 | 923 | static Stmt getChanges; |
| 922 | 924 | static Stmt getFiles; |
| @@ -953,69 +955,84 @@ | ||
| 953 | 955 | parentRid); |
| 954 | 956 | if( parentBranch!=branchId && branchType!=SVN_TAG ){ |
| 955 | 957 | sameAsParent = 0; |
| 956 | 958 | } |
| 957 | 959 | } |
| 958 | - if( gsvn.zComment ){ | |
| 959 | - blob_appendf(&manifest, "C %F\n", gsvn.zComment); | |
| 960 | - }else{ | |
| 961 | - blob_append(&manifest, "C (no\\scomment)\n", 16); | |
| 962 | - } | |
| 963 | - blob_appendf(&manifest, "D %s\n", gsvn.zDate); | |
| 964 | - db_bind_int(&getFiles, ":branch", branchId); | |
| 965 | - while( db_step(&getFiles)==SQLITE_ROW ){ | |
| 966 | - const char *zFile = db_column_text(&getFiles, 0); | |
| 967 | - const char *zUuid = db_column_text(&getFiles, 1); | |
| 968 | - const char *zPerm = db_column_text(&getFiles, 2); | |
| 969 | - blob_appendf(&manifest, "F %F %s%s\n", zFile, zUuid, zPerm); | |
| 970 | - if( sameAsParent ){ | |
| 971 | - if( !pParentFile | |
| 972 | - || fossil_strcmp(pParentFile->zName,zFile)!=0 | |
| 973 | - || fossil_strcmp(pParentFile->zUuid,zUuid)!=0 | |
| 974 | - || fossil_strcmp(pParentFile->zPerm,zPerm)!=0 | |
| 975 | - ){ | |
| 976 | - sameAsParent = 0; | |
| 977 | - }else{ | |
| 978 | - pParentFile = manifest_file_next(pParentManifest, 0); | |
| 979 | - } | |
| 980 | - } | |
| 981 | - } | |
| 982 | - if( pParentFile ){ | |
| 983 | - sameAsParent = 0; | |
| 984 | - } | |
| 985 | - db_reset(&getFiles); | |
| 986 | - if( !sameAsParent ){ | |
| 987 | - if( parentRid>0 ){ | |
| 988 | - char *zParentUuid = rid_to_uuid(parentRid); | |
| 989 | - if( parentRid==mergeRid || mergeRid==0){ | |
| 990 | - char *zParentBranch = | |
| 991 | - db_text(0, "SELECT tname FROM xbranches WHERE tid=%d", | |
| 992 | - parentBranch | |
| 993 | - ); | |
| 994 | - blob_appendf(&manifest, "P %s\n", zParentUuid); | |
| 995 | - blob_appendf(&manifest, "T *branch * %F\n", zBranch); | |
| 996 | - blob_appendf(&manifest, "T *sym-%F *\n", zBranch); | |
| 997 | - blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); | |
| 998 | - blob_appendf(&manifest, "T -sym-%F *\n", zParentBranch); | |
| 999 | - fossil_free(zParentBranch); | |
| 1000 | - }else{ | |
| 1001 | - char *zMergeUuid = rid_to_uuid(mergeRid); | |
| 1002 | - blob_appendf(&manifest, "P %s %s\n", zParentUuid, zMergeUuid); | |
| 1003 | - blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); | |
| 1004 | - fossil_free(zMergeUuid); | |
| 1005 | - } | |
| 1006 | - fossil_free(zParentUuid); | |
| 1007 | - }else{ | |
| 1008 | - blob_appendf(&manifest, "T *branch * %F\n", zBranch); | |
| 1009 | - blob_appendf(&manifest, "T *sym-%F *\n", zBranch); | |
| 1010 | - blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); | |
| 1011 | - } | |
| 1012 | - }else if( branchType==SVN_TAG ){ | |
| 1013 | - char *zParentUuid = rid_to_uuid(parentRid); | |
| 1014 | - blob_reset(&manifest); | |
| 1015 | - blob_appendf(&manifest, "D %s\n", gsvn.zDate); | |
| 1016 | - blob_appendf(&manifest, "T +sym-%F %s\n", zBranch, zParentUuid); | |
| 960 | + if( mergeRid<MAX_INT_32 ){ | |
| 961 | + if( gsvn.zComment ){ | |
| 962 | + blob_appendf(&manifest, "C %F\n", gsvn.zComment); | |
| 963 | + }else{ | |
| 964 | + blob_append(&manifest, "C (no\\scomment)\n", 16); | |
| 965 | + } | |
| 966 | + blob_appendf(&manifest, "D %s\n", gsvn.zDate); | |
| 967 | + db_bind_int(&getFiles, ":branch", branchId); | |
| 968 | + while( db_step(&getFiles)==SQLITE_ROW ){ | |
| 969 | + const char *zFile = db_column_text(&getFiles, 0); | |
| 970 | + const char *zUuid = db_column_text(&getFiles, 1); | |
| 971 | + const char *zPerm = db_column_text(&getFiles, 2); | |
| 972 | + if( zPerm ){ | |
| 973 | + blob_appendf(&manifest, "F %F %s %s\n", zFile, zUuid, zPerm); | |
| 974 | + }else{ | |
| 975 | + blob_appendf(&manifest, "F %F %s\n", zFile, zUuid); | |
| 976 | + } | |
| 977 | + if( sameAsParent ){ | |
| 978 | + if( !pParentFile | |
| 979 | + || fossil_strcmp(pParentFile->zName,zFile)!=0 | |
| 980 | + || fossil_strcmp(pParentFile->zUuid,zUuid)!=0 | |
| 981 | + || fossil_strcmp(pParentFile->zPerm,zPerm)!=0 | |
| 982 | + ){ | |
| 983 | + sameAsParent = 0; | |
| 984 | + }else{ | |
| 985 | + pParentFile = manifest_file_next(pParentManifest, 0); | |
| 986 | + } | |
| 987 | + } | |
| 988 | + } | |
| 989 | + if( pParentFile ){ | |
| 990 | + sameAsParent = 0; | |
| 991 | + } | |
| 992 | + db_reset(&getFiles); | |
| 993 | + if( !sameAsParent ){ | |
| 994 | + if( parentRid>0 ){ | |
| 995 | + char *zParentUuid = rid_to_uuid(parentRid); | |
| 996 | + if( parentRid==mergeRid || mergeRid==0){ | |
| 997 | + char *zParentBranch = | |
| 998 | + db_text(0, "SELECT tname FROM xbranches WHERE tid=%d", | |
| 999 | + parentBranch | |
| 1000 | + ); | |
| 1001 | + blob_appendf(&manifest, "P %s\n", zParentUuid); | |
| 1002 | + blob_appendf(&manifest, "T *branch * %F\n", zBranch); | |
| 1003 | + blob_appendf(&manifest, "T *sym-%F *\n", zBranch); | |
| 1004 | + blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); | |
| 1005 | + blob_appendf(&manifest, "T -sym-%F *\n", zParentBranch); | |
| 1006 | + fossil_free(zParentBranch); | |
| 1007 | + }else{ | |
| 1008 | + char *zMergeUuid = rid_to_uuid(mergeRid); | |
| 1009 | + blob_appendf(&manifest, "P %s %s\n", zParentUuid, zMergeUuid); | |
| 1010 | + blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); | |
| 1011 | + fossil_free(zMergeUuid); | |
| 1012 | + } | |
| 1013 | + fossil_free(zParentUuid); | |
| 1014 | + }else{ | |
| 1015 | + blob_appendf(&manifest, "T *branch * %F\n", zBranch); | |
| 1016 | + blob_appendf(&manifest, "T *sym-%F *\n", zBranch); | |
| 1017 | + blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); | |
| 1018 | + } | |
| 1019 | + }else if( branchType==SVN_TAG ){ | |
| 1020 | + char *zParentUuid = rid_to_uuid(parentRid); | |
| 1021 | + blob_reset(&manifest); | |
| 1022 | + blob_appendf(&manifest, "D %s\n", gsvn.zDate); | |
| 1023 | + blob_appendf(&manifest, "T +sym-%F %s\n", zBranch, zParentUuid); | |
| 1024 | + fossil_free(zParentUuid); | |
| 1025 | + } | |
| 1026 | + }else{ | |
| 1027 | + char *zParentUuid = rid_to_uuid(parentRid); | |
| 1028 | + blob_appendf(&manifest, "D %s\n", gsvn.zDate); | |
| 1029 | + if( branchType!=SVN_TAG ){ | |
| 1030 | + blob_appendf(&manifest, "T +closed %s\n", zParentUuid); | |
| 1031 | + }else{ | |
| 1032 | + blob_appendf(&manifest, "T -sym-%F %s\n", zBranch, zParentUuid); | |
| 1033 | + } | |
| 1017 | 1034 | fossil_free(zParentUuid); |
| 1018 | 1035 | } |
| 1019 | 1036 | if( gsvn.zUser ){ |
| 1020 | 1037 | blob_appendf(&manifest, "U %F\n", gsvn.zUser); |
| 1021 | 1038 | }else{ |
| @@ -1035,10 +1052,14 @@ | ||
| 1035 | 1052 | content_put(&manifest); |
| 1036 | 1053 | db_bind_int(&setRid, ":branch", branchId); |
| 1037 | 1054 | db_bind_int(&setRid, ":rid", parentRid); |
| 1038 | 1055 | db_step(&setRid); |
| 1039 | 1056 | db_reset(&setRid); |
| 1057 | + }else if( mergeRid==MAX_INT_32 ){ | |
| 1058 | + content_put(&manifest); | |
| 1059 | + db_multi_exec("DELETE FROM xrevisions WHERE tbranch=%d AND trev=%d", | |
| 1060 | + branchId, gsvn.rev); | |
| 1040 | 1061 | }else{ |
| 1041 | 1062 | db_multi_exec("DELETE FROM xrevisions WHERE tbranch=%d AND trev=%d", |
| 1042 | 1063 | branchId, gsvn.rev); |
| 1043 | 1064 | } |
| 1044 | 1065 | blob_reset(&manifest); |
| @@ -1193,11 +1214,11 @@ | ||
| 1193 | 1214 | " VALUES(:path, :branch, (SELECT uuid FROM blob WHERE rid=:rid), :perm)" |
| 1194 | 1215 | ); |
| 1195 | 1216 | db_prepare(&delPath, |
| 1196 | 1217 | "DELETE FROM xfiles" |
| 1197 | 1218 | " WHERE (tpath=:path OR (tpath>:path||'/' AND tpath<:path||'0'))" |
| 1198 | - " AND tbranch=:branch" | |
| 1219 | + " AND tbranch=:branch" | |
| 1199 | 1220 | ); |
| 1200 | 1221 | db_prepare(&addRev, |
| 1201 | 1222 | "INSERT OR IGNORE INTO xrevisions (trev, tbranch) VALUES(:rev, :branch)" |
| 1202 | 1223 | ); |
| 1203 | 1224 | db_prepare(&cpyPath, |
| @@ -1248,11 +1269,11 @@ | ||
| 1248 | 1269 | char *zFile; |
| 1249 | 1270 | int branchType; |
| 1250 | 1271 | int branchId = svn_parse_path(zTemp, &zFile, &branchType); |
| 1251 | 1272 | char *zAction = svn_find_header(rec, "Node-action"); |
| 1252 | 1273 | char *zKind = svn_find_header(rec, "Node-kind"); |
| 1253 | - char *zPerm = svn_find_prop(rec, "svn:executable") ? " x" : 0; | |
| 1274 | + char *zPerm = svn_find_prop(rec, "svn:executable") ? "x" : 0; | |
| 1254 | 1275 | int deltaFlag = 0; |
| 1255 | 1276 | int srcRev = 0; |
| 1256 | 1277 | if( branchId==0 ){ |
| 1257 | 1278 | svn_free_rec(&rec); |
| 1258 | 1279 | continue; |
| @@ -1261,18 +1282,26 @@ | ||
| 1261 | 1282 | deltaFlag = strncmp(zTemp, "true", 4)==0; |
| 1262 | 1283 | } |
| 1263 | 1284 | if( strncmp(zAction, "delete", 6)==0 |
| 1264 | 1285 | || strncmp(zAction, "replace", 7)==0 ) |
| 1265 | 1286 | { |
| 1266 | - //TODO delete root | |
| 1267 | - db_bind_text(&delPath, ":path", zFile); | |
| 1268 | - db_bind_int(&delPath, ":branch", branchId); | |
| 1269 | - db_step(&delPath); | |
| 1270 | - db_reset(&delPath); | |
| 1271 | 1287 | db_bind_int(&addRev, ":branch", branchId); |
| 1272 | 1288 | db_step(&addRev); |
| 1273 | 1289 | db_reset(&addRev); |
| 1290 | + if( zFile[0]!=0 ){ | |
| 1291 | + db_bind_text(&delPath, ":path", zFile); | |
| 1292 | + db_bind_int(&delPath, ":branch", branchId); | |
| 1293 | + db_step(&delPath); | |
| 1294 | + db_reset(&delPath); | |
| 1295 | + }else{ | |
| 1296 | + db_multi_exec("DELETE FROM xfiles WHERE tbranch=%d", branchId); | |
| 1297 | + db_bind_int(&revSrc, ":parent", MAX_INT_32); | |
| 1298 | + db_bind_int(&revSrc, ":rev", gsvn.rev); | |
| 1299 | + db_bind_int(&revSrc, ":branch", branchId); | |
| 1300 | + db_step(&revSrc); | |
| 1301 | + db_reset(&revSrc); | |
| 1302 | + } | |
| 1274 | 1303 | } /* no 'else' here since 'replace' does both a 'delete' and an 'add' */ |
| 1275 | 1304 | if( strncmp(zAction, "add", 3)==0 |
| 1276 | 1305 | || strncmp(zAction, "replace", 7)==0 ) |
| 1277 | 1306 | { |
| 1278 | 1307 | char *zSrcPath = svn_find_header(rec, "Node-copyfrom-path"); |
| 1279 | 1308 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -913,10 +913,12 @@ | |
| 913 | |
| 914 | #define SVN_UNKNOWN 0 |
| 915 | #define SVN_TRUNK 1 |
| 916 | #define SVN_BRANCH 2 |
| 917 | #define SVN_TAG 3 |
| 918 | |
| 919 | static void svn_finish_revision(){ |
| 920 | Blob manifest; |
| 921 | static Stmt getChanges; |
| 922 | static Stmt getFiles; |
| @@ -953,69 +955,84 @@ | |
| 953 | parentRid); |
| 954 | if( parentBranch!=branchId && branchType!=SVN_TAG ){ |
| 955 | sameAsParent = 0; |
| 956 | } |
| 957 | } |
| 958 | if( gsvn.zComment ){ |
| 959 | blob_appendf(&manifest, "C %F\n", gsvn.zComment); |
| 960 | }else{ |
| 961 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| 962 | } |
| 963 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 964 | db_bind_int(&getFiles, ":branch", branchId); |
| 965 | while( db_step(&getFiles)==SQLITE_ROW ){ |
| 966 | const char *zFile = db_column_text(&getFiles, 0); |
| 967 | const char *zUuid = db_column_text(&getFiles, 1); |
| 968 | const char *zPerm = db_column_text(&getFiles, 2); |
| 969 | blob_appendf(&manifest, "F %F %s%s\n", zFile, zUuid, zPerm); |
| 970 | if( sameAsParent ){ |
| 971 | if( !pParentFile |
| 972 | || fossil_strcmp(pParentFile->zName,zFile)!=0 |
| 973 | || fossil_strcmp(pParentFile->zUuid,zUuid)!=0 |
| 974 | || fossil_strcmp(pParentFile->zPerm,zPerm)!=0 |
| 975 | ){ |
| 976 | sameAsParent = 0; |
| 977 | }else{ |
| 978 | pParentFile = manifest_file_next(pParentManifest, 0); |
| 979 | } |
| 980 | } |
| 981 | } |
| 982 | if( pParentFile ){ |
| 983 | sameAsParent = 0; |
| 984 | } |
| 985 | db_reset(&getFiles); |
| 986 | if( !sameAsParent ){ |
| 987 | if( parentRid>0 ){ |
| 988 | char *zParentUuid = rid_to_uuid(parentRid); |
| 989 | if( parentRid==mergeRid || mergeRid==0){ |
| 990 | char *zParentBranch = |
| 991 | db_text(0, "SELECT tname FROM xbranches WHERE tid=%d", |
| 992 | parentBranch |
| 993 | ); |
| 994 | blob_appendf(&manifest, "P %s\n", zParentUuid); |
| 995 | blob_appendf(&manifest, "T *branch * %F\n", zBranch); |
| 996 | blob_appendf(&manifest, "T *sym-%F *\n", zBranch); |
| 997 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); |
| 998 | blob_appendf(&manifest, "T -sym-%F *\n", zParentBranch); |
| 999 | fossil_free(zParentBranch); |
| 1000 | }else{ |
| 1001 | char *zMergeUuid = rid_to_uuid(mergeRid); |
| 1002 | blob_appendf(&manifest, "P %s %s\n", zParentUuid, zMergeUuid); |
| 1003 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); |
| 1004 | fossil_free(zMergeUuid); |
| 1005 | } |
| 1006 | fossil_free(zParentUuid); |
| 1007 | }else{ |
| 1008 | blob_appendf(&manifest, "T *branch * %F\n", zBranch); |
| 1009 | blob_appendf(&manifest, "T *sym-%F *\n", zBranch); |
| 1010 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); |
| 1011 | } |
| 1012 | }else if( branchType==SVN_TAG ){ |
| 1013 | char *zParentUuid = rid_to_uuid(parentRid); |
| 1014 | blob_reset(&manifest); |
| 1015 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 1016 | blob_appendf(&manifest, "T +sym-%F %s\n", zBranch, zParentUuid); |
| 1017 | fossil_free(zParentUuid); |
| 1018 | } |
| 1019 | if( gsvn.zUser ){ |
| 1020 | blob_appendf(&manifest, "U %F\n", gsvn.zUser); |
| 1021 | }else{ |
| @@ -1035,10 +1052,14 @@ | |
| 1035 | content_put(&manifest); |
| 1036 | db_bind_int(&setRid, ":branch", branchId); |
| 1037 | db_bind_int(&setRid, ":rid", parentRid); |
| 1038 | db_step(&setRid); |
| 1039 | db_reset(&setRid); |
| 1040 | }else{ |
| 1041 | db_multi_exec("DELETE FROM xrevisions WHERE tbranch=%d AND trev=%d", |
| 1042 | branchId, gsvn.rev); |
| 1043 | } |
| 1044 | blob_reset(&manifest); |
| @@ -1193,11 +1214,11 @@ | |
| 1193 | " VALUES(:path, :branch, (SELECT uuid FROM blob WHERE rid=:rid), :perm)" |
| 1194 | ); |
| 1195 | db_prepare(&delPath, |
| 1196 | "DELETE FROM xfiles" |
| 1197 | " WHERE (tpath=:path OR (tpath>:path||'/' AND tpath<:path||'0'))" |
| 1198 | " AND tbranch=:branch" |
| 1199 | ); |
| 1200 | db_prepare(&addRev, |
| 1201 | "INSERT OR IGNORE INTO xrevisions (trev, tbranch) VALUES(:rev, :branch)" |
| 1202 | ); |
| 1203 | db_prepare(&cpyPath, |
| @@ -1248,11 +1269,11 @@ | |
| 1248 | char *zFile; |
| 1249 | int branchType; |
| 1250 | int branchId = svn_parse_path(zTemp, &zFile, &branchType); |
| 1251 | char *zAction = svn_find_header(rec, "Node-action"); |
| 1252 | char *zKind = svn_find_header(rec, "Node-kind"); |
| 1253 | char *zPerm = svn_find_prop(rec, "svn:executable") ? " x" : 0; |
| 1254 | int deltaFlag = 0; |
| 1255 | int srcRev = 0; |
| 1256 | if( branchId==0 ){ |
| 1257 | svn_free_rec(&rec); |
| 1258 | continue; |
| @@ -1261,18 +1282,26 @@ | |
| 1261 | deltaFlag = strncmp(zTemp, "true", 4)==0; |
| 1262 | } |
| 1263 | if( strncmp(zAction, "delete", 6)==0 |
| 1264 | || strncmp(zAction, "replace", 7)==0 ) |
| 1265 | { |
| 1266 | //TODO delete root |
| 1267 | db_bind_text(&delPath, ":path", zFile); |
| 1268 | db_bind_int(&delPath, ":branch", branchId); |
| 1269 | db_step(&delPath); |
| 1270 | db_reset(&delPath); |
| 1271 | db_bind_int(&addRev, ":branch", branchId); |
| 1272 | db_step(&addRev); |
| 1273 | db_reset(&addRev); |
| 1274 | } /* no 'else' here since 'replace' does both a 'delete' and an 'add' */ |
| 1275 | if( strncmp(zAction, "add", 3)==0 |
| 1276 | || strncmp(zAction, "replace", 7)==0 ) |
| 1277 | { |
| 1278 | char *zSrcPath = svn_find_header(rec, "Node-copyfrom-path"); |
| 1279 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -913,10 +913,12 @@ | |
| 913 | |
| 914 | #define SVN_UNKNOWN 0 |
| 915 | #define SVN_TRUNK 1 |
| 916 | #define SVN_BRANCH 2 |
| 917 | #define SVN_TAG 3 |
| 918 | |
| 919 | #define MAX_INT_32 (1<<31 - 1) |
| 920 | |
| 921 | static void svn_finish_revision(){ |
| 922 | Blob manifest; |
| 923 | static Stmt getChanges; |
| 924 | static Stmt getFiles; |
| @@ -953,69 +955,84 @@ | |
| 955 | parentRid); |
| 956 | if( parentBranch!=branchId && branchType!=SVN_TAG ){ |
| 957 | sameAsParent = 0; |
| 958 | } |
| 959 | } |
| 960 | if( mergeRid<MAX_INT_32 ){ |
| 961 | if( gsvn.zComment ){ |
| 962 | blob_appendf(&manifest, "C %F\n", gsvn.zComment); |
| 963 | }else{ |
| 964 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| 965 | } |
| 966 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 967 | db_bind_int(&getFiles, ":branch", branchId); |
| 968 | while( db_step(&getFiles)==SQLITE_ROW ){ |
| 969 | const char *zFile = db_column_text(&getFiles, 0); |
| 970 | const char *zUuid = db_column_text(&getFiles, 1); |
| 971 | const char *zPerm = db_column_text(&getFiles, 2); |
| 972 | if( zPerm ){ |
| 973 | blob_appendf(&manifest, "F %F %s %s\n", zFile, zUuid, zPerm); |
| 974 | }else{ |
| 975 | blob_appendf(&manifest, "F %F %s\n", zFile, zUuid); |
| 976 | } |
| 977 | if( sameAsParent ){ |
| 978 | if( !pParentFile |
| 979 | || fossil_strcmp(pParentFile->zName,zFile)!=0 |
| 980 | || fossil_strcmp(pParentFile->zUuid,zUuid)!=0 |
| 981 | || fossil_strcmp(pParentFile->zPerm,zPerm)!=0 |
| 982 | ){ |
| 983 | sameAsParent = 0; |
| 984 | }else{ |
| 985 | pParentFile = manifest_file_next(pParentManifest, 0); |
| 986 | } |
| 987 | } |
| 988 | } |
| 989 | if( pParentFile ){ |
| 990 | sameAsParent = 0; |
| 991 | } |
| 992 | db_reset(&getFiles); |
| 993 | if( !sameAsParent ){ |
| 994 | if( parentRid>0 ){ |
| 995 | char *zParentUuid = rid_to_uuid(parentRid); |
| 996 | if( parentRid==mergeRid || mergeRid==0){ |
| 997 | char *zParentBranch = |
| 998 | db_text(0, "SELECT tname FROM xbranches WHERE tid=%d", |
| 999 | parentBranch |
| 1000 | ); |
| 1001 | blob_appendf(&manifest, "P %s\n", zParentUuid); |
| 1002 | blob_appendf(&manifest, "T *branch * %F\n", zBranch); |
| 1003 | blob_appendf(&manifest, "T *sym-%F *\n", zBranch); |
| 1004 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); |
| 1005 | blob_appendf(&manifest, "T -sym-%F *\n", zParentBranch); |
| 1006 | fossil_free(zParentBranch); |
| 1007 | }else{ |
| 1008 | char *zMergeUuid = rid_to_uuid(mergeRid); |
| 1009 | blob_appendf(&manifest, "P %s %s\n", zParentUuid, zMergeUuid); |
| 1010 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); |
| 1011 | fossil_free(zMergeUuid); |
| 1012 | } |
| 1013 | fossil_free(zParentUuid); |
| 1014 | }else{ |
| 1015 | blob_appendf(&manifest, "T *branch * %F\n", zBranch); |
| 1016 | blob_appendf(&manifest, "T *sym-%F *\n", zBranch); |
| 1017 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); |
| 1018 | } |
| 1019 | }else if( branchType==SVN_TAG ){ |
| 1020 | char *zParentUuid = rid_to_uuid(parentRid); |
| 1021 | blob_reset(&manifest); |
| 1022 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 1023 | blob_appendf(&manifest, "T +sym-%F %s\n", zBranch, zParentUuid); |
| 1024 | fossil_free(zParentUuid); |
| 1025 | } |
| 1026 | }else{ |
| 1027 | char *zParentUuid = rid_to_uuid(parentRid); |
| 1028 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 1029 | if( branchType!=SVN_TAG ){ |
| 1030 | blob_appendf(&manifest, "T +closed %s\n", zParentUuid); |
| 1031 | }else{ |
| 1032 | blob_appendf(&manifest, "T -sym-%F %s\n", zBranch, zParentUuid); |
| 1033 | } |
| 1034 | fossil_free(zParentUuid); |
| 1035 | } |
| 1036 | if( gsvn.zUser ){ |
| 1037 | blob_appendf(&manifest, "U %F\n", gsvn.zUser); |
| 1038 | }else{ |
| @@ -1035,10 +1052,14 @@ | |
| 1052 | content_put(&manifest); |
| 1053 | db_bind_int(&setRid, ":branch", branchId); |
| 1054 | db_bind_int(&setRid, ":rid", parentRid); |
| 1055 | db_step(&setRid); |
| 1056 | db_reset(&setRid); |
| 1057 | }else if( mergeRid==MAX_INT_32 ){ |
| 1058 | content_put(&manifest); |
| 1059 | db_multi_exec("DELETE FROM xrevisions WHERE tbranch=%d AND trev=%d", |
| 1060 | branchId, gsvn.rev); |
| 1061 | }else{ |
| 1062 | db_multi_exec("DELETE FROM xrevisions WHERE tbranch=%d AND trev=%d", |
| 1063 | branchId, gsvn.rev); |
| 1064 | } |
| 1065 | blob_reset(&manifest); |
| @@ -1193,11 +1214,11 @@ | |
| 1214 | " VALUES(:path, :branch, (SELECT uuid FROM blob WHERE rid=:rid), :perm)" |
| 1215 | ); |
| 1216 | db_prepare(&delPath, |
| 1217 | "DELETE FROM xfiles" |
| 1218 | " WHERE (tpath=:path OR (tpath>:path||'/' AND tpath<:path||'0'))" |
| 1219 | " AND tbranch=:branch" |
| 1220 | ); |
| 1221 | db_prepare(&addRev, |
| 1222 | "INSERT OR IGNORE INTO xrevisions (trev, tbranch) VALUES(:rev, :branch)" |
| 1223 | ); |
| 1224 | db_prepare(&cpyPath, |
| @@ -1248,11 +1269,11 @@ | |
| 1269 | char *zFile; |
| 1270 | int branchType; |
| 1271 | int branchId = svn_parse_path(zTemp, &zFile, &branchType); |
| 1272 | char *zAction = svn_find_header(rec, "Node-action"); |
| 1273 | char *zKind = svn_find_header(rec, "Node-kind"); |
| 1274 | char *zPerm = svn_find_prop(rec, "svn:executable") ? "x" : 0; |
| 1275 | int deltaFlag = 0; |
| 1276 | int srcRev = 0; |
| 1277 | if( branchId==0 ){ |
| 1278 | svn_free_rec(&rec); |
| 1279 | continue; |
| @@ -1261,18 +1282,26 @@ | |
| 1282 | deltaFlag = strncmp(zTemp, "true", 4)==0; |
| 1283 | } |
| 1284 | if( strncmp(zAction, "delete", 6)==0 |
| 1285 | || strncmp(zAction, "replace", 7)==0 ) |
| 1286 | { |
| 1287 | db_bind_int(&addRev, ":branch", branchId); |
| 1288 | db_step(&addRev); |
| 1289 | db_reset(&addRev); |
| 1290 | if( zFile[0]!=0 ){ |
| 1291 | db_bind_text(&delPath, ":path", zFile); |
| 1292 | db_bind_int(&delPath, ":branch", branchId); |
| 1293 | db_step(&delPath); |
| 1294 | db_reset(&delPath); |
| 1295 | }else{ |
| 1296 | db_multi_exec("DELETE FROM xfiles WHERE tbranch=%d", branchId); |
| 1297 | db_bind_int(&revSrc, ":parent", MAX_INT_32); |
| 1298 | db_bind_int(&revSrc, ":rev", gsvn.rev); |
| 1299 | db_bind_int(&revSrc, ":branch", branchId); |
| 1300 | db_step(&revSrc); |
| 1301 | db_reset(&revSrc); |
| 1302 | } |
| 1303 | } /* no 'else' here since 'replace' does both a 'delete' and an 'add' */ |
| 1304 | if( strncmp(zAction, "add", 3)==0 |
| 1305 | || strncmp(zAction, "replace", 7)==0 ) |
| 1306 | { |
| 1307 | char *zSrcPath = svn_find_header(rec, "Node-copyfrom-path"); |
| 1308 |