Mercurial > hg
comparison tests/test-help.t @ 31213:9f169b7f53d5
help: fix internals.changegroups
Add information about tree manifests, copy edit the text and fix up a few
ambiguities.
The document also contains a few additional fixes from Siddharth Agarwal
<sid0@fb.com>, who used it to build a parser for changegroups in Rust.
author | Kyle Lippincott <spectral@google.com> |
---|---|
date | Wed, 01 Mar 2017 18:37:34 -0800 |
parents | 71f692f1f678 |
children | 16539e32ebe0 |
comparison
equal
deleted
inserted
replaced
31212:344121b30f32 | 31213:9f169b7f53d5 |
---|---|
950 $ hg help internals.changegroups | 950 $ hg help internals.changegroups |
951 Changegroups | 951 Changegroups |
952 """""""""""" | 952 """""""""""" |
953 | 953 |
954 Changegroups are representations of repository revlog data, specifically | 954 Changegroups are representations of repository revlog data, specifically |
955 the changelog, manifest, and filelogs. | 955 the changelog data, root/flat manifest data, treemanifest data, and |
956 filelogs. | |
956 | 957 |
957 There are 3 versions of changegroups: "1", "2", and "3". From a high- | 958 There are 3 versions of changegroups: "1", "2", and "3". From a high- |
958 level, versions "1" and "2" are almost exactly the same, with the only | 959 level, versions "1" and "2" are almost exactly the same, with the only |
959 difference being a header on entries in the changeset segment. Version "3" | 960 difference being an additional item in the *delta header*. Version "3" |
960 adds support for exchanging treemanifests and includes revlog flags in the | 961 adds support for revlog flags in the *delta header* and optionally |
961 delta header. | 962 exchanging treemanifests (enabled by setting an option on the |
962 | 963 "changegroup" part in the bundle2). |
963 Changegroups consists of 3 logical segments: | 964 |
965 Changegroups when not exchanging treemanifests consist of 3 logical | |
966 segments: | |
964 | 967 |
965 +---------------------------------+ | 968 +---------------------------------+ |
966 | | | | | 969 | | | | |
967 | changeset | manifest | filelogs | | 970 | changeset | manifest | filelogs | |
968 | | | | | 971 | | | | |
972 | | | | | |
969 +---------------------------------+ | 973 +---------------------------------+ |
974 | |
975 When exchanging treemanifests, there are 4 logical segments: | |
976 | |
977 +-------------------------------------------------+ | |
978 | | | | | | |
979 | changeset | root | treemanifests | filelogs | | |
980 | | manifest | | | | |
981 | | | | | | |
982 +-------------------------------------------------+ | |
970 | 983 |
971 The principle building block of each segment is a *chunk*. A *chunk* is a | 984 The principle building block of each segment is a *chunk*. A *chunk* is a |
972 framed piece of data: | 985 framed piece of data: |
973 | 986 |
974 +---------------------------------------+ | 987 +---------------------------------------+ |
975 | | | | 988 | | | |
976 | length | data | | 989 | length | data | |
977 | (32 bits) | <length> bytes | | 990 | (4 bytes) | (<length - 4> bytes) | |
978 | | | | 991 | | | |
979 +---------------------------------------+ | 992 +---------------------------------------+ |
980 | 993 |
981 Each chunk starts with a 32-bit big-endian signed integer indicating the | 994 All integers are big-endian signed integers. Each chunk starts with a |
982 length of the raw data that follows. | 995 32-bit integer indicating the length of the entire chunk (including the |
983 | 996 length field itself). |
984 There is a special case chunk that has 0 length ("0x00000000"). We call | 997 |
985 this an *empty chunk*. | 998 There is a special case chunk that has a value of 0 for the length |
999 ("0x00000000"). We call this an *empty chunk*. | |
986 | 1000 |
987 Delta Groups | 1001 Delta Groups |
988 ============ | 1002 ============ |
989 | 1003 |
990 A *delta group* expresses the content of a revlog as a series of deltas, | 1004 A *delta group* expresses the content of a revlog as a series of deltas, |
994 to signal the end of the delta group: | 1008 to signal the end of the delta group: |
995 | 1009 |
996 +------------------------------------------------------------------------+ | 1010 +------------------------------------------------------------------------+ |
997 | | | | | | | 1011 | | | | | | |
998 | chunk0 length | chunk0 data | chunk1 length | chunk1 data | 0x0 | | 1012 | chunk0 length | chunk0 data | chunk1 length | chunk1 data | 0x0 | |
999 | (32 bits) | (various) | (32 bits) | (various) | (32 bits) | | 1013 | (4 bytes) | (various) | (4 bytes) | (various) | (4 bytes) | |
1000 | | | | | | | 1014 | | | | | | |
1001 +------------------------------------------------------------+-----------+ | 1015 +------------------------------------------------------------------------+ |
1002 | 1016 |
1003 Each *chunk*'s data consists of the following: | 1017 Each *chunk*'s data consists of the following: |
1004 | 1018 |
1005 +-----------------------------------------+ | 1019 +---------------------------------------+ |
1006 | | | | | 1020 | | | |
1007 | delta header | mdiff header | delta | | 1021 | delta header | delta data | |
1008 | (various) | (12 bytes) | (various) | | 1022 | (various by version) | (various) | |
1009 | | | | | 1023 | | | |
1010 +-----------------------------------------+ | 1024 +---------------------------------------+ |
1011 | 1025 |
1012 The *length* field is the byte length of the remaining 3 logical pieces of | 1026 The *delta data* is a series of *delta*s that describe a diff from an |
1013 data. The *delta* is a diff from an existing entry in the changelog. | 1027 existing entry (either that the recipient already has, or previously |
1028 specified in the bundlei/changegroup). | |
1014 | 1029 |
1015 The *delta header* is different between versions "1", "2", and "3" of the | 1030 The *delta header* is different between versions "1", "2", and "3" of the |
1016 changegroup format. | 1031 changegroup format. |
1017 | 1032 |
1018 Version 1: | 1033 Version 1 (headerlen=80): |
1019 | 1034 |
1020 +------------------------------------------------------+ | 1035 +------------------------------------------------------+ |
1021 | | | | | | 1036 | | | | | |
1022 | node | p1 node | p2 node | link node | | 1037 | node | p1 node | p2 node | link node | |
1023 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | | 1038 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | |
1024 | | | | | | 1039 | | | | | |
1025 +------------------------------------------------------+ | 1040 +------------------------------------------------------+ |
1026 | 1041 |
1027 Version 2: | 1042 Version 2 (headerlen=100): |
1028 | 1043 |
1029 +------------------------------------------------------------------+ | 1044 +------------------------------------------------------------------+ |
1030 | | | | | | | 1045 | | | | | | |
1031 | node | p1 node | p2 node | base node | link node | | 1046 | node | p1 node | p2 node | base node | link node | |
1032 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | | 1047 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | |
1033 | | | | | | | 1048 | | | | | | |
1034 +------------------------------------------------------------------+ | 1049 +------------------------------------------------------------------+ |
1035 | 1050 |
1036 Version 3: | 1051 Version 3 (headerlen=102): |
1037 | 1052 |
1038 +------------------------------------------------------------------------------+ | 1053 +------------------------------------------------------------------------------+ |
1039 | | | | | | | | 1054 | | | | | | | |
1040 | node | p1 node | p2 node | base node | link node | flags | | 1055 | node | p1 node | p2 node | base node | link node | flags | |
1041 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (2 bytes) | | 1056 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (2 bytes) | |
1042 | | | | | | | | 1057 | | | | | | | |
1043 +------------------------------------------------------------------------------+ | 1058 +------------------------------------------------------------------------------+ |
1044 | 1059 |
1045 The *mdiff header* consists of 3 32-bit big-endian signed integers | 1060 The *delta data* consists of "chunklen - 4 - headerlen" bytes, which |
1046 describing offsets at which to apply the following delta content: | 1061 contain a series of *delta*s, densely packed (no separators). These deltas |
1047 | 1062 describe a diff from an existing entry (either that the recipient already |
1048 +-------------------------------------+ | 1063 has, or previously specified in the bundle/changegroup). The format is |
1049 | | | | | 1064 described more fully in "hg help internals.bdiff", but briefly: |
1050 | offset | old length | new length | | 1065 |
1051 | (32 bits) | (32 bits) | (32 bits) | | 1066 +---------------------------------------------------------------+ | |
1052 | | | | | 1067 | | | | | start offset | end |
1053 +-------------------------------------+ | 1068 offset | new length | content | | (4 bytes) | (4 |
1069 bytes) | (4 bytes) | (<new length> bytes) | | | | |
1070 | | | | |
1071 +---------------------------------------------------------------+ | |
1072 | |
1073 Please note that the length field in the delta data does *not* include | |
1074 itself. | |
1054 | 1075 |
1055 In version 1, the delta is always applied against the previous node from | 1076 In version 1, the delta is always applied against the previous node from |
1056 the changegroup or the first parent if this is the first entry in the | 1077 the changegroup or the first parent if this is the first entry in the |
1057 changegroup. | 1078 changegroup. |
1058 | 1079 |
1059 In version 2, the delta base node is encoded in the entry in the | 1080 In version 2 and up, the delta base node is encoded in the entry in the |
1060 changegroup. This allows the delta to be expressed against any parent, | 1081 changegroup. This allows the delta to be expressed against any parent, |
1061 which can result in smaller deltas and more efficient encoding of data. | 1082 which can result in smaller deltas and more efficient encoding of data. |
1062 | 1083 |
1063 Changeset Segment | 1084 Changeset Segment |
1064 ================= | 1085 ================= |
1065 | 1086 |
1066 The *changeset segment* consists of a single *delta group* holding | 1087 The *changeset segment* consists of a single *delta group* holding |
1067 changelog data. It is followed by an *empty chunk* to denote the boundary | 1088 changelog data. The *empty chunk* at the end of the *delta group* denotes |
1068 to the *manifests segment*. | 1089 the boundary to the *manifest segment*. |
1069 | 1090 |
1070 Manifest Segment | 1091 Manifest Segment |
1071 ================ | 1092 ================ |
1072 | 1093 |
1073 The *manifest segment* consists of a single *delta group* holding manifest | 1094 The *manifest segment* consists of a single *delta group* holding manifest |
1074 data. It is followed by an *empty chunk* to denote the boundary to the | 1095 data. If treemanifests are in use, it contains only the manifest for the |
1075 *filelogs segment*. | 1096 root directory of the repository. Otherwise, it contains the entire |
1097 manifest data. The *empty chunk* at the end of the *delta group* denotes | |
1098 the boundary to the next segment (either the *treemanifests segment* or | |
1099 the *filelogs segment*, depending on version and the request options). | |
1100 | |
1101 Treemanifests Segment | |
1102 --------------------- | |
1103 | |
1104 The *treemanifests segment* only exists in changegroup version "3", and | |
1105 only if the 'treemanifest' param is part of the bundle2 changegroup part | |
1106 (it is not possible to use changegroup version 3 outside of bundle2). | |
1107 Aside from the filenames in the *treemanifests segment* containing a | |
1108 trailing "/" character, it behaves identically to the *filelogs segment* | |
1109 (see below). The final sub-segment is followed by an *empty chunk* | |
1110 (logically, a sub-segment with filename size 0). This denotes the boundary | |
1111 to the *filelogs segment*. | |
1076 | 1112 |
1077 Filelogs Segment | 1113 Filelogs Segment |
1078 ================ | 1114 ================ |
1079 | 1115 |
1080 The *filelogs* segment consists of multiple sub-segments, each | 1116 The *filelogs segment* consists of multiple sub-segments, each |
1081 corresponding to an individual file whose data is being described: | 1117 corresponding to an individual file whose data is being described: |
1082 | 1118 |
1083 +--------------------------------------+ | 1119 +--------------------------------------------------+ |
1084 | | | | | | 1120 | | | | | | |
1085 | filelog0 | filelog1 | filelog2 | ... | | 1121 | filelog0 | filelog1 | filelog2 | ... | 0x0 | |
1086 | | | | | | 1122 | | | | | (4 bytes) | |
1087 +--------------------------------------+ | 1123 | | | | | | |
1088 | 1124 +--------------------------------------------------+ |
1089 In version "3" of the changegroup format, filelogs may include directory | 1125 |
1090 logs when treemanifests are in use. directory logs are identified by | 1126 The final filelog sub-segment is followed by an *empty chunk* (logically, |
1091 having a trailing '/' on their filename (see below). | 1127 a sub-segment with filename size 0). This denotes the end of the segment |
1092 | 1128 and of the overall changegroup. |
1093 The final filelog sub-segment is followed by an *empty chunk* to denote | |
1094 the end of the segment and the overall changegroup. | |
1095 | 1129 |
1096 Each filelog sub-segment consists of the following: | 1130 Each filelog sub-segment consists of the following: |
1097 | 1131 |
1098 +------------------------------------------+ | 1132 +------------------------------------------------------+ |
1099 | | | | | 1133 | | | | |
1100 | filename size | filename | delta group | | 1134 | filename length | filename | delta group | |
1101 | (32 bits) | (various) | (various) | | 1135 | (4 bytes) | (<length - 4> bytes) | (various) | |
1102 | | | | | 1136 | | | | |
1103 +------------------------------------------+ | 1137 +------------------------------------------------------+ |
1104 | 1138 |
1105 That is, a *chunk* consisting of the filename (not terminated or padded) | 1139 That is, a *chunk* consisting of the filename (not terminated or padded) |
1106 followed by N chunks constituting the *delta group* for this file. | 1140 followed by N chunks constituting the *delta group* for this file. The |
1141 *empty chunk* at the end of each *delta group* denotes the boundary to the | |
1142 next filelog sub-segment. | |
1107 | 1143 |
1108 Test list of commands with command with no help text | 1144 Test list of commands with command with no help text |
1109 | 1145 |
1110 $ hg help helpext | 1146 $ hg help helpext |
1111 helpext extension - no help text available | 1147 helpext extension - no help text available |
3029 </form> | 3065 </form> |
3030 <div id="doc"> | 3066 <div id="doc"> |
3031 <h1>Changegroups</h1> | 3067 <h1>Changegroups</h1> |
3032 <p> | 3068 <p> |
3033 Changegroups are representations of repository revlog data, specifically | 3069 Changegroups are representations of repository revlog data, specifically |
3034 the changelog, manifest, and filelogs. | 3070 the changelog data, root/flat manifest data, treemanifest data, and |
3071 filelogs. | |
3035 </p> | 3072 </p> |
3036 <p> | 3073 <p> |
3037 There are 3 versions of changegroups: "1", "2", and "3". From a | 3074 There are 3 versions of changegroups: "1", "2", and "3". From a |
3038 high-level, versions "1" and "2" are almost exactly the same, with | 3075 high-level, versions "1" and "2" are almost exactly the same, with the |
3039 the only difference being a header on entries in the changeset | 3076 only difference being an additional item in the *delta header*. Version |
3040 segment. Version "3" adds support for exchanging treemanifests and | 3077 "3" adds support for revlog flags in the *delta header* and optionally |
3041 includes revlog flags in the delta header. | 3078 exchanging treemanifests (enabled by setting an option on the |
3042 </p> | 3079 "changegroup" part in the bundle2). |
3043 <p> | 3080 </p> |
3044 Changegroups consists of 3 logical segments: | 3081 <p> |
3082 Changegroups when not exchanging treemanifests consist of 3 logical | |
3083 segments: | |
3045 </p> | 3084 </p> |
3046 <pre> | 3085 <pre> |
3047 +---------------------------------+ | 3086 +---------------------------------+ |
3048 | | | | | 3087 | | | | |
3049 | changeset | manifest | filelogs | | 3088 | changeset | manifest | filelogs | |
3050 | | | | | 3089 | | | | |
3090 | | | | | |
3051 +---------------------------------+ | 3091 +---------------------------------+ |
3092 </pre> | |
3093 <p> | |
3094 When exchanging treemanifests, there are 4 logical segments: | |
3095 </p> | |
3096 <pre> | |
3097 +-------------------------------------------------+ | |
3098 | | | | | | |
3099 | changeset | root | treemanifests | filelogs | | |
3100 | | manifest | | | | |
3101 | | | | | | |
3102 +-------------------------------------------------+ | |
3052 </pre> | 3103 </pre> |
3053 <p> | 3104 <p> |
3054 The principle building block of each segment is a *chunk*. A *chunk* | 3105 The principle building block of each segment is a *chunk*. A *chunk* |
3055 is a framed piece of data: | 3106 is a framed piece of data: |
3056 </p> | 3107 </p> |
3057 <pre> | 3108 <pre> |
3058 +---------------------------------------+ | 3109 +---------------------------------------+ |
3059 | | | | 3110 | | | |
3060 | length | data | | 3111 | length | data | |
3061 | (32 bits) | <length> bytes | | 3112 | (4 bytes) | (<length - 4> bytes) | |
3062 | | | | 3113 | | | |
3063 +---------------------------------------+ | 3114 +---------------------------------------+ |
3064 </pre> | 3115 </pre> |
3065 <p> | 3116 <p> |
3066 Each chunk starts with a 32-bit big-endian signed integer indicating | 3117 All integers are big-endian signed integers. Each chunk starts with a 32-bit |
3067 the length of the raw data that follows. | 3118 integer indicating the length of the entire chunk (including the length field |
3068 </p> | 3119 itself). |
3069 <p> | 3120 </p> |
3070 There is a special case chunk that has 0 length ("0x00000000"). We | 3121 <p> |
3071 call this an *empty chunk*. | 3122 There is a special case chunk that has a value of 0 for the length |
3123 ("0x00000000"). We call this an *empty chunk*. | |
3072 </p> | 3124 </p> |
3073 <h2>Delta Groups</h2> | 3125 <h2>Delta Groups</h2> |
3074 <p> | 3126 <p> |
3075 A *delta group* expresses the content of a revlog as a series of deltas, | 3127 A *delta group* expresses the content of a revlog as a series of deltas, |
3076 or patches against previous revisions. | 3128 or patches against previous revisions. |
3081 </p> | 3133 </p> |
3082 <pre> | 3134 <pre> |
3083 +------------------------------------------------------------------------+ | 3135 +------------------------------------------------------------------------+ |
3084 | | | | | | | 3136 | | | | | | |
3085 | chunk0 length | chunk0 data | chunk1 length | chunk1 data | 0x0 | | 3137 | chunk0 length | chunk0 data | chunk1 length | chunk1 data | 0x0 | |
3086 | (32 bits) | (various) | (32 bits) | (various) | (32 bits) | | 3138 | (4 bytes) | (various) | (4 bytes) | (various) | (4 bytes) | |
3087 | | | | | | | 3139 | | | | | | |
3088 +------------------------------------------------------------+-----------+ | 3140 +------------------------------------------------------------------------+ |
3089 </pre> | 3141 </pre> |
3090 <p> | 3142 <p> |
3091 Each *chunk*'s data consists of the following: | 3143 Each *chunk*'s data consists of the following: |
3092 </p> | 3144 </p> |
3093 <pre> | 3145 <pre> |
3094 +-----------------------------------------+ | 3146 +---------------------------------------+ |
3095 | | | | | 3147 | | | |
3096 | delta header | mdiff header | delta | | 3148 | delta header | delta data | |
3097 | (various) | (12 bytes) | (various) | | 3149 | (various by version) | (various) | |
3098 | | | | | 3150 | | | |
3099 +-----------------------------------------+ | 3151 +---------------------------------------+ |
3100 </pre> | 3152 </pre> |
3101 <p> | 3153 <p> |
3102 The *length* field is the byte length of the remaining 3 logical pieces | 3154 The *delta data* is a series of *delta*s that describe a diff from an existing |
3103 of data. The *delta* is a diff from an existing entry in the changelog. | 3155 entry (either that the recipient already has, or previously specified in the |
3156 bundlei/changegroup). | |
3104 </p> | 3157 </p> |
3105 <p> | 3158 <p> |
3106 The *delta header* is different between versions "1", "2", and | 3159 The *delta header* is different between versions "1", "2", and |
3107 "3" of the changegroup format. | 3160 "3" of the changegroup format. |
3108 </p> | 3161 </p> |
3109 <p> | 3162 <p> |
3110 Version 1: | 3163 Version 1 (headerlen=80): |
3111 </p> | 3164 </p> |
3112 <pre> | 3165 <pre> |
3113 +------------------------------------------------------+ | 3166 +------------------------------------------------------+ |
3114 | | | | | | 3167 | | | | | |
3115 | node | p1 node | p2 node | link node | | 3168 | node | p1 node | p2 node | link node | |
3116 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | | 3169 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | |
3117 | | | | | | 3170 | | | | | |
3118 +------------------------------------------------------+ | 3171 +------------------------------------------------------+ |
3119 </pre> | 3172 </pre> |
3120 <p> | 3173 <p> |
3121 Version 2: | 3174 Version 2 (headerlen=100): |
3122 </p> | 3175 </p> |
3123 <pre> | 3176 <pre> |
3124 +------------------------------------------------------------------+ | 3177 +------------------------------------------------------------------+ |
3125 | | | | | | | 3178 | | | | | | |
3126 | node | p1 node | p2 node | base node | link node | | 3179 | node | p1 node | p2 node | base node | link node | |
3127 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | | 3180 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | |
3128 | | | | | | | 3181 | | | | | | |
3129 +------------------------------------------------------------------+ | 3182 +------------------------------------------------------------------+ |
3130 </pre> | 3183 </pre> |
3131 <p> | 3184 <p> |
3132 Version 3: | 3185 Version 3 (headerlen=102): |
3133 </p> | 3186 </p> |
3134 <pre> | 3187 <pre> |
3135 +------------------------------------------------------------------------------+ | 3188 +------------------------------------------------------------------------------+ |
3136 | | | | | | | | 3189 | | | | | | | |
3137 | node | p1 node | p2 node | base node | link node | flags | | 3190 | node | p1 node | p2 node | base node | link node | flags | |
3138 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (2 bytes) | | 3191 | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (20 bytes) | (2 bytes) | |
3139 | | | | | | | | 3192 | | | | | | | |
3140 +------------------------------------------------------------------------------+ | 3193 +------------------------------------------------------------------------------+ |
3141 </pre> | 3194 </pre> |
3142 <p> | 3195 <p> |
3143 The *mdiff header* consists of 3 32-bit big-endian signed integers | 3196 The *delta data* consists of "chunklen - 4 - headerlen" bytes, which contain a |
3144 describing offsets at which to apply the following delta content: | 3197 series of *delta*s, densely packed (no separators). These deltas describe a diff |
3145 </p> | 3198 from an existing entry (either that the recipient already has, or previously |
3146 <pre> | 3199 specified in the bundle/changegroup). The format is described more fully in |
3147 +-------------------------------------+ | 3200 "hg help internals.bdiff", but briefly: |
3148 | | | | | 3201 </p> |
3149 | offset | old length | new length | | 3202 <p> |
3150 | (32 bits) | (32 bits) | (32 bits) | | 3203 +---------------------------------------------------------------+ |
3151 | | | | | 3204 | | | | | |
3152 +-------------------------------------+ | 3205 | start offset | end offset | new length | content | |
3153 </pre> | 3206 | (4 bytes) | (4 bytes) | (4 bytes) | (<new length> bytes) | |
3207 | | | | | | |
3208 +---------------------------------------------------------------+ | |
3209 </p> | |
3210 <p> | |
3211 Please note that the length field in the delta data does *not* include itself. | |
3212 </p> | |
3154 <p> | 3213 <p> |
3155 In version 1, the delta is always applied against the previous node from | 3214 In version 1, the delta is always applied against the previous node from |
3156 the changegroup or the first parent if this is the first entry in the | 3215 the changegroup or the first parent if this is the first entry in the |
3157 changegroup. | 3216 changegroup. |
3158 </p> | 3217 </p> |
3159 <p> | 3218 <p> |
3160 In version 2, the delta base node is encoded in the entry in the | 3219 In version 2 and up, the delta base node is encoded in the entry in the |
3161 changegroup. This allows the delta to be expressed against any parent, | 3220 changegroup. This allows the delta to be expressed against any parent, |
3162 which can result in smaller deltas and more efficient encoding of data. | 3221 which can result in smaller deltas and more efficient encoding of data. |
3163 </p> | 3222 </p> |
3164 <h2>Changeset Segment</h2> | 3223 <h2>Changeset Segment</h2> |
3165 <p> | 3224 <p> |
3166 The *changeset segment* consists of a single *delta group* holding | 3225 The *changeset segment* consists of a single *delta group* holding |
3167 changelog data. It is followed by an *empty chunk* to denote the | 3226 changelog data. The *empty chunk* at the end of the *delta group* denotes |
3168 boundary to the *manifests segment*. | 3227 the boundary to the *manifest segment*. |
3169 </p> | 3228 </p> |
3170 <h2>Manifest Segment</h2> | 3229 <h2>Manifest Segment</h2> |
3171 <p> | 3230 <p> |
3172 The *manifest segment* consists of a single *delta group* holding | 3231 The *manifest segment* consists of a single *delta group* holding manifest |
3173 manifest data. It is followed by an *empty chunk* to denote the boundary | 3232 data. If treemanifests are in use, it contains only the manifest for the |
3174 to the *filelogs segment*. | 3233 root directory of the repository. Otherwise, it contains the entire |
3234 manifest data. The *empty chunk* at the end of the *delta group* denotes | |
3235 the boundary to the next segment (either the *treemanifests segment* or the | |
3236 *filelogs segment*, depending on version and the request options). | |
3237 </p> | |
3238 <h3>Treemanifests Segment</h3> | |
3239 <p> | |
3240 The *treemanifests segment* only exists in changegroup version "3", and | |
3241 only if the 'treemanifest' param is part of the bundle2 changegroup part | |
3242 (it is not possible to use changegroup version 3 outside of bundle2). | |
3243 Aside from the filenames in the *treemanifests segment* containing a | |
3244 trailing "/" character, it behaves identically to the *filelogs segment* | |
3245 (see below). The final sub-segment is followed by an *empty chunk* (logically, | |
3246 a sub-segment with filename size 0). This denotes the boundary to the | |
3247 *filelogs segment*. | |
3175 </p> | 3248 </p> |
3176 <h2>Filelogs Segment</h2> | 3249 <h2>Filelogs Segment</h2> |
3177 <p> | 3250 <p> |
3178 The *filelogs* segment consists of multiple sub-segments, each | 3251 The *filelogs segment* consists of multiple sub-segments, each |
3179 corresponding to an individual file whose data is being described: | 3252 corresponding to an individual file whose data is being described: |
3180 </p> | 3253 </p> |
3181 <pre> | 3254 <pre> |
3182 +--------------------------------------+ | 3255 +--------------------------------------------------+ |
3183 | | | | | | 3256 | | | | | | |
3184 | filelog0 | filelog1 | filelog2 | ... | | 3257 | filelog0 | filelog1 | filelog2 | ... | 0x0 | |
3185 | | | | | | 3258 | | | | | (4 bytes) | |
3186 +--------------------------------------+ | 3259 | | | | | | |
3260 +--------------------------------------------------+ | |
3187 </pre> | 3261 </pre> |
3188 <p> | 3262 <p> |
3189 In version "3" of the changegroup format, filelogs may include | 3263 The final filelog sub-segment is followed by an *empty chunk* (logically, |
3190 directory logs when treemanifests are in use. directory logs are | 3264 a sub-segment with filename size 0). This denotes the end of the segment |
3191 identified by having a trailing '/' on their filename (see below). | 3265 and of the overall changegroup. |
3192 </p> | |
3193 <p> | |
3194 The final filelog sub-segment is followed by an *empty chunk* to denote | |
3195 the end of the segment and the overall changegroup. | |
3196 </p> | 3266 </p> |
3197 <p> | 3267 <p> |
3198 Each filelog sub-segment consists of the following: | 3268 Each filelog sub-segment consists of the following: |
3199 </p> | 3269 </p> |
3200 <pre> | 3270 <pre> |
3201 +------------------------------------------+ | 3271 +------------------------------------------------------+ |
3202 | | | | | 3272 | | | | |
3203 | filename size | filename | delta group | | 3273 | filename length | filename | delta group | |
3204 | (32 bits) | (various) | (various) | | 3274 | (4 bytes) | (<length - 4> bytes) | (various) | |
3205 | | | | | 3275 | | | | |
3206 +------------------------------------------+ | 3276 +------------------------------------------------------+ |
3207 </pre> | 3277 </pre> |
3208 <p> | 3278 <p> |
3209 That is, a *chunk* consisting of the filename (not terminated or padded) | 3279 That is, a *chunk* consisting of the filename (not terminated or padded) |
3210 followed by N chunks constituting the *delta group* for this file. | 3280 followed by N chunks constituting the *delta group* for this file. The |
3281 *empty chunk* at the end of each *delta group* denotes the boundary to the | |
3282 next filelog sub-segment. | |
3211 </p> | 3283 </p> |
3212 | 3284 |
3213 </div> | 3285 </div> |
3214 </div> | 3286 </div> |
3215 </div> | 3287 </div> |