Fossil SCM
fixes for various edge cases
Commit
c9fb495e3d22433766aea793585877afbc40256b
Parent
5488f7dd8256204…
2 files changed
-2
+62
-38
M
src/db.c
-2
| --- src/db.c | ||
| +++ src/db.c | ||
| @@ -286,12 +286,10 @@ | ||
| 286 | 286 | pStmt->pNext = db.pAllStmt; |
| 287 | 287 | pStmt->pPrev = 0; |
| 288 | 288 | if( db.pAllStmt ) db.pAllStmt->pPrev = pStmt; |
| 289 | 289 | db.pAllStmt = pStmt; |
| 290 | 290 | va_end(ap); |
| 291 | - }else{ | |
| 292 | - db_reset(pStmt); | |
| 293 | 291 | } |
| 294 | 292 | return rc; |
| 295 | 293 | } |
| 296 | 294 | |
| 297 | 295 | /* |
| 298 | 296 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -286,12 +286,10 @@ | |
| 286 | pStmt->pNext = db.pAllStmt; |
| 287 | pStmt->pPrev = 0; |
| 288 | if( db.pAllStmt ) db.pAllStmt->pPrev = pStmt; |
| 289 | db.pAllStmt = pStmt; |
| 290 | va_end(ap); |
| 291 | }else{ |
| 292 | db_reset(pStmt); |
| 293 | } |
| 294 | return rc; |
| 295 | } |
| 296 | |
| 297 | /* |
| 298 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -286,12 +286,10 @@ | |
| 286 | pStmt->pNext = db.pAllStmt; |
| 287 | pStmt->pPrev = 0; |
| 288 | if( db.pAllStmt ) db.pAllStmt->pPrev = pStmt; |
| 289 | db.pAllStmt = pStmt; |
| 290 | va_end(ap); |
| 291 | } |
| 292 | return rc; |
| 293 | } |
| 294 | |
| 295 | /* |
| 296 |
+62
-38
| --- src/import.c | ||
| +++ src/import.c | ||
| @@ -842,39 +842,45 @@ | ||
| 842 | 842 | } |
| 843 | 843 | zLine = pRawProps; |
| 844 | 844 | while( zLine<(pRawProps+nRawProps-10) ){ |
| 845 | 845 | char *eol; |
| 846 | 846 | int propLen; |
| 847 | - if( zLine[0]!='K' ){ | |
| 848 | - fossil_fatal("svn-dump data format broken"); | |
| 849 | - } | |
| 850 | - propLen = atoi(&zLine[2]); | |
| 851 | - eol = strchr(zLine, '\n'); | |
| 852 | - zLine = eol+1; | |
| 853 | - eol = zLine+propLen; | |
| 854 | - if( *eol!='\n' ){ | |
| 855 | - fossil_fatal("svn-dump data format broken"); | |
| 856 | - } | |
| 857 | - *eol = 0; | |
| 858 | - rec->nProps += 1; | |
| 859 | - rec->aProps = fossil_realloc(rec->aProps, | |
| 860 | - sizeof(rec->aProps[0])*rec->nProps); | |
| 861 | - rec->aProps[rec->nProps-1].zKey = zLine; | |
| 862 | - zLine = eol+1; | |
| 863 | - if( zLine[0]!='V' ){ | |
| 864 | - fossil_fatal("svn-dump data format broken"); | |
| 865 | - } | |
| 866 | - propLen = atoi(&zLine[2]); | |
| 867 | - eol = strchr(zLine, '\n'); | |
| 868 | - zLine = eol+1; | |
| 869 | - eol = zLine+propLen; | |
| 870 | - if( *eol!='\n' ){ | |
| 871 | - fossil_fatal("svn-dump data format broken"); | |
| 872 | - } | |
| 873 | - *eol = 0; | |
| 874 | - rec->aProps[rec->nProps-1].zVal = zLine; | |
| 875 | - zLine = eol+1; | |
| 847 | + if( zLine[0]=='D' ){ | |
| 848 | + propLen = atoi(&zLine[2]); | |
| 849 | + eol = strchr(zLine, '\n'); | |
| 850 | + zLine = eol+1+propLen+1; | |
| 851 | + }else{ | |
| 852 | + if( zLine[0]!='K' ){ | |
| 853 | + fossil_fatal("svn-dump data format broken"); | |
| 854 | + } | |
| 855 | + propLen = atoi(&zLine[2]); | |
| 856 | + eol = strchr(zLine, '\n'); | |
| 857 | + zLine = eol+1; | |
| 858 | + eol = zLine+propLen; | |
| 859 | + if( *eol!='\n' ){ | |
| 860 | + fossil_fatal("svn-dump data format broken"); | |
| 861 | + } | |
| 862 | + *eol = 0; | |
| 863 | + rec->nProps += 1; | |
| 864 | + rec->aProps = fossil_realloc(rec->aProps, | |
| 865 | + sizeof(rec->aProps[0])*rec->nProps); | |
| 866 | + rec->aProps[rec->nProps-1].zKey = zLine; | |
| 867 | + zLine = eol+1; | |
| 868 | + if( zLine[0]!='V' ){ | |
| 869 | + fossil_fatal("svn-dump data format broken"); | |
| 870 | + } | |
| 871 | + propLen = atoi(&zLine[2]); | |
| 872 | + eol = strchr(zLine, '\n'); | |
| 873 | + zLine = eol+1; | |
| 874 | + eol = zLine+propLen; | |
| 875 | + if( *eol!='\n' ){ | |
| 876 | + fossil_fatal("svn-dump data format broken"); | |
| 877 | + } | |
| 878 | + *eol = 0; | |
| 879 | + rec->aProps[rec->nProps-1].zVal = zLine; | |
| 880 | + zLine = eol+1; | |
| 881 | + } | |
| 876 | 882 | } |
| 877 | 883 | } |
| 878 | 884 | } |
| 879 | 885 | |
| 880 | 886 | static int svn_read_rec(FILE *pIn, SvnRecord *rec){ |
| @@ -911,10 +917,11 @@ | ||
| 911 | 917 | int nFilter; |
| 912 | 918 | int rid; |
| 913 | 919 | const char *zParentBranch = 0; |
| 914 | 920 | Blob mcksum; |
| 915 | 921 | |
| 922 | + blob_zero(&manifest); | |
| 916 | 923 | nBaseFilter = blob_size(&gsvn.filter); |
| 917 | 924 | if( !gsvn.flatFlag ){ |
| 918 | 925 | if( gsvn.zBranch==0 ){ return; } |
| 919 | 926 | if( strncmp(gsvn.zBranch, gsvn.zTrunk, gsvn.lenTrunk-1)==0 ){ |
| 920 | 927 | blob_appendf(&gsvn.filter, "%s*", gsvn.zTrunk); |
| @@ -925,12 +932,11 @@ | ||
| 925 | 932 | blob_append(&gsvn.filter, "*", 1); |
| 926 | 933 | } |
| 927 | 934 | if( db_int(0, "SELECT 1 FROM xhist WHERE trev=%d AND tpath GLOB %Q LIMIT 1", |
| 928 | 935 | gsvn.rev, blob_str(&gsvn.filter))==0 |
| 929 | 936 | ){ |
| 930 | - blob_resize(&gsvn.filter, nBaseFilter); | |
| 931 | - return; | |
| 937 | + goto skip_revision; | |
| 932 | 938 | } |
| 933 | 939 | db_static_prepare(&insRev, "REPLACE INTO xrevisions (trev, tbranch, tuuid) " |
| 934 | 940 | "VALUES(:rev, :branch, " |
| 935 | 941 | " (SELECT uuid FROM blob WHERE rid=:rid))"); |
| 936 | 942 | db_static_prepare(&qParent, "SELECT tuuid, max(trev) FROM xrevisions " |
| @@ -947,29 +953,35 @@ | ||
| 947 | 953 | if( gsvn.parentRev<0 ){ |
| 948 | 954 | gsvn.parentRev = |
| 949 | 955 | db_int(-1, "SELECT ifnull(max(trev),-1) FROM xrevisions"); |
| 950 | 956 | } |
| 951 | 957 | gsvn.zParentBranch = gsvn.zBranch; |
| 958 | + }else if( gsvn.zParentBranch==0 ){ | |
| 959 | + gsvn.zParentBranch = mprintf("trunk"); | |
| 952 | 960 | } |
| 953 | - db_bind_int(&insRev, ":rev", gsvn.rev); | |
| 961 | + /*db_bind_int(&insRev, ":rev", gsvn.rev); | |
| 954 | 962 | db_bind_text(&insRev, ":branch", gsvn.zBranch); |
| 955 | 963 | db_bind_int(&insRev, ":rid", 0); |
| 956 | 964 | db_step(&insRev); |
| 957 | - db_reset(&insRev); | |
| 965 | + db_reset(&insRev);*/ | |
| 958 | 966 | }else{ |
| 959 | 967 | static int prevRev = -1; |
| 960 | 968 | gsvn.parentRev = prevRev; |
| 961 | 969 | gsvn.zParentBranch = gsvn.zBranch = ""; |
| 962 | 970 | prevRev = gsvn.rev; |
| 963 | 971 | } |
| 964 | - blob_zero(&manifest); | |
| 972 | + | |
| 965 | 973 | if( gsvn.zComment ){ |
| 966 | 974 | blob_appendf(&manifest, "C %F\n", gsvn.zComment); |
| 967 | 975 | }else{ |
| 968 | 976 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| 969 | 977 | } |
| 970 | - blob_appendf(&manifest, "D %s\n", gsvn.zDate); | |
| 978 | + if( gsvn.zDate ){ | |
| 979 | + blob_appendf(&manifest, "D %s\n", gsvn.zDate); | |
| 980 | + }else{ | |
| 981 | + goto skip_revision; | |
| 982 | + } | |
| 971 | 983 | nFilter = blob_size(&gsvn.filter)-1; |
| 972 | 984 | db_bind_text(&qFiles, ":filter", blob_str(&gsvn.filter)); |
| 973 | 985 | while( db_step(&qFiles)==SQLITE_ROW ){ |
| 974 | 986 | const char *zFile = db_column_text(&qFiles, 0); |
| 975 | 987 | int rid = db_column_int(&qFiles, 1); |
| @@ -977,11 +989,11 @@ | ||
| 977 | 989 | const char *zUuid; |
| 978 | 990 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 979 | 991 | blob_appendf(&manifest, "F %F %s %s\n", zFile+nFilter, zUuid, zPerm); |
| 980 | 992 | fossil_free(zUuid); |
| 981 | 993 | } |
| 982 | - blob_resize(&gsvn.filter, nBaseFilter); | |
| 994 | + db_reset(&qFiles); | |
| 983 | 995 | if( gsvn.parentRev>=0 ){ |
| 984 | 996 | const char *zParentUuid; |
| 985 | 997 | db_bind_int(&qParent, ":rev", gsvn.parentRev); |
| 986 | 998 | db_bind_text(&qParent, ":branch", gsvn.zParentBranch); |
| 987 | 999 | db_step(&qParent); |
| @@ -999,19 +1011,22 @@ | ||
| 999 | 1011 | zParentBranch = mprintf("%F", gsvn.zParentBranch); |
| 1000 | 1012 | }else{ |
| 1001 | 1013 | zParentBranch = 0; |
| 1002 | 1014 | } |
| 1003 | 1015 | } |
| 1016 | + db_reset(&qParent); | |
| 1017 | + db_reset(&qParent2); | |
| 1004 | 1018 | }else{ |
| 1005 | 1019 | blob_appendf(&manifest, "T *branch * trunk\n"); |
| 1006 | 1020 | blob_appendf(&manifest, "T *sym-trunk *\n"); |
| 1007 | 1021 | } |
| 1008 | 1022 | db_bind_int(&qTags, ":rev", gsvn.rev); |
| 1009 | 1023 | while( db_step(&qTags)==SQLITE_ROW ){ |
| 1010 | 1024 | const char *zTag = db_column_text(&qTags, 0); |
| 1011 | 1025 | blob_appendf(&manifest, "T +sym-%s *\n", zTag); |
| 1012 | 1026 | } |
| 1027 | + db_reset(&qTags); | |
| 1013 | 1028 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); |
| 1014 | 1029 | if( zParentBranch ) { |
| 1015 | 1030 | blob_appendf(&manifest, "T -sym-%s *\n", zParentBranch); |
| 1016 | 1031 | fossil_free(zParentBranch); |
| 1017 | 1032 | } |
| @@ -1028,10 +1043,14 @@ | ||
| 1028 | 1043 | rid = content_put(&manifest); |
| 1029 | 1044 | db_bind_int(&insRev, ":rev", gsvn.rev); |
| 1030 | 1045 | db_bind_text(&insRev, ":branch", gsvn.zBranch); |
| 1031 | 1046 | db_bind_int(&insRev, ":rid", rid); |
| 1032 | 1047 | db_step(&insRev); |
| 1048 | + db_reset(&insRev); | |
| 1049 | + | |
| 1050 | +skip_revision: | |
| 1051 | + blob_resize(&gsvn.filter, nBaseFilter); | |
| 1033 | 1052 | if( gsvn.zParentBranch == gsvn.zBranch ){ |
| 1034 | 1053 | gsvn.zParentBranch = 0; |
| 1035 | 1054 | } |
| 1036 | 1055 | if( gsvn.flatFlag ){ |
| 1037 | 1056 | gsvn.zBranch = 0; |
| @@ -1179,11 +1198,14 @@ | ||
| 1179 | 1198 | } |
| 1180 | 1199 | /* start new revision */ |
| 1181 | 1200 | gsvn.rev = atoi(zTemp); |
| 1182 | 1201 | gsvn.zUser = mprintf("%s", svn_find_prop(rec, "svn:author")); |
| 1183 | 1202 | gsvn.zComment = mprintf("%s", svn_find_prop(rec, "svn:log")); |
| 1184 | - gsvn.zDate = date_in_standard_format(svn_find_prop(rec, "svn:date")); | |
| 1203 | + gsvn.zDate = svn_find_prop(rec, "svn:date"); | |
| 1204 | + if( gsvn.zDate ){ | |
| 1205 | + gsvn.zDate = date_in_standard_format(gsvn.zDate); | |
| 1206 | + } | |
| 1185 | 1207 | gsvn.parentRev = -1; |
| 1186 | 1208 | gsvn.zParentBranch = 0; |
| 1187 | 1209 | gsvn.zBranch = 0; |
| 1188 | 1210 | bHasFiles = 0; |
| 1189 | 1211 | fossil_print("\rImporting SVN revision: %d", gsvn.rev); |
| @@ -1211,11 +1233,13 @@ | ||
| 1211 | 1233 | } |
| 1212 | 1234 | } |
| 1213 | 1235 | if( !gsvn.flatFlag ){ |
| 1214 | 1236 | if( (zTemp=svn_extract_branch(zPath))!=0 ){ |
| 1215 | 1237 | if( gsvn.zBranch!=0 ){ |
| 1216 | - if( strcmp(zTemp, gsvn.zBranch)!=0 ){ | |
| 1238 | + if( strcmp(zTemp, gsvn.zBranch)!=0 | |
| 1239 | + && strncmp(zAction, "delete", 6)!=0) | |
| 1240 | + { | |
| 1217 | 1241 | fossil_fatal("Commit to multiple branches"); |
| 1218 | 1242 | } |
| 1219 | 1243 | fossil_free(zTemp); |
| 1220 | 1244 | }else{ |
| 1221 | 1245 | gsvn.zBranch = zTemp; |
| 1222 | 1246 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -842,39 +842,45 @@ | |
| 842 | } |
| 843 | zLine = pRawProps; |
| 844 | while( zLine<(pRawProps+nRawProps-10) ){ |
| 845 | char *eol; |
| 846 | int propLen; |
| 847 | if( zLine[0]!='K' ){ |
| 848 | fossil_fatal("svn-dump data format broken"); |
| 849 | } |
| 850 | propLen = atoi(&zLine[2]); |
| 851 | eol = strchr(zLine, '\n'); |
| 852 | zLine = eol+1; |
| 853 | eol = zLine+propLen; |
| 854 | if( *eol!='\n' ){ |
| 855 | fossil_fatal("svn-dump data format broken"); |
| 856 | } |
| 857 | *eol = 0; |
| 858 | rec->nProps += 1; |
| 859 | rec->aProps = fossil_realloc(rec->aProps, |
| 860 | sizeof(rec->aProps[0])*rec->nProps); |
| 861 | rec->aProps[rec->nProps-1].zKey = zLine; |
| 862 | zLine = eol+1; |
| 863 | if( zLine[0]!='V' ){ |
| 864 | fossil_fatal("svn-dump data format broken"); |
| 865 | } |
| 866 | propLen = atoi(&zLine[2]); |
| 867 | eol = strchr(zLine, '\n'); |
| 868 | zLine = eol+1; |
| 869 | eol = zLine+propLen; |
| 870 | if( *eol!='\n' ){ |
| 871 | fossil_fatal("svn-dump data format broken"); |
| 872 | } |
| 873 | *eol = 0; |
| 874 | rec->aProps[rec->nProps-1].zVal = zLine; |
| 875 | zLine = eol+1; |
| 876 | } |
| 877 | } |
| 878 | } |
| 879 | |
| 880 | static int svn_read_rec(FILE *pIn, SvnRecord *rec){ |
| @@ -911,10 +917,11 @@ | |
| 911 | int nFilter; |
| 912 | int rid; |
| 913 | const char *zParentBranch = 0; |
| 914 | Blob mcksum; |
| 915 | |
| 916 | nBaseFilter = blob_size(&gsvn.filter); |
| 917 | if( !gsvn.flatFlag ){ |
| 918 | if( gsvn.zBranch==0 ){ return; } |
| 919 | if( strncmp(gsvn.zBranch, gsvn.zTrunk, gsvn.lenTrunk-1)==0 ){ |
| 920 | blob_appendf(&gsvn.filter, "%s*", gsvn.zTrunk); |
| @@ -925,12 +932,11 @@ | |
| 925 | blob_append(&gsvn.filter, "*", 1); |
| 926 | } |
| 927 | if( db_int(0, "SELECT 1 FROM xhist WHERE trev=%d AND tpath GLOB %Q LIMIT 1", |
| 928 | gsvn.rev, blob_str(&gsvn.filter))==0 |
| 929 | ){ |
| 930 | blob_resize(&gsvn.filter, nBaseFilter); |
| 931 | return; |
| 932 | } |
| 933 | db_static_prepare(&insRev, "REPLACE INTO xrevisions (trev, tbranch, tuuid) " |
| 934 | "VALUES(:rev, :branch, " |
| 935 | " (SELECT uuid FROM blob WHERE rid=:rid))"); |
| 936 | db_static_prepare(&qParent, "SELECT tuuid, max(trev) FROM xrevisions " |
| @@ -947,29 +953,35 @@ | |
| 947 | if( gsvn.parentRev<0 ){ |
| 948 | gsvn.parentRev = |
| 949 | db_int(-1, "SELECT ifnull(max(trev),-1) FROM xrevisions"); |
| 950 | } |
| 951 | gsvn.zParentBranch = gsvn.zBranch; |
| 952 | } |
| 953 | db_bind_int(&insRev, ":rev", gsvn.rev); |
| 954 | db_bind_text(&insRev, ":branch", gsvn.zBranch); |
| 955 | db_bind_int(&insRev, ":rid", 0); |
| 956 | db_step(&insRev); |
| 957 | db_reset(&insRev); |
| 958 | }else{ |
| 959 | static int prevRev = -1; |
| 960 | gsvn.parentRev = prevRev; |
| 961 | gsvn.zParentBranch = gsvn.zBranch = ""; |
| 962 | prevRev = gsvn.rev; |
| 963 | } |
| 964 | blob_zero(&manifest); |
| 965 | if( gsvn.zComment ){ |
| 966 | blob_appendf(&manifest, "C %F\n", gsvn.zComment); |
| 967 | }else{ |
| 968 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| 969 | } |
| 970 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 971 | nFilter = blob_size(&gsvn.filter)-1; |
| 972 | db_bind_text(&qFiles, ":filter", blob_str(&gsvn.filter)); |
| 973 | while( db_step(&qFiles)==SQLITE_ROW ){ |
| 974 | const char *zFile = db_column_text(&qFiles, 0); |
| 975 | int rid = db_column_int(&qFiles, 1); |
| @@ -977,11 +989,11 @@ | |
| 977 | const char *zUuid; |
| 978 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 979 | blob_appendf(&manifest, "F %F %s %s\n", zFile+nFilter, zUuid, zPerm); |
| 980 | fossil_free(zUuid); |
| 981 | } |
| 982 | blob_resize(&gsvn.filter, nBaseFilter); |
| 983 | if( gsvn.parentRev>=0 ){ |
| 984 | const char *zParentUuid; |
| 985 | db_bind_int(&qParent, ":rev", gsvn.parentRev); |
| 986 | db_bind_text(&qParent, ":branch", gsvn.zParentBranch); |
| 987 | db_step(&qParent); |
| @@ -999,19 +1011,22 @@ | |
| 999 | zParentBranch = mprintf("%F", gsvn.zParentBranch); |
| 1000 | }else{ |
| 1001 | zParentBranch = 0; |
| 1002 | } |
| 1003 | } |
| 1004 | }else{ |
| 1005 | blob_appendf(&manifest, "T *branch * trunk\n"); |
| 1006 | blob_appendf(&manifest, "T *sym-trunk *\n"); |
| 1007 | } |
| 1008 | db_bind_int(&qTags, ":rev", gsvn.rev); |
| 1009 | while( db_step(&qTags)==SQLITE_ROW ){ |
| 1010 | const char *zTag = db_column_text(&qTags, 0); |
| 1011 | blob_appendf(&manifest, "T +sym-%s *\n", zTag); |
| 1012 | } |
| 1013 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); |
| 1014 | if( zParentBranch ) { |
| 1015 | blob_appendf(&manifest, "T -sym-%s *\n", zParentBranch); |
| 1016 | fossil_free(zParentBranch); |
| 1017 | } |
| @@ -1028,10 +1043,14 @@ | |
| 1028 | rid = content_put(&manifest); |
| 1029 | db_bind_int(&insRev, ":rev", gsvn.rev); |
| 1030 | db_bind_text(&insRev, ":branch", gsvn.zBranch); |
| 1031 | db_bind_int(&insRev, ":rid", rid); |
| 1032 | db_step(&insRev); |
| 1033 | if( gsvn.zParentBranch == gsvn.zBranch ){ |
| 1034 | gsvn.zParentBranch = 0; |
| 1035 | } |
| 1036 | if( gsvn.flatFlag ){ |
| 1037 | gsvn.zBranch = 0; |
| @@ -1179,11 +1198,14 @@ | |
| 1179 | } |
| 1180 | /* start new revision */ |
| 1181 | gsvn.rev = atoi(zTemp); |
| 1182 | gsvn.zUser = mprintf("%s", svn_find_prop(rec, "svn:author")); |
| 1183 | gsvn.zComment = mprintf("%s", svn_find_prop(rec, "svn:log")); |
| 1184 | gsvn.zDate = date_in_standard_format(svn_find_prop(rec, "svn:date")); |
| 1185 | gsvn.parentRev = -1; |
| 1186 | gsvn.zParentBranch = 0; |
| 1187 | gsvn.zBranch = 0; |
| 1188 | bHasFiles = 0; |
| 1189 | fossil_print("\rImporting SVN revision: %d", gsvn.rev); |
| @@ -1211,11 +1233,13 @@ | |
| 1211 | } |
| 1212 | } |
| 1213 | if( !gsvn.flatFlag ){ |
| 1214 | if( (zTemp=svn_extract_branch(zPath))!=0 ){ |
| 1215 | if( gsvn.zBranch!=0 ){ |
| 1216 | if( strcmp(zTemp, gsvn.zBranch)!=0 ){ |
| 1217 | fossil_fatal("Commit to multiple branches"); |
| 1218 | } |
| 1219 | fossil_free(zTemp); |
| 1220 | }else{ |
| 1221 | gsvn.zBranch = zTemp; |
| 1222 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -842,39 +842,45 @@ | |
| 842 | } |
| 843 | zLine = pRawProps; |
| 844 | while( zLine<(pRawProps+nRawProps-10) ){ |
| 845 | char *eol; |
| 846 | int propLen; |
| 847 | if( zLine[0]=='D' ){ |
| 848 | propLen = atoi(&zLine[2]); |
| 849 | eol = strchr(zLine, '\n'); |
| 850 | zLine = eol+1+propLen+1; |
| 851 | }else{ |
| 852 | if( zLine[0]!='K' ){ |
| 853 | fossil_fatal("svn-dump data format broken"); |
| 854 | } |
| 855 | propLen = atoi(&zLine[2]); |
| 856 | eol = strchr(zLine, '\n'); |
| 857 | zLine = eol+1; |
| 858 | eol = zLine+propLen; |
| 859 | if( *eol!='\n' ){ |
| 860 | fossil_fatal("svn-dump data format broken"); |
| 861 | } |
| 862 | *eol = 0; |
| 863 | rec->nProps += 1; |
| 864 | rec->aProps = fossil_realloc(rec->aProps, |
| 865 | sizeof(rec->aProps[0])*rec->nProps); |
| 866 | rec->aProps[rec->nProps-1].zKey = zLine; |
| 867 | zLine = eol+1; |
| 868 | if( zLine[0]!='V' ){ |
| 869 | fossil_fatal("svn-dump data format broken"); |
| 870 | } |
| 871 | propLen = atoi(&zLine[2]); |
| 872 | eol = strchr(zLine, '\n'); |
| 873 | zLine = eol+1; |
| 874 | eol = zLine+propLen; |
| 875 | if( *eol!='\n' ){ |
| 876 | fossil_fatal("svn-dump data format broken"); |
| 877 | } |
| 878 | *eol = 0; |
| 879 | rec->aProps[rec->nProps-1].zVal = zLine; |
| 880 | zLine = eol+1; |
| 881 | } |
| 882 | } |
| 883 | } |
| 884 | } |
| 885 | |
| 886 | static int svn_read_rec(FILE *pIn, SvnRecord *rec){ |
| @@ -911,10 +917,11 @@ | |
| 917 | int nFilter; |
| 918 | int rid; |
| 919 | const char *zParentBranch = 0; |
| 920 | Blob mcksum; |
| 921 | |
| 922 | blob_zero(&manifest); |
| 923 | nBaseFilter = blob_size(&gsvn.filter); |
| 924 | if( !gsvn.flatFlag ){ |
| 925 | if( gsvn.zBranch==0 ){ return; } |
| 926 | if( strncmp(gsvn.zBranch, gsvn.zTrunk, gsvn.lenTrunk-1)==0 ){ |
| 927 | blob_appendf(&gsvn.filter, "%s*", gsvn.zTrunk); |
| @@ -925,12 +932,11 @@ | |
| 932 | blob_append(&gsvn.filter, "*", 1); |
| 933 | } |
| 934 | if( db_int(0, "SELECT 1 FROM xhist WHERE trev=%d AND tpath GLOB %Q LIMIT 1", |
| 935 | gsvn.rev, blob_str(&gsvn.filter))==0 |
| 936 | ){ |
| 937 | goto skip_revision; |
| 938 | } |
| 939 | db_static_prepare(&insRev, "REPLACE INTO xrevisions (trev, tbranch, tuuid) " |
| 940 | "VALUES(:rev, :branch, " |
| 941 | " (SELECT uuid FROM blob WHERE rid=:rid))"); |
| 942 | db_static_prepare(&qParent, "SELECT tuuid, max(trev) FROM xrevisions " |
| @@ -947,29 +953,35 @@ | |
| 953 | if( gsvn.parentRev<0 ){ |
| 954 | gsvn.parentRev = |
| 955 | db_int(-1, "SELECT ifnull(max(trev),-1) FROM xrevisions"); |
| 956 | } |
| 957 | gsvn.zParentBranch = gsvn.zBranch; |
| 958 | }else if( gsvn.zParentBranch==0 ){ |
| 959 | gsvn.zParentBranch = mprintf("trunk"); |
| 960 | } |
| 961 | /*db_bind_int(&insRev, ":rev", gsvn.rev); |
| 962 | db_bind_text(&insRev, ":branch", gsvn.zBranch); |
| 963 | db_bind_int(&insRev, ":rid", 0); |
| 964 | db_step(&insRev); |
| 965 | db_reset(&insRev);*/ |
| 966 | }else{ |
| 967 | static int prevRev = -1; |
| 968 | gsvn.parentRev = prevRev; |
| 969 | gsvn.zParentBranch = gsvn.zBranch = ""; |
| 970 | prevRev = gsvn.rev; |
| 971 | } |
| 972 | |
| 973 | if( gsvn.zComment ){ |
| 974 | blob_appendf(&manifest, "C %F\n", gsvn.zComment); |
| 975 | }else{ |
| 976 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| 977 | } |
| 978 | if( gsvn.zDate ){ |
| 979 | blob_appendf(&manifest, "D %s\n", gsvn.zDate); |
| 980 | }else{ |
| 981 | goto skip_revision; |
| 982 | } |
| 983 | nFilter = blob_size(&gsvn.filter)-1; |
| 984 | db_bind_text(&qFiles, ":filter", blob_str(&gsvn.filter)); |
| 985 | while( db_step(&qFiles)==SQLITE_ROW ){ |
| 986 | const char *zFile = db_column_text(&qFiles, 0); |
| 987 | int rid = db_column_int(&qFiles, 1); |
| @@ -977,11 +989,11 @@ | |
| 989 | const char *zUuid; |
| 990 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid); |
| 991 | blob_appendf(&manifest, "F %F %s %s\n", zFile+nFilter, zUuid, zPerm); |
| 992 | fossil_free(zUuid); |
| 993 | } |
| 994 | db_reset(&qFiles); |
| 995 | if( gsvn.parentRev>=0 ){ |
| 996 | const char *zParentUuid; |
| 997 | db_bind_int(&qParent, ":rev", gsvn.parentRev); |
| 998 | db_bind_text(&qParent, ":branch", gsvn.zParentBranch); |
| 999 | db_step(&qParent); |
| @@ -999,19 +1011,22 @@ | |
| 1011 | zParentBranch = mprintf("%F", gsvn.zParentBranch); |
| 1012 | }else{ |
| 1013 | zParentBranch = 0; |
| 1014 | } |
| 1015 | } |
| 1016 | db_reset(&qParent); |
| 1017 | db_reset(&qParent2); |
| 1018 | }else{ |
| 1019 | blob_appendf(&manifest, "T *branch * trunk\n"); |
| 1020 | blob_appendf(&manifest, "T *sym-trunk *\n"); |
| 1021 | } |
| 1022 | db_bind_int(&qTags, ":rev", gsvn.rev); |
| 1023 | while( db_step(&qTags)==SQLITE_ROW ){ |
| 1024 | const char *zTag = db_column_text(&qTags, 0); |
| 1025 | blob_appendf(&manifest, "T +sym-%s *\n", zTag); |
| 1026 | } |
| 1027 | db_reset(&qTags); |
| 1028 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", gsvn.rev); |
| 1029 | if( zParentBranch ) { |
| 1030 | blob_appendf(&manifest, "T -sym-%s *\n", zParentBranch); |
| 1031 | fossil_free(zParentBranch); |
| 1032 | } |
| @@ -1028,10 +1043,14 @@ | |
| 1043 | rid = content_put(&manifest); |
| 1044 | db_bind_int(&insRev, ":rev", gsvn.rev); |
| 1045 | db_bind_text(&insRev, ":branch", gsvn.zBranch); |
| 1046 | db_bind_int(&insRev, ":rid", rid); |
| 1047 | db_step(&insRev); |
| 1048 | db_reset(&insRev); |
| 1049 | |
| 1050 | skip_revision: |
| 1051 | blob_resize(&gsvn.filter, nBaseFilter); |
| 1052 | if( gsvn.zParentBranch == gsvn.zBranch ){ |
| 1053 | gsvn.zParentBranch = 0; |
| 1054 | } |
| 1055 | if( gsvn.flatFlag ){ |
| 1056 | gsvn.zBranch = 0; |
| @@ -1179,11 +1198,14 @@ | |
| 1198 | } |
| 1199 | /* start new revision */ |
| 1200 | gsvn.rev = atoi(zTemp); |
| 1201 | gsvn.zUser = mprintf("%s", svn_find_prop(rec, "svn:author")); |
| 1202 | gsvn.zComment = mprintf("%s", svn_find_prop(rec, "svn:log")); |
| 1203 | gsvn.zDate = svn_find_prop(rec, "svn:date"); |
| 1204 | if( gsvn.zDate ){ |
| 1205 | gsvn.zDate = date_in_standard_format(gsvn.zDate); |
| 1206 | } |
| 1207 | gsvn.parentRev = -1; |
| 1208 | gsvn.zParentBranch = 0; |
| 1209 | gsvn.zBranch = 0; |
| 1210 | bHasFiles = 0; |
| 1211 | fossil_print("\rImporting SVN revision: %d", gsvn.rev); |
| @@ -1211,11 +1233,13 @@ | |
| 1233 | } |
| 1234 | } |
| 1235 | if( !gsvn.flatFlag ){ |
| 1236 | if( (zTemp=svn_extract_branch(zPath))!=0 ){ |
| 1237 | if( gsvn.zBranch!=0 ){ |
| 1238 | if( strcmp(zTemp, gsvn.zBranch)!=0 |
| 1239 | && strncmp(zAction, "delete", 6)!=0) |
| 1240 | { |
| 1241 | fossil_fatal("Commit to multiple branches"); |
| 1242 | } |
| 1243 | fossil_free(zTemp); |
| 1244 | }else{ |
| 1245 | gsvn.zBranch = zTemp; |
| 1246 |