951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
|
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
|
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
pParentFile = manifest_file_next(pParentManifest, 0);
parentBranch = db_int(0, "SELECT tbranch FROM xrevisions WHERE trid=%d",
parentRid);
if( parentBranch!=branchId && branchType!=SVN_TAG ){
sameAsParent = 0;
}
}
if( mergeRid<MAX_INT_32 ){
if( gsvn.zComment ){
blob_appendf(&manifest, "C %F\n", gsvn.zComment);
}else{
blob_append(&manifest, "C (no\\scomment)\n", 16);
}
blob_appendf(&manifest, "D %s\n", gsvn.zDate);
db_bind_int(&getFiles, ":branch", branchId);
while( db_step(&getFiles)==SQLITE_ROW ){
const char *zFile = db_column_text(&getFiles, 0);
const char *zUuid = db_column_text(&getFiles, 1);
const char *zPerm = db_column_text(&getFiles, 2);
blob_appendf(&manifest, "F %F %s%s\n", zFile, zUuid, zPerm);
if( sameAsParent ){
if( !pParentFile
|| fossil_strcmp(pParentFile->zName,zFile)!=0
|| fossil_strcmp(pParentFile->zUuid,zUuid)!=0
|| fossil_strcmp(pParentFile->zPerm,zPerm)!=0
){
sameAsParent = 0;
}else{
pParentFile = manifest_file_next(pParentManifest, 0);
}
}
}
if( pParentFile ){
sameAsParent = 0;
}
db_reset(&getFiles);
if( !sameAsParent ){
if( parentRid>0 ){
char *zParentUuid = rid_to_uuid(parentRid);
if( parentRid==mergeRid || mergeRid==0){
char *zParentBranch =
db_text(0, "SELECT tname FROM xbranches WHERE tid=%d",
parentBranch
);
blob_appendf(&manifest, "P %s\n", zParentUuid);
blob_appendf(&manifest, "T *branch * %F\n", zBranch);
blob_appendf(&manifest, "T *sym-%F *\n", zBranch);
blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev);
blob_appendf(&manifest, "T -sym-%F *\n", zParentBranch);
fossil_free(zParentBranch);
}else{
char *zMergeUuid = rid_to_uuid(mergeRid);
blob_appendf(&manifest, "P %s %s\n", zParentUuid, zMergeUuid);
blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev);
fossil_free(zMergeUuid);
}
fossil_free(zParentUuid);
}else{
blob_appendf(&manifest, "T *branch * %F\n", zBranch);
blob_appendf(&manifest, "T *sym-%F *\n", zBranch);
blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev);
}
}else if( branchType==SVN_TAG ){
char *zParentUuid = rid_to_uuid(parentRid);
blob_reset(&manifest);
blob_appendf(&manifest, "D %s\n", gsvn.zDate);
blob_appendf(&manifest, "T +sym-%F %s\n", zBranch, zParentUuid);
if( gsvn.zComment ){
blob_appendf(&manifest, "C %F\n", gsvn.zComment);
}else{
blob_append(&manifest, "C (no\\scomment)\n", 16);
}
blob_appendf(&manifest, "D %s\n", gsvn.zDate);
db_bind_int(&getFiles, ":branch", branchId);
while( db_step(&getFiles)==SQLITE_ROW ){
const char *zFile = db_column_text(&getFiles, 0);
const char *zUuid = db_column_text(&getFiles, 1);
const char *zPerm = db_column_text(&getFiles, 2);
if( zPerm ){
blob_appendf(&manifest, "F %F %s %s\n", zFile, zUuid, zPerm);
}else{
blob_appendf(&manifest, "F %F %s\n", zFile, zUuid);
}
if( sameAsParent ){
if( !pParentFile
|| fossil_strcmp(pParentFile->zName,zFile)!=0
|| fossil_strcmp(pParentFile->zUuid,zUuid)!=0
|| fossil_strcmp(pParentFile->zPerm,zPerm)!=0
){
sameAsParent = 0;
}else{
pParentFile = manifest_file_next(pParentManifest, 0);
}
}
}
if( pParentFile ){
sameAsParent = 0;
}
db_reset(&getFiles);
if( !sameAsParent ){
if( parentRid>0 ){
char *zParentUuid = rid_to_uuid(parentRid);
if( parentRid==mergeRid || mergeRid==0){
char *zParentBranch =
db_text(0, "SELECT tname FROM xbranches WHERE tid=%d",
parentBranch
);
blob_appendf(&manifest, "P %s\n", zParentUuid);
blob_appendf(&manifest, "T *branch * %F\n", zBranch);
blob_appendf(&manifest, "T *sym-%F *\n", zBranch);
blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev);
blob_appendf(&manifest, "T -sym-%F *\n", zParentBranch);
fossil_free(zParentBranch);
}else{
char *zMergeUuid = rid_to_uuid(mergeRid);
blob_appendf(&manifest, "P %s %s\n", zParentUuid, zMergeUuid);
blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev);
fossil_free(zMergeUuid);
}
fossil_free(zParentUuid);
}else{
blob_appendf(&manifest, "T *branch * %F\n", zBranch);
blob_appendf(&manifest, "T *sym-%F *\n", zBranch);
blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev);
}
}else if( branchType==SVN_TAG ){
char *zParentUuid = rid_to_uuid(parentRid);
blob_reset(&manifest);
blob_appendf(&manifest, "D %s\n", gsvn.zDate);
blob_appendf(&manifest, "T +sym-%F %s\n", zBranch, zParentUuid);
fossil_free(zParentUuid);
}
}else{
char *zParentUuid = rid_to_uuid(parentRid);
blob_appendf(&manifest, "D %s\n", gsvn.zDate);
if( branchType!=SVN_TAG ){
blob_appendf(&manifest, "T +closed %s\n", zParentUuid);
}else{
blob_appendf(&manifest, "T -sym-%F %s\n", zBranch, zParentUuid);
}
fossil_free(zParentUuid);
}
if( gsvn.zUser ){
blob_appendf(&manifest, "U %F\n", gsvn.zUser);
}else{
const char *zUserOvrd = find_option("user-override",0,1);
blob_appendf(&manifest, "U %F\n", zUserOvrd ? zUserOvrd : login_name());
|
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
|
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
|
-
+
|
db_prepare(&addFile,
"INSERT INTO xfiles (tpath, tbranch, tuuid, tperm)"
" VALUES(:path, :branch, (SELECT uuid FROM blob WHERE rid=:rid), :perm)"
);
db_prepare(&delPath,
"DELETE FROM xfiles"
" WHERE (tpath=:path OR (tpath>:path||'/' AND tpath<:path||'0'))"
" AND tbranch=:branch"
" AND tbranch=:branch"
);
db_prepare(&addRev,
"INSERT OR IGNORE INTO xrevisions (trev, tbranch) VALUES(:rev, :branch)"
);
db_prepare(&cpyPath,
"INSERT INTO xfiles (tpath, tbranch, tuuid, tperm)"
" SELECT :path||:sep||substr(filename, length(:srcpath)+2), :branch, uuid, perm"
|
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
|
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
|
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
|
}else
if( (zTemp = svn_find_header(rec, "Node-path")) ){ /* file/dir node */
char *zFile;
int branchType;
int branchId = svn_parse_path(zTemp, &zFile, &branchType);
char *zAction = svn_find_header(rec, "Node-action");
char *zKind = svn_find_header(rec, "Node-kind");
char *zPerm = svn_find_prop(rec, "svn:executable") ? " x" : 0;
char *zPerm = svn_find_prop(rec, "svn:executable") ? "x" : 0;
int deltaFlag = 0;
int srcRev = 0;
if( branchId==0 ){
svn_free_rec(&rec);
continue;
}
if( (zTemp = svn_find_header(rec, "Text-delta")) ){
deltaFlag = strncmp(zTemp, "true", 4)==0;
}
if( strncmp(zAction, "delete", 6)==0
|| strncmp(zAction, "replace", 7)==0 )
{
//TODO delete root
db_bind_text(&delPath, ":path", zFile);
db_bind_int(&delPath, ":branch", branchId);
db_step(&delPath);
db_reset(&delPath);
db_bind_int(&addRev, ":branch", branchId);
db_step(&addRev);
db_reset(&addRev);
if( zFile[0]!=0 ){
db_bind_text(&delPath, ":path", zFile);
db_bind_int(&delPath, ":branch", branchId);
db_step(&delPath);
db_reset(&delPath);
}else{
db_multi_exec("DELETE FROM xfiles WHERE tbranch=%d", branchId);
db_bind_int(&revSrc, ":parent", MAX_INT_32);
db_bind_int(&revSrc, ":rev", gsvn.rev);
db_bind_int(&revSrc, ":branch", branchId);
db_step(&revSrc);
db_reset(&revSrc);
}
} /* no 'else' here since 'replace' does both a 'delete' and an 'add' */
if( strncmp(zAction, "add", 3)==0
|| strncmp(zAction, "replace", 7)==0 )
{
char *zSrcPath = svn_find_header(rec, "Node-copyfrom-path");
char *zSrcFile;
int srcRid = 0;
|