Fossil SCM
add support for tags
Commit
2889cdc36df4a4a29b7174d7980ad3bb434f3ae7
Parent
279f4cf95facb6f…
1 file changed
+50
-22
+50
-22
| --- src/import.c | ||
| +++ src/import.c | ||
| @@ -882,34 +882,34 @@ | ||
| 882 | 882 | static void svn_create_manifests(int flatFlag){ |
| 883 | 883 | Blob manifest; |
| 884 | 884 | Stmt qRev; |
| 885 | 885 | Stmt qParent; |
| 886 | 886 | Stmt qFiles; |
| 887 | + Stmt qTags; | |
| 887 | 888 | Stmt setUuid; |
| 888 | 889 | |
| 889 | 890 | if( !flatFlag ){ |
| 890 | 891 | db_multi_exec("DELETE FROM xrevisions WHERE tbranch ISNULL;" |
| 891 | - "" | |
| 892 | - " WITH xprefix AS ( " | |
| 892 | + "UPDATE xrevisions SET tparent=(" | |
| 893 | + " SELECT ifnull(max(trev),-1) FROM xrevisions t" | |
| 894 | + " WHERE t.trev<xrevisions.trev" | |
| 895 | + " AND t.tbranch=xrevisions.tbranch" | |
| 896 | + " )" | |
| 897 | + " WHERE tparent ISNULL;" | |
| 898 | + "WITH xprefix AS ( " | |
| 893 | 899 | " SELECT trev, CASE tbranch WHEN 'trunk' THEN 'trunk/'" |
| 894 | 900 | " ELSE 'branches/'||tbranch||'/' END xpref" |
| 895 | 901 | " FROM xrevisions" |
| 896 | 902 | " ), " |
| 897 | 903 | " x AS (SELECT trev xrev, xpref, length(xpref) xlen " |
| 898 | 904 | " FROM xprefix) " |
| 899 | - "UPDATE xfiles SET tpath= " | |
| 905 | + " UPDATE xfiles SET tpath= " | |
| 900 | 906 | " CASE substr(tpath,1,(SELECT xlen FROM x WHERE xrev=trev))" |
| 901 | 907 | " WHEN (SELECT xpref FROM x WHERE xrev=trev)" |
| 902 | 908 | " THEN substr(tpath,(SELECT xlen FROM x WHERE xrev=trev)+1)" |
| 903 | 909 | " END;" |
| 904 | - "DELETE FROM xfiles WHERE tpath ISNULL;" | |
| 905 | - "UPDATE xrevisions SET tparent=(" | |
| 906 | - " SELECT ifnull(max(trev),-1) FROM xrevisions t" | |
| 907 | - " WHERE t.trev<xrevisions.trev" | |
| 908 | - " AND t.tbranch=xrevisions.tbranch" | |
| 909 | - " )" | |
| 910 | - " WHERE tparent ISNULL"); | |
| 910 | + "DELETE FROM xfiles WHERE tpath ISNULL"); | |
| 911 | 911 | }else{ |
| 912 | 912 | db_multi_exec("UPDATE xrevisions SET tparent=trev-1"); |
| 913 | 913 | } |
| 914 | 914 | db_prepare(&qRev, "SELECT trev, tuser, tmsg, ttime, tparent, tbranch" |
| 915 | 915 | " FROM xrevisions " |
| @@ -916,10 +916,11 @@ | ||
| 916 | 916 | " ORDER BY trev"); |
| 917 | 917 | db_prepare(&qParent, "SELECT tuuid, tbranch FROM xrevisions WHERE trev=:rev"); |
| 918 | 918 | db_prepare(&qFiles, "SELECT tpath, uuid, tperm" |
| 919 | 919 | " FROM xfiles JOIN blob ON xfiles.trid=blob.rid" |
| 920 | 920 | " WHERE trev=:rev ORDER BY tpath"); |
| 921 | + db_prepare(&qTags, "SELECT ttag FROM xtags WHERE trev=:rev"); | |
| 921 | 922 | db_prepare(&setUuid, "UPDATE xrevisions" |
| 922 | 923 | " SET tuuid=(SELECT uuid FROM blob WHERE rid=:rid)" |
| 923 | 924 | " WHERE trev=:rev"); |
| 924 | 925 | blob_zero(&manifest); |
| 925 | 926 | while( db_step(&qRev)==SQLITE_ROW ){ |
| @@ -928,13 +929,12 @@ | ||
| 928 | 929 | const char *zMsg = db_column_text(&qRev, 2); |
| 929 | 930 | const char *zTime = db_column_text(&qRev, 3); |
| 930 | 931 | int parentRev = db_column_int(&qRev, 4); |
| 931 | 932 | const char *zBranch = db_column_text(&qRev, 5); |
| 932 | 933 | int rid; |
| 933 | - Blob mcksum; | |
| 934 | - const char *zParentUuid = 0; | |
| 935 | 934 | const char *zParentBranch = 0; |
| 935 | + Blob mcksum; | |
| 936 | 936 | blob_reset(&manifest); |
| 937 | 937 | if( zMsg ){ |
| 938 | 938 | blob_appendf(&manifest, "C %F\n", zMsg); |
| 939 | 939 | }else{ |
| 940 | 940 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| @@ -947,27 +947,40 @@ | ||
| 947 | 947 | const char *zPerm = db_column_text(&qFiles, 2); |
| 948 | 948 | blob_appendf(&manifest, "F %F %s %s\n", zFile, zUuid, zPerm); |
| 949 | 949 | } |
| 950 | 950 | db_reset(&qFiles); |
| 951 | 951 | if( parentRev>=0 ){ |
| 952 | + const char *zParentUuid; | |
| 952 | 953 | db_bind_int(&qParent, ":rev", parentRev); |
| 953 | 954 | db_step(&qParent); |
| 954 | 955 | zParentUuid = db_column_text(&qParent, 0); |
| 955 | 956 | blob_appendf(&manifest, "P %s\n", zParentUuid); |
| 956 | 957 | if( !flatFlag ){ |
| 957 | 958 | zParentBranch = db_column_text(&qParent, 1); |
| 958 | 959 | if( strcmp(zBranch, zParentBranch)!=0 ){ |
| 959 | 960 | blob_appendf(&manifest, "T *branch * %s\n", zBranch); |
| 960 | 961 | blob_appendf(&manifest, "T *sym-%s *\n", zBranch); |
| 962 | + zParentBranch = mprintf("%s", zParentBranch); | |
| 963 | + }else{ | |
| 964 | + zParentBranch = 0; | |
| 961 | 965 | } |
| 962 | 966 | } |
| 963 | 967 | db_reset(&qParent); |
| 964 | 968 | }else{ |
| 965 | 969 | blob_appendf(&manifest, "T *branch * trunk\n"); |
| 966 | 970 | blob_appendf(&manifest, "T *sym-trunk *\n"); |
| 967 | 971 | } |
| 972 | + db_bind_int(&qTags, ":rev", rev); | |
| 973 | + while( db_step(&qTags)==SQLITE_ROW ){ | |
| 974 | + const char *zTag = db_column_text(&qTags, 0); | |
| 975 | + blob_appendf(&manifest, "T +sym-%s *\n", zTag); | |
| 976 | + } | |
| 977 | + db_reset(&qTags); | |
| 968 | 978 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", rev); |
| 979 | + if( zParentBranch ) { | |
| 980 | + blob_appendf(&manifest, "T -sym-%s *\n", zParentBranch); | |
| 981 | + } | |
| 969 | 982 | if( zUser ){ |
| 970 | 983 | blob_appendf(&manifest, "U %F\n", zUser); |
| 971 | 984 | }else{ |
| 972 | 985 | const char *zUserOvrd = find_option("user-override",0,1); |
| 973 | 986 | blob_appendf(&manifest, "U %F\n", |
| @@ -984,10 +997,11 @@ | ||
| 984 | 997 | db_reset(&setUuid); |
| 985 | 998 | } |
| 986 | 999 | db_finalize(&qRev); |
| 987 | 1000 | db_finalize(&qParent); |
| 988 | 1001 | db_finalize(&qFiles); |
| 1002 | + db_finalize(&qTags); | |
| 989 | 1003 | db_finalize(&setUuid); |
| 990 | 1004 | } |
| 991 | 1005 | /* |
| 992 | 1006 | ** Read the svn-dump format from pIn and insert the corresponding |
| 993 | 1007 | ** content into the database. |
| @@ -998,10 +1012,11 @@ | ||
| 998 | 1012 | const char *zTemp; |
| 999 | 1013 | const char *zUuid; |
| 1000 | 1014 | char zBranch[200] = {0}; |
| 1001 | 1015 | Stmt insRev; |
| 1002 | 1016 | Stmt insFile; |
| 1017 | + Stmt insTag; | |
| 1003 | 1018 | Stmt delFile; |
| 1004 | 1019 | Stmt setBranch; |
| 1005 | 1020 | Stmt setParent; |
| 1006 | 1021 | int rev = 0; |
| 1007 | 1022 | |
| @@ -1028,10 +1043,11 @@ | ||
| 1028 | 1043 | ); |
| 1029 | 1044 | db_prepare(&insFile, |
| 1030 | 1045 | "INSERT INTO xfiles (trev, tpath, trid, tperm) " |
| 1031 | 1046 | "VALUES(:rev, :path, :rid, :perm)" |
| 1032 | 1047 | ); |
| 1048 | + db_prepare(&insTag, "INSERT INTO xtags (trev, ttag) VALUES(:rev, :tag)"); | |
| 1033 | 1049 | db_prepare(&delFile, |
| 1034 | 1050 | "DELETE FROM xfiles " |
| 1035 | 1051 | "WHERE trev=:rev " |
| 1036 | 1052 | " AND (tpath=:path OR (tpath>:path||'/' AND tpath<:path||'0'))" |
| 1037 | 1053 | ); |
| @@ -1120,18 +1136,26 @@ | ||
| 1120 | 1136 | " SELECT %d, %Q||substr(tpath, length(%Q)+1), trid, tperm " |
| 1121 | 1137 | " FROM xfiles " |
| 1122 | 1138 | " WHERE trev=%d AND tpath GLOB '%q/*'", |
| 1123 | 1139 | rev, zPath, zSrcPath, srcRev, zSrcPath |
| 1124 | 1140 | ); |
| 1125 | - if( !flatFlag && strncmp(zPath, "branches/", 9)==0 ){ | |
| 1126 | - zTemp = zPath+9; | |
| 1127 | - while( *zTemp && *zTemp!='/' ){ zTemp++; } | |
| 1128 | - if( *zTemp==0 ){ | |
| 1129 | - db_bind_int(&setParent, ":parent", srcRev); | |
| 1130 | - db_bind_int(&setParent, ":rev", rev); | |
| 1131 | - db_step(&setParent); | |
| 1132 | - db_reset(&setParent); | |
| 1141 | + if( !flatFlag ){ | |
| 1142 | + if( strncmp(zPath, "branches/", 9)==0 ){ | |
| 1143 | + zTemp = zPath+9; | |
| 1144 | + while( *zTemp && *zTemp!='/' ){ zTemp++; } | |
| 1145 | + if( *zTemp==0 ){ | |
| 1146 | + db_bind_int(&setParent, ":parent", srcRev); | |
| 1147 | + db_bind_int(&setParent, ":rev", rev); | |
| 1148 | + db_step(&setParent); | |
| 1149 | + db_reset(&setParent); | |
| 1150 | + } | |
| 1151 | + }else if( strncmp(zPath, "tags/", 5)==0 ){ | |
| 1152 | + zTemp = zPath+5; | |
| 1153 | + db_bind_int(&insTag, ":rev", srcRev); | |
| 1154 | + db_bind_text(&insTag, ":tag", zTemp); | |
| 1155 | + db_step(&insTag); | |
| 1156 | + db_reset(&insTag); | |
| 1133 | 1157 | } |
| 1134 | 1158 | } |
| 1135 | 1159 | } |
| 1136 | 1160 | }else{ |
| 1137 | 1161 | if( blob_size(&rec.content)==0 && zSrcPath ){ |
| @@ -1174,10 +1198,11 @@ | ||
| 1174 | 1198 | db_step(&setBranch); |
| 1175 | 1199 | } |
| 1176 | 1200 | } |
| 1177 | 1201 | db_finalize(&insRev); |
| 1178 | 1202 | db_finalize(&insFile); |
| 1203 | + db_finalize(&insTag); | |
| 1179 | 1204 | db_finalize(&delFile); |
| 1180 | 1205 | db_finalize(&setBranch); |
| 1181 | 1206 | db_finalize(&setParent); |
| 1182 | 1207 | svn_create_manifests(flatFlag); |
| 1183 | 1208 | } |
| @@ -1274,16 +1299,19 @@ | ||
| 1274 | 1299 | db_finalize(&q); |
| 1275 | 1300 | }else |
| 1276 | 1301 | if( strncmp(g.argv[2], "svn", 3)==0 ){ |
| 1277 | 1302 | db_multi_exec( |
| 1278 | 1303 | "CREATE TEMP TABLE xrevisions(" |
| 1279 | - " trev INT, tuser TEXT, tmsg TEXT, ttime DATETIME, tparent INT," | |
| 1280 | - " tbranch TEXT, tuuid TEXT" | |
| 1304 | + " trev INTEGER PRIMARY KEY, tuser TEXT, tmsg TEXT, ttime DATETIME," | |
| 1305 | + " tparent INT, tbranch TEXT, tuuid TEXT" | |
| 1281 | 1306 | ");" |
| 1282 | 1307 | "CREATE TEMP TABLE xfiles(" |
| 1283 | 1308 | " trev INT, tpath TEXT, trid TEXT, tperm TEXT," |
| 1284 | 1309 | " UNIQUE (trev, tpath) ON CONFLICT REPLACE" |
| 1310 | + ");" | |
| 1311 | + "CREATE TEMP TABLE xtags(" | |
| 1312 | + " trev INT, ttag TEXT" | |
| 1285 | 1313 | ");" |
| 1286 | 1314 | ); |
| 1287 | 1315 | svn_dump_import(pIn, flatFlag); |
| 1288 | 1316 | } |
| 1289 | 1317 | |
| 1290 | 1318 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -882,34 +882,34 @@ | |
| 882 | static void svn_create_manifests(int flatFlag){ |
| 883 | Blob manifest; |
| 884 | Stmt qRev; |
| 885 | Stmt qParent; |
| 886 | Stmt qFiles; |
| 887 | Stmt setUuid; |
| 888 | |
| 889 | if( !flatFlag ){ |
| 890 | db_multi_exec("DELETE FROM xrevisions WHERE tbranch ISNULL;" |
| 891 | "" |
| 892 | " WITH xprefix AS ( " |
| 893 | " SELECT trev, CASE tbranch WHEN 'trunk' THEN 'trunk/'" |
| 894 | " ELSE 'branches/'||tbranch||'/' END xpref" |
| 895 | " FROM xrevisions" |
| 896 | " ), " |
| 897 | " x AS (SELECT trev xrev, xpref, length(xpref) xlen " |
| 898 | " FROM xprefix) " |
| 899 | "UPDATE xfiles SET tpath= " |
| 900 | " CASE substr(tpath,1,(SELECT xlen FROM x WHERE xrev=trev))" |
| 901 | " WHEN (SELECT xpref FROM x WHERE xrev=trev)" |
| 902 | " THEN substr(tpath,(SELECT xlen FROM x WHERE xrev=trev)+1)" |
| 903 | " END;" |
| 904 | "DELETE FROM xfiles WHERE tpath ISNULL;" |
| 905 | "UPDATE xrevisions SET tparent=(" |
| 906 | " SELECT ifnull(max(trev),-1) FROM xrevisions t" |
| 907 | " WHERE t.trev<xrevisions.trev" |
| 908 | " AND t.tbranch=xrevisions.tbranch" |
| 909 | " )" |
| 910 | " WHERE tparent ISNULL"); |
| 911 | }else{ |
| 912 | db_multi_exec("UPDATE xrevisions SET tparent=trev-1"); |
| 913 | } |
| 914 | db_prepare(&qRev, "SELECT trev, tuser, tmsg, ttime, tparent, tbranch" |
| 915 | " FROM xrevisions " |
| @@ -916,10 +916,11 @@ | |
| 916 | " ORDER BY trev"); |
| 917 | db_prepare(&qParent, "SELECT tuuid, tbranch FROM xrevisions WHERE trev=:rev"); |
| 918 | db_prepare(&qFiles, "SELECT tpath, uuid, tperm" |
| 919 | " FROM xfiles JOIN blob ON xfiles.trid=blob.rid" |
| 920 | " WHERE trev=:rev ORDER BY tpath"); |
| 921 | db_prepare(&setUuid, "UPDATE xrevisions" |
| 922 | " SET tuuid=(SELECT uuid FROM blob WHERE rid=:rid)" |
| 923 | " WHERE trev=:rev"); |
| 924 | blob_zero(&manifest); |
| 925 | while( db_step(&qRev)==SQLITE_ROW ){ |
| @@ -928,13 +929,12 @@ | |
| 928 | const char *zMsg = db_column_text(&qRev, 2); |
| 929 | const char *zTime = db_column_text(&qRev, 3); |
| 930 | int parentRev = db_column_int(&qRev, 4); |
| 931 | const char *zBranch = db_column_text(&qRev, 5); |
| 932 | int rid; |
| 933 | Blob mcksum; |
| 934 | const char *zParentUuid = 0; |
| 935 | const char *zParentBranch = 0; |
| 936 | blob_reset(&manifest); |
| 937 | if( zMsg ){ |
| 938 | blob_appendf(&manifest, "C %F\n", zMsg); |
| 939 | }else{ |
| 940 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| @@ -947,27 +947,40 @@ | |
| 947 | const char *zPerm = db_column_text(&qFiles, 2); |
| 948 | blob_appendf(&manifest, "F %F %s %s\n", zFile, zUuid, zPerm); |
| 949 | } |
| 950 | db_reset(&qFiles); |
| 951 | if( parentRev>=0 ){ |
| 952 | db_bind_int(&qParent, ":rev", parentRev); |
| 953 | db_step(&qParent); |
| 954 | zParentUuid = db_column_text(&qParent, 0); |
| 955 | blob_appendf(&manifest, "P %s\n", zParentUuid); |
| 956 | if( !flatFlag ){ |
| 957 | zParentBranch = db_column_text(&qParent, 1); |
| 958 | if( strcmp(zBranch, zParentBranch)!=0 ){ |
| 959 | blob_appendf(&manifest, "T *branch * %s\n", zBranch); |
| 960 | blob_appendf(&manifest, "T *sym-%s *\n", zBranch); |
| 961 | } |
| 962 | } |
| 963 | db_reset(&qParent); |
| 964 | }else{ |
| 965 | blob_appendf(&manifest, "T *branch * trunk\n"); |
| 966 | blob_appendf(&manifest, "T *sym-trunk *\n"); |
| 967 | } |
| 968 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", rev); |
| 969 | if( zUser ){ |
| 970 | blob_appendf(&manifest, "U %F\n", zUser); |
| 971 | }else{ |
| 972 | const char *zUserOvrd = find_option("user-override",0,1); |
| 973 | blob_appendf(&manifest, "U %F\n", |
| @@ -984,10 +997,11 @@ | |
| 984 | db_reset(&setUuid); |
| 985 | } |
| 986 | db_finalize(&qRev); |
| 987 | db_finalize(&qParent); |
| 988 | db_finalize(&qFiles); |
| 989 | db_finalize(&setUuid); |
| 990 | } |
| 991 | /* |
| 992 | ** Read the svn-dump format from pIn and insert the corresponding |
| 993 | ** content into the database. |
| @@ -998,10 +1012,11 @@ | |
| 998 | const char *zTemp; |
| 999 | const char *zUuid; |
| 1000 | char zBranch[200] = {0}; |
| 1001 | Stmt insRev; |
| 1002 | Stmt insFile; |
| 1003 | Stmt delFile; |
| 1004 | Stmt setBranch; |
| 1005 | Stmt setParent; |
| 1006 | int rev = 0; |
| 1007 | |
| @@ -1028,10 +1043,11 @@ | |
| 1028 | ); |
| 1029 | db_prepare(&insFile, |
| 1030 | "INSERT INTO xfiles (trev, tpath, trid, tperm) " |
| 1031 | "VALUES(:rev, :path, :rid, :perm)" |
| 1032 | ); |
| 1033 | db_prepare(&delFile, |
| 1034 | "DELETE FROM xfiles " |
| 1035 | "WHERE trev=:rev " |
| 1036 | " AND (tpath=:path OR (tpath>:path||'/' AND tpath<:path||'0'))" |
| 1037 | ); |
| @@ -1120,18 +1136,26 @@ | |
| 1120 | " SELECT %d, %Q||substr(tpath, length(%Q)+1), trid, tperm " |
| 1121 | " FROM xfiles " |
| 1122 | " WHERE trev=%d AND tpath GLOB '%q/*'", |
| 1123 | rev, zPath, zSrcPath, srcRev, zSrcPath |
| 1124 | ); |
| 1125 | if( !flatFlag && strncmp(zPath, "branches/", 9)==0 ){ |
| 1126 | zTemp = zPath+9; |
| 1127 | while( *zTemp && *zTemp!='/' ){ zTemp++; } |
| 1128 | if( *zTemp==0 ){ |
| 1129 | db_bind_int(&setParent, ":parent", srcRev); |
| 1130 | db_bind_int(&setParent, ":rev", rev); |
| 1131 | db_step(&setParent); |
| 1132 | db_reset(&setParent); |
| 1133 | } |
| 1134 | } |
| 1135 | } |
| 1136 | }else{ |
| 1137 | if( blob_size(&rec.content)==0 && zSrcPath ){ |
| @@ -1174,10 +1198,11 @@ | |
| 1174 | db_step(&setBranch); |
| 1175 | } |
| 1176 | } |
| 1177 | db_finalize(&insRev); |
| 1178 | db_finalize(&insFile); |
| 1179 | db_finalize(&delFile); |
| 1180 | db_finalize(&setBranch); |
| 1181 | db_finalize(&setParent); |
| 1182 | svn_create_manifests(flatFlag); |
| 1183 | } |
| @@ -1274,16 +1299,19 @@ | |
| 1274 | db_finalize(&q); |
| 1275 | }else |
| 1276 | if( strncmp(g.argv[2], "svn", 3)==0 ){ |
| 1277 | db_multi_exec( |
| 1278 | "CREATE TEMP TABLE xrevisions(" |
| 1279 | " trev INT, tuser TEXT, tmsg TEXT, ttime DATETIME, tparent INT," |
| 1280 | " tbranch TEXT, tuuid TEXT" |
| 1281 | ");" |
| 1282 | "CREATE TEMP TABLE xfiles(" |
| 1283 | " trev INT, tpath TEXT, trid TEXT, tperm TEXT," |
| 1284 | " UNIQUE (trev, tpath) ON CONFLICT REPLACE" |
| 1285 | ");" |
| 1286 | ); |
| 1287 | svn_dump_import(pIn, flatFlag); |
| 1288 | } |
| 1289 | |
| 1290 |
| --- src/import.c | |
| +++ src/import.c | |
| @@ -882,34 +882,34 @@ | |
| 882 | static void svn_create_manifests(int flatFlag){ |
| 883 | Blob manifest; |
| 884 | Stmt qRev; |
| 885 | Stmt qParent; |
| 886 | Stmt qFiles; |
| 887 | Stmt qTags; |
| 888 | Stmt setUuid; |
| 889 | |
| 890 | if( !flatFlag ){ |
| 891 | db_multi_exec("DELETE FROM xrevisions WHERE tbranch ISNULL;" |
| 892 | "UPDATE xrevisions SET tparent=(" |
| 893 | " SELECT ifnull(max(trev),-1) FROM xrevisions t" |
| 894 | " WHERE t.trev<xrevisions.trev" |
| 895 | " AND t.tbranch=xrevisions.tbranch" |
| 896 | " )" |
| 897 | " WHERE tparent ISNULL;" |
| 898 | "WITH xprefix AS ( " |
| 899 | " SELECT trev, CASE tbranch WHEN 'trunk' THEN 'trunk/'" |
| 900 | " ELSE 'branches/'||tbranch||'/' END xpref" |
| 901 | " FROM xrevisions" |
| 902 | " ), " |
| 903 | " x AS (SELECT trev xrev, xpref, length(xpref) xlen " |
| 904 | " FROM xprefix) " |
| 905 | " UPDATE xfiles SET tpath= " |
| 906 | " CASE substr(tpath,1,(SELECT xlen FROM x WHERE xrev=trev))" |
| 907 | " WHEN (SELECT xpref FROM x WHERE xrev=trev)" |
| 908 | " THEN substr(tpath,(SELECT xlen FROM x WHERE xrev=trev)+1)" |
| 909 | " END;" |
| 910 | "DELETE FROM xfiles WHERE tpath ISNULL"); |
| 911 | }else{ |
| 912 | db_multi_exec("UPDATE xrevisions SET tparent=trev-1"); |
| 913 | } |
| 914 | db_prepare(&qRev, "SELECT trev, tuser, tmsg, ttime, tparent, tbranch" |
| 915 | " FROM xrevisions " |
| @@ -916,10 +916,11 @@ | |
| 916 | " ORDER BY trev"); |
| 917 | db_prepare(&qParent, "SELECT tuuid, tbranch FROM xrevisions WHERE trev=:rev"); |
| 918 | db_prepare(&qFiles, "SELECT tpath, uuid, tperm" |
| 919 | " FROM xfiles JOIN blob ON xfiles.trid=blob.rid" |
| 920 | " WHERE trev=:rev ORDER BY tpath"); |
| 921 | db_prepare(&qTags, "SELECT ttag FROM xtags WHERE trev=:rev"); |
| 922 | db_prepare(&setUuid, "UPDATE xrevisions" |
| 923 | " SET tuuid=(SELECT uuid FROM blob WHERE rid=:rid)" |
| 924 | " WHERE trev=:rev"); |
| 925 | blob_zero(&manifest); |
| 926 | while( db_step(&qRev)==SQLITE_ROW ){ |
| @@ -928,13 +929,12 @@ | |
| 929 | const char *zMsg = db_column_text(&qRev, 2); |
| 930 | const char *zTime = db_column_text(&qRev, 3); |
| 931 | int parentRev = db_column_int(&qRev, 4); |
| 932 | const char *zBranch = db_column_text(&qRev, 5); |
| 933 | int rid; |
| 934 | const char *zParentBranch = 0; |
| 935 | Blob mcksum; |
| 936 | blob_reset(&manifest); |
| 937 | if( zMsg ){ |
| 938 | blob_appendf(&manifest, "C %F\n", zMsg); |
| 939 | }else{ |
| 940 | blob_append(&manifest, "C (no\\scomment)\n", 16); |
| @@ -947,27 +947,40 @@ | |
| 947 | const char *zPerm = db_column_text(&qFiles, 2); |
| 948 | blob_appendf(&manifest, "F %F %s %s\n", zFile, zUuid, zPerm); |
| 949 | } |
| 950 | db_reset(&qFiles); |
| 951 | if( parentRev>=0 ){ |
| 952 | const char *zParentUuid; |
| 953 | db_bind_int(&qParent, ":rev", parentRev); |
| 954 | db_step(&qParent); |
| 955 | zParentUuid = db_column_text(&qParent, 0); |
| 956 | blob_appendf(&manifest, "P %s\n", zParentUuid); |
| 957 | if( !flatFlag ){ |
| 958 | zParentBranch = db_column_text(&qParent, 1); |
| 959 | if( strcmp(zBranch, zParentBranch)!=0 ){ |
| 960 | blob_appendf(&manifest, "T *branch * %s\n", zBranch); |
| 961 | blob_appendf(&manifest, "T *sym-%s *\n", zBranch); |
| 962 | zParentBranch = mprintf("%s", zParentBranch); |
| 963 | }else{ |
| 964 | zParentBranch = 0; |
| 965 | } |
| 966 | } |
| 967 | db_reset(&qParent); |
| 968 | }else{ |
| 969 | blob_appendf(&manifest, "T *branch * trunk\n"); |
| 970 | blob_appendf(&manifest, "T *sym-trunk *\n"); |
| 971 | } |
| 972 | db_bind_int(&qTags, ":rev", rev); |
| 973 | while( db_step(&qTags)==SQLITE_ROW ){ |
| 974 | const char *zTag = db_column_text(&qTags, 0); |
| 975 | blob_appendf(&manifest, "T +sym-%s *\n", zTag); |
| 976 | } |
| 977 | db_reset(&qTags); |
| 978 | blob_appendf(&manifest, "T +sym-svn-rev-%d *\n", rev); |
| 979 | if( zParentBranch ) { |
| 980 | blob_appendf(&manifest, "T -sym-%s *\n", zParentBranch); |
| 981 | } |
| 982 | if( zUser ){ |
| 983 | blob_appendf(&manifest, "U %F\n", zUser); |
| 984 | }else{ |
| 985 | const char *zUserOvrd = find_option("user-override",0,1); |
| 986 | blob_appendf(&manifest, "U %F\n", |
| @@ -984,10 +997,11 @@ | |
| 997 | db_reset(&setUuid); |
| 998 | } |
| 999 | db_finalize(&qRev); |
| 1000 | db_finalize(&qParent); |
| 1001 | db_finalize(&qFiles); |
| 1002 | db_finalize(&qTags); |
| 1003 | db_finalize(&setUuid); |
| 1004 | } |
| 1005 | /* |
| 1006 | ** Read the svn-dump format from pIn and insert the corresponding |
| 1007 | ** content into the database. |
| @@ -998,10 +1012,11 @@ | |
| 1012 | const char *zTemp; |
| 1013 | const char *zUuid; |
| 1014 | char zBranch[200] = {0}; |
| 1015 | Stmt insRev; |
| 1016 | Stmt insFile; |
| 1017 | Stmt insTag; |
| 1018 | Stmt delFile; |
| 1019 | Stmt setBranch; |
| 1020 | Stmt setParent; |
| 1021 | int rev = 0; |
| 1022 | |
| @@ -1028,10 +1043,11 @@ | |
| 1043 | ); |
| 1044 | db_prepare(&insFile, |
| 1045 | "INSERT INTO xfiles (trev, tpath, trid, tperm) " |
| 1046 | "VALUES(:rev, :path, :rid, :perm)" |
| 1047 | ); |
| 1048 | db_prepare(&insTag, "INSERT INTO xtags (trev, ttag) VALUES(:rev, :tag)"); |
| 1049 | db_prepare(&delFile, |
| 1050 | "DELETE FROM xfiles " |
| 1051 | "WHERE trev=:rev " |
| 1052 | " AND (tpath=:path OR (tpath>:path||'/' AND tpath<:path||'0'))" |
| 1053 | ); |
| @@ -1120,18 +1136,26 @@ | |
| 1136 | " SELECT %d, %Q||substr(tpath, length(%Q)+1), trid, tperm " |
| 1137 | " FROM xfiles " |
| 1138 | " WHERE trev=%d AND tpath GLOB '%q/*'", |
| 1139 | rev, zPath, zSrcPath, srcRev, zSrcPath |
| 1140 | ); |
| 1141 | if( !flatFlag ){ |
| 1142 | if( strncmp(zPath, "branches/", 9)==0 ){ |
| 1143 | zTemp = zPath+9; |
| 1144 | while( *zTemp && *zTemp!='/' ){ zTemp++; } |
| 1145 | if( *zTemp==0 ){ |
| 1146 | db_bind_int(&setParent, ":parent", srcRev); |
| 1147 | db_bind_int(&setParent, ":rev", rev); |
| 1148 | db_step(&setParent); |
| 1149 | db_reset(&setParent); |
| 1150 | } |
| 1151 | }else if( strncmp(zPath, "tags/", 5)==0 ){ |
| 1152 | zTemp = zPath+5; |
| 1153 | db_bind_int(&insTag, ":rev", srcRev); |
| 1154 | db_bind_text(&insTag, ":tag", zTemp); |
| 1155 | db_step(&insTag); |
| 1156 | db_reset(&insTag); |
| 1157 | } |
| 1158 | } |
| 1159 | } |
| 1160 | }else{ |
| 1161 | if( blob_size(&rec.content)==0 && zSrcPath ){ |
| @@ -1174,10 +1198,11 @@ | |
| 1198 | db_step(&setBranch); |
| 1199 | } |
| 1200 | } |
| 1201 | db_finalize(&insRev); |
| 1202 | db_finalize(&insFile); |
| 1203 | db_finalize(&insTag); |
| 1204 | db_finalize(&delFile); |
| 1205 | db_finalize(&setBranch); |
| 1206 | db_finalize(&setParent); |
| 1207 | svn_create_manifests(flatFlag); |
| 1208 | } |
| @@ -1274,16 +1299,19 @@ | |
| 1299 | db_finalize(&q); |
| 1300 | }else |
| 1301 | if( strncmp(g.argv[2], "svn", 3)==0 ){ |
| 1302 | db_multi_exec( |
| 1303 | "CREATE TEMP TABLE xrevisions(" |
| 1304 | " trev INTEGER PRIMARY KEY, tuser TEXT, tmsg TEXT, ttime DATETIME," |
| 1305 | " tparent INT, tbranch TEXT, tuuid TEXT" |
| 1306 | ");" |
| 1307 | "CREATE TEMP TABLE xfiles(" |
| 1308 | " trev INT, tpath TEXT, trid TEXT, tperm TEXT," |
| 1309 | " UNIQUE (trev, tpath) ON CONFLICT REPLACE" |
| 1310 | ");" |
| 1311 | "CREATE TEMP TABLE xtags(" |
| 1312 | " trev INT, ttag TEXT" |
| 1313 | ");" |
| 1314 | ); |
| 1315 | svn_dump_import(pIn, flatFlag); |
| 1316 | } |
| 1317 | |
| 1318 |