Fossil SCM
Fix issue with branching from a branch
Commit
93134dda26e295ac6ec1e56c9024c82b9fd71b92
Parent
fa8f12b6277728e…
1 file changed
+29
-18
+29
-18
| --- src/import.c | ||
| +++ src/import.c | ||
| @@ -1073,40 +1073,34 @@ | ||
| 1073 | 1073 | zBranch = "trunk"; |
| 1074 | 1074 | *zFile = zPath; |
| 1075 | 1075 | type = 1; |
| 1076 | 1076 | }else |
| 1077 | 1077 | if( strncmp(zPath, gsvn.zTrunk, gsvn.lenTrunk-1)==0 ){ |
| 1078 | - zBranch = "trunk"; | |
| 1079 | - if( zPath[gsvn.lenTrunk-1]=='/' ){ | |
| 1080 | - *zFile = zPath+gsvn.lenTrunk;; | |
| 1081 | - }else if( zPath[gsvn.lenTrunk-1]==0 ){ | |
| 1082 | - *zFile = 0; | |
| 1078 | + if( zPath[gsvn.lenTrunk-1]=='/' || zPath[gsvn.lenTrunk-1]==0 ){ | |
| 1079 | + zBranch = "trunk"; | |
| 1080 | + *zFile = zPath+gsvn.lenTrunk; | |
| 1081 | + type = 1; | |
| 1083 | 1082 | }else{ |
| 1084 | - *zFile = zBranch = 0; | |
| 1083 | + zBranch = 0; | |
| 1085 | 1084 | type = 0; |
| 1086 | 1085 | } |
| 1087 | - type = 1; | |
| 1088 | 1086 | }else |
| 1089 | 1087 | if( strncmp(zPath, gsvn.zBranches, gsvn.lenBranches)==0 ){ |
| 1090 | 1088 | *zFile = zBranch = zPath+gsvn.lenBranches; |
| 1091 | 1089 | while( **zFile && **zFile!='/' ){ (*zFile)++; } |
| 1092 | 1090 | if( **zFile ){ |
| 1093 | 1091 | **zFile = '\0'; |
| 1094 | 1092 | (*zFile)++; |
| 1095 | - }else{ | |
| 1096 | - *zFile = 0; | |
| 1097 | 1093 | } |
| 1098 | 1094 | type = 2; |
| 1099 | 1095 | }else |
| 1100 | 1096 | if( strncmp(zPath, gsvn.zTags, gsvn.lenTags)==0 ){ |
| 1101 | 1097 | *zFile = zBranch = zPath+gsvn.lenTags; |
| 1102 | 1098 | while( **zFile && **zFile!='/' ){ (*zFile)++; } |
| 1103 | 1099 | if( **zFile ){ |
| 1104 | 1100 | **zFile = '\0'; |
| 1105 | 1101 | (*zFile)++; |
| 1106 | - }else{ | |
| 1107 | - *zFile = 0; | |
| 1108 | 1102 | } |
| 1109 | 1103 | type = 3; |
| 1110 | 1104 | } |
| 1111 | 1105 | if( type>0 ){ |
| 1112 | 1106 | branchId = db_int(0, |
| @@ -1132,10 +1126,11 @@ | ||
| 1132 | 1126 | const char *zUuid; |
| 1133 | 1127 | Stmt addFile; |
| 1134 | 1128 | Stmt delPath; |
| 1135 | 1129 | Stmt addRev; |
| 1136 | 1130 | Stmt cpyPath; |
| 1131 | + Stmt cpyRoot; | |
| 1137 | 1132 | Stmt revSrc; |
| 1138 | 1133 | |
| 1139 | 1134 | /* version */ |
| 1140 | 1135 | if( svn_read_rec(pIn, &rec) |
| 1141 | 1136 | && (zTemp = svn_find_header(rec, "SVN-fs-dump-format-version")) ){ |
| @@ -1172,10 +1167,16 @@ | ||
| 1172 | 1167 | " FROM xfoci" |
| 1173 | 1168 | " WHERE checkinID=:rid" |
| 1174 | 1169 | " AND filename>:srcpath||'/'" |
| 1175 | 1170 | " AND filename<:srcpath||'0'" |
| 1176 | 1171 | ); |
| 1172 | + db_prepare(&cpyRoot, | |
| 1173 | + "INSERT INTO xfiles (tpath, tbranch, tuuid, tperm)" | |
| 1174 | + " SELECT :path||filename, :branch, uuid, perm" | |
| 1175 | + " FROM xfoci" | |
| 1176 | + " WHERE checkinID=:rid" | |
| 1177 | + ); | |
| 1177 | 1178 | db_prepare(&revSrc, |
| 1178 | 1179 | "UPDATE xrevisions SET tparent=:parent" |
| 1179 | 1180 | " WHERE trev=:rev AND tbranch=:branch AND tparent<:parent" |
| 1180 | 1181 | ); |
| 1181 | 1182 | gsvn.rev = -1; |
| @@ -1232,16 +1233,17 @@ | ||
| 1232 | 1233 | srcBranch = svn_parse_path(zSrcPath, &zSrcFile); |
| 1233 | 1234 | if( srcBranch==0 ){ |
| 1234 | 1235 | fossil_fatal("Copy from path outside the import paths"); |
| 1235 | 1236 | } |
| 1236 | 1237 | } |
| 1237 | - if( zFile==0 ){ | |
| 1238 | + if( zFile[0]==0 ){ | |
| 1238 | 1239 | bag_insert(&gsvn.newBranches, branchId); |
| 1239 | 1240 | } |
| 1240 | 1241 | if( strncmp(zAction, "delete", 6)==0 |
| 1241 | 1242 | || strncmp(zAction, "replace", 7)==0 ) |
| 1242 | 1243 | { |
| 1244 | + //TODO delete root | |
| 1243 | 1245 | db_bind_text(&delPath, ":path", zFile); |
| 1244 | 1246 | db_bind_int(&delPath, ":branch", branchId); |
| 1245 | 1247 | db_step(&delPath); |
| 1246 | 1248 | db_reset(&delPath); |
| 1247 | 1249 | db_bind_int(&addRev, ":branch", branchId); |
| @@ -1258,16 +1260,24 @@ | ||
| 1258 | 1260 | if( zSrcPath ){ |
| 1259 | 1261 | srcRid = db_int(0, "SELECT trid, max(trev) FROM xrevisions" |
| 1260 | 1262 | " WHERE trev<=%d AND tbranch=%d", |
| 1261 | 1263 | srcRev, srcBranch); |
| 1262 | 1264 | if( srcRid>0 ){ |
| 1263 | - db_bind_text(&cpyPath, ":path", zFile); | |
| 1264 | - db_bind_int(&cpyPath, ":branch", branchId); | |
| 1265 | - db_bind_text(&cpyPath, ":srcpath", zSrcFile); | |
| 1266 | - db_bind_int(&cpyPath, ":rid", srcRid); | |
| 1267 | - db_step(&cpyPath); | |
| 1268 | - db_reset(&cpyPath); | |
| 1265 | + if( zFile[0]==0 ){ | |
| 1266 | + db_bind_text(&cpyRoot, ":path", zFile); | |
| 1267 | + db_bind_int(&cpyRoot, ":branch", branchId); | |
| 1268 | + db_bind_int(&cpyRoot, ":rid", srcRid); | |
| 1269 | + db_step(&cpyRoot); | |
| 1270 | + db_reset(&cpyRoot); | |
| 1271 | + }else{ | |
| 1272 | + db_bind_text(&cpyPath, ":path", zFile); | |
| 1273 | + db_bind_int(&cpyPath, ":branch", branchId); | |
| 1274 | + db_bind_text(&cpyPath, ":srcpath", zSrcFile); | |
| 1275 | + db_bind_int(&cpyPath, ":rid", srcRid); | |
| 1276 | + db_step(&cpyPath); | |
| 1277 | + db_reset(&cpyPath); | |
| 1278 | + } | |
| 1269 | 1279 | db_bind_int(&addRev, ":branch", branchId); |
| 1270 | 1280 | db_step(&addRev); |
| 1271 | 1281 | db_reset(&addRev); |
| 1272 | 1282 | } |
| 1273 | 1283 | } |
| @@ -1358,10 +1368,11 @@ | ||
| 1358 | 1368 | fossil_free(gsvn.zDate); |
| 1359 | 1369 | db_finalize(&addFile); |
| 1360 | 1370 | db_finalize(&delPath); |
| 1361 | 1371 | db_finalize(&addRev); |
| 1362 | 1372 | db_finalize(&cpyPath); |
| 1373 | + db_finalize(&cpyRoot); | |
| 1363 | 1374 | db_finalize(&revSrc); |
| 1364 | 1375 | fossil_print(" Done!\n"); |
| 1365 | 1376 | } |
| 1366 | 1377 | |
| 1367 | 1378 | /* |
| 1368 | 1379 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -1073,40 +1073,34 @@ | |
| 1073 | zBranch = "trunk"; |
| 1074 | *zFile = zPath; |
| 1075 | type = 1; |
| 1076 | }else |
| 1077 | if( strncmp(zPath, gsvn.zTrunk, gsvn.lenTrunk-1)==0 ){ |
| 1078 | zBranch = "trunk"; |
| 1079 | if( zPath[gsvn.lenTrunk-1]=='/' ){ |
| 1080 | *zFile = zPath+gsvn.lenTrunk;; |
| 1081 | }else if( zPath[gsvn.lenTrunk-1]==0 ){ |
| 1082 | *zFile = 0; |
| 1083 | }else{ |
| 1084 | *zFile = zBranch = 0; |
| 1085 | type = 0; |
| 1086 | } |
| 1087 | type = 1; |
| 1088 | }else |
| 1089 | if( strncmp(zPath, gsvn.zBranches, gsvn.lenBranches)==0 ){ |
| 1090 | *zFile = zBranch = zPath+gsvn.lenBranches; |
| 1091 | while( **zFile && **zFile!='/' ){ (*zFile)++; } |
| 1092 | if( **zFile ){ |
| 1093 | **zFile = '\0'; |
| 1094 | (*zFile)++; |
| 1095 | }else{ |
| 1096 | *zFile = 0; |
| 1097 | } |
| 1098 | type = 2; |
| 1099 | }else |
| 1100 | if( strncmp(zPath, gsvn.zTags, gsvn.lenTags)==0 ){ |
| 1101 | *zFile = zBranch = zPath+gsvn.lenTags; |
| 1102 | while( **zFile && **zFile!='/' ){ (*zFile)++; } |
| 1103 | if( **zFile ){ |
| 1104 | **zFile = '\0'; |
| 1105 | (*zFile)++; |
| 1106 | }else{ |
| 1107 | *zFile = 0; |
| 1108 | } |
| 1109 | type = 3; |
| 1110 | } |
| 1111 | if( type>0 ){ |
| 1112 | branchId = db_int(0, |
| @@ -1132,10 +1126,11 @@ | |
| 1132 | const char *zUuid; |
| 1133 | Stmt addFile; |
| 1134 | Stmt delPath; |
| 1135 | Stmt addRev; |
| 1136 | Stmt cpyPath; |
| 1137 | Stmt revSrc; |
| 1138 | |
| 1139 | /* version */ |
| 1140 | if( svn_read_rec(pIn, &rec) |
| 1141 | && (zTemp = svn_find_header(rec, "SVN-fs-dump-format-version")) ){ |
| @@ -1172,10 +1167,16 @@ | |
| 1172 | " FROM xfoci" |
| 1173 | " WHERE checkinID=:rid" |
| 1174 | " AND filename>:srcpath||'/'" |
| 1175 | " AND filename<:srcpath||'0'" |
| 1176 | ); |
| 1177 | db_prepare(&revSrc, |
| 1178 | "UPDATE xrevisions SET tparent=:parent" |
| 1179 | " WHERE trev=:rev AND tbranch=:branch AND tparent<:parent" |
| 1180 | ); |
| 1181 | gsvn.rev = -1; |
| @@ -1232,16 +1233,17 @@ | |
| 1232 | srcBranch = svn_parse_path(zSrcPath, &zSrcFile); |
| 1233 | if( srcBranch==0 ){ |
| 1234 | fossil_fatal("Copy from path outside the import paths"); |
| 1235 | } |
| 1236 | } |
| 1237 | if( zFile==0 ){ |
| 1238 | bag_insert(&gsvn.newBranches, branchId); |
| 1239 | } |
| 1240 | if( strncmp(zAction, "delete", 6)==0 |
| 1241 | || strncmp(zAction, "replace", 7)==0 ) |
| 1242 | { |
| 1243 | db_bind_text(&delPath, ":path", zFile); |
| 1244 | db_bind_int(&delPath, ":branch", branchId); |
| 1245 | db_step(&delPath); |
| 1246 | db_reset(&delPath); |
| 1247 | db_bind_int(&addRev, ":branch", branchId); |
| @@ -1258,16 +1260,24 @@ | |
| 1258 | if( zSrcPath ){ |
| 1259 | srcRid = db_int(0, "SELECT trid, max(trev) FROM xrevisions" |
| 1260 | " WHERE trev<=%d AND tbranch=%d", |
| 1261 | srcRev, srcBranch); |
| 1262 | if( srcRid>0 ){ |
| 1263 | db_bind_text(&cpyPath, ":path", zFile); |
| 1264 | db_bind_int(&cpyPath, ":branch", branchId); |
| 1265 | db_bind_text(&cpyPath, ":srcpath", zSrcFile); |
| 1266 | db_bind_int(&cpyPath, ":rid", srcRid); |
| 1267 | db_step(&cpyPath); |
| 1268 | db_reset(&cpyPath); |
| 1269 | db_bind_int(&addRev, ":branch", branchId); |
| 1270 | db_step(&addRev); |
| 1271 | db_reset(&addRev); |
| 1272 | } |
| 1273 | } |
| @@ -1358,10 +1368,11 @@ | |
| 1358 | fossil_free(gsvn.zDate); |
| 1359 | db_finalize(&addFile); |
| 1360 | db_finalize(&delPath); |
| 1361 | db_finalize(&addRev); |
| 1362 | db_finalize(&cpyPath); |
| 1363 | db_finalize(&revSrc); |
| 1364 | fossil_print(" Done!\n"); |
| 1365 | } |
| 1366 | |
| 1367 | /* |
| 1368 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -1073,40 +1073,34 @@ | |
| 1073 | zBranch = "trunk"; |
| 1074 | *zFile = zPath; |
| 1075 | type = 1; |
| 1076 | }else |
| 1077 | if( strncmp(zPath, gsvn.zTrunk, gsvn.lenTrunk-1)==0 ){ |
| 1078 | if( zPath[gsvn.lenTrunk-1]=='/' || zPath[gsvn.lenTrunk-1]==0 ){ |
| 1079 | zBranch = "trunk"; |
| 1080 | *zFile = zPath+gsvn.lenTrunk; |
| 1081 | type = 1; |
| 1082 | }else{ |
| 1083 | zBranch = 0; |
| 1084 | type = 0; |
| 1085 | } |
| 1086 | }else |
| 1087 | if( strncmp(zPath, gsvn.zBranches, gsvn.lenBranches)==0 ){ |
| 1088 | *zFile = zBranch = zPath+gsvn.lenBranches; |
| 1089 | while( **zFile && **zFile!='/' ){ (*zFile)++; } |
| 1090 | if( **zFile ){ |
| 1091 | **zFile = '\0'; |
| 1092 | (*zFile)++; |
| 1093 | } |
| 1094 | type = 2; |
| 1095 | }else |
| 1096 | if( strncmp(zPath, gsvn.zTags, gsvn.lenTags)==0 ){ |
| 1097 | *zFile = zBranch = zPath+gsvn.lenTags; |
| 1098 | while( **zFile && **zFile!='/' ){ (*zFile)++; } |
| 1099 | if( **zFile ){ |
| 1100 | **zFile = '\0'; |
| 1101 | (*zFile)++; |
| 1102 | } |
| 1103 | type = 3; |
| 1104 | } |
| 1105 | if( type>0 ){ |
| 1106 | branchId = db_int(0, |
| @@ -1132,10 +1126,11 @@ | |
| 1126 | const char *zUuid; |
| 1127 | Stmt addFile; |
| 1128 | Stmt delPath; |
| 1129 | Stmt addRev; |
| 1130 | Stmt cpyPath; |
| 1131 | Stmt cpyRoot; |
| 1132 | Stmt revSrc; |
| 1133 | |
| 1134 | /* version */ |
| 1135 | if( svn_read_rec(pIn, &rec) |
| 1136 | && (zTemp = svn_find_header(rec, "SVN-fs-dump-format-version")) ){ |
| @@ -1172,10 +1167,16 @@ | |
| 1167 | " FROM xfoci" |
| 1168 | " WHERE checkinID=:rid" |
| 1169 | " AND filename>:srcpath||'/'" |
| 1170 | " AND filename<:srcpath||'0'" |
| 1171 | ); |
| 1172 | db_prepare(&cpyRoot, |
| 1173 | "INSERT INTO xfiles (tpath, tbranch, tuuid, tperm)" |
| 1174 | " SELECT :path||filename, :branch, uuid, perm" |
| 1175 | " FROM xfoci" |
| 1176 | " WHERE checkinID=:rid" |
| 1177 | ); |
| 1178 | db_prepare(&revSrc, |
| 1179 | "UPDATE xrevisions SET tparent=:parent" |
| 1180 | " WHERE trev=:rev AND tbranch=:branch AND tparent<:parent" |
| 1181 | ); |
| 1182 | gsvn.rev = -1; |
| @@ -1232,16 +1233,17 @@ | |
| 1233 | srcBranch = svn_parse_path(zSrcPath, &zSrcFile); |
| 1234 | if( srcBranch==0 ){ |
| 1235 | fossil_fatal("Copy from path outside the import paths"); |
| 1236 | } |
| 1237 | } |
| 1238 | if( zFile[0]==0 ){ |
| 1239 | bag_insert(&gsvn.newBranches, branchId); |
| 1240 | } |
| 1241 | if( strncmp(zAction, "delete", 6)==0 |
| 1242 | || strncmp(zAction, "replace", 7)==0 ) |
| 1243 | { |
| 1244 | //TODO delete root |
| 1245 | db_bind_text(&delPath, ":path", zFile); |
| 1246 | db_bind_int(&delPath, ":branch", branchId); |
| 1247 | db_step(&delPath); |
| 1248 | db_reset(&delPath); |
| 1249 | db_bind_int(&addRev, ":branch", branchId); |
| @@ -1258,16 +1260,24 @@ | |
| 1260 | if( zSrcPath ){ |
| 1261 | srcRid = db_int(0, "SELECT trid, max(trev) FROM xrevisions" |
| 1262 | " WHERE trev<=%d AND tbranch=%d", |
| 1263 | srcRev, srcBranch); |
| 1264 | if( srcRid>0 ){ |
| 1265 | if( zFile[0]==0 ){ |
| 1266 | db_bind_text(&cpyRoot, ":path", zFile); |
| 1267 | db_bind_int(&cpyRoot, ":branch", branchId); |
| 1268 | db_bind_int(&cpyRoot, ":rid", srcRid); |
| 1269 | db_step(&cpyRoot); |
| 1270 | db_reset(&cpyRoot); |
| 1271 | }else{ |
| 1272 | db_bind_text(&cpyPath, ":path", zFile); |
| 1273 | db_bind_int(&cpyPath, ":branch", branchId); |
| 1274 | db_bind_text(&cpyPath, ":srcpath", zSrcFile); |
| 1275 | db_bind_int(&cpyPath, ":rid", srcRid); |
| 1276 | db_step(&cpyPath); |
| 1277 | db_reset(&cpyPath); |
| 1278 | } |
| 1279 | db_bind_int(&addRev, ":branch", branchId); |
| 1280 | db_step(&addRev); |
| 1281 | db_reset(&addRev); |
| 1282 | } |
| 1283 | } |
| @@ -1358,10 +1368,11 @@ | |
| 1368 | fossil_free(gsvn.zDate); |
| 1369 | db_finalize(&addFile); |
| 1370 | db_finalize(&delPath); |
| 1371 | db_finalize(&addRev); |
| 1372 | db_finalize(&cpyPath); |
| 1373 | db_finalize(&cpyRoot); |
| 1374 | db_finalize(&revSrc); |
| 1375 | fossil_print(" Done!\n"); |
| 1376 | } |
| 1377 | |
| 1378 | /* |
| 1379 |