hgbook
changeset 109:1b67dc96f27a
Snapshot of concepts chapter.
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Fri Nov 10 12:42:00 2006 -0800 (2006-11-10) |
parents | e0b961975c5e |
children | 75c076c7a374 |
files | en/Makefile en/concepts.tex en/metadata.svg |
line diff
1.1 --- a/en/Makefile Thu Nov 09 10:11:31 2006 -0800 1.2 +++ b/en/Makefile Fri Nov 10 12:42:00 2006 -0800 1.3 @@ -23,6 +23,7 @@ 1.4 image-sources := \ 1.5 filelog.svg \ 1.6 kdiff3.png \ 1.7 + metadata.svg \ 1.8 mq-stack.svg \ 1.9 tour-history.svg \ 1.10 tour-merge-conflict.svg \
2.1 --- a/en/concepts.tex Thu Nov 09 10:11:31 2006 -0800 2.2 +++ b/en/concepts.tex Fri Nov 10 12:42:00 2006 -0800 2.3 @@ -6,7 +6,15 @@ 2.4 the software really works. Knowing this certainly isn't necessary, 2.5 but I find it useful to have a ``mental model'' of what's going on. 2.6 2.7 -\section{Tracking the history of a single file} 2.8 +This understanding gives me confidence that Mercurial has been 2.9 +carefully designed to be both \emph{safe} and \emph{efficient}. And 2.10 +just as importantly, if I have a good idea what the software is doing 2.11 +when I perform a revision control task, I'm less likely to be 2.12 +surprised by its behaviour. 2.13 + 2.14 +\section{Mercurial's historical record} 2.15 + 2.16 +\subsection{Tracking the history of a single file} 2.17 2.18 When Mercurial tracks modifications to a file, it stores the history 2.19 of that file in a metadata object called a \emph{filelog}. Each entry 2.20 @@ -16,13 +24,13 @@ 2.21 information: revision data, and an index to help Mercurial to find a 2.22 revision efficiently. 2.23 2.24 -For small files without much history, the revision data and index are 2.25 -combined in a single file (with a ``\texttt{.i}'' suffix). A file 2.26 -that is large, or has a lot of history, has its filelog stored as 2.27 -separate data (``\texttt{.d}'' suffix) and index (``\texttt{.i}'' 2.28 -suffix) files. The correspondence between a file in the working 2.29 -directory and the filelog that tracks its history in the repository is 2.30 -illustrated in figure~\ref{fig:concepts:filelog}. 2.31 +A file that is large, or has a lot of history, has its filelog stored 2.32 +in separate data (``\texttt{.d}'' suffix) and index (``\texttt{.i}'' 2.33 +suffix) files. For small files without much history, the revision 2.34 +data and index are combined in a single ``\texttt{.i}'' file. The 2.35 +correspondence between a file in the working directory and the filelog 2.36 +that tracks its history in the repository is illustrated in 2.37 +figure~\ref{fig:concepts:filelog}. 2.38 2.39 \begin{figure}[ht] 2.40 \centering 2.41 @@ -32,6 +40,219 @@ 2.42 \label{fig:concepts:filelog} 2.43 \end{figure} 2.44 2.45 +\subsection{Managing tracked files} 2.46 + 2.47 +Mercurial uses a structure called a \emph{manifest} to collect 2.48 +together information about the files that it tracks. Each entry in 2.49 +the manifest contains information about the files present in a single 2.50 +changeset. An entry records which files are present in the changeset, 2.51 +the revision of each file, and a few other pieces of file metadata. 2.52 + 2.53 +\subsection{Recording changeset information} 2.54 + 2.55 +The \emph{changelog} contains information about each changeset. Each 2.56 +revision records who committed a change, the changeset comment, other 2.57 +pieces of changeset-related information, and the revision of the 2.58 +manifest to use. 2.59 + 2.60 +\subsection{Relationships between revisions} 2.61 + 2.62 +Within a changelog, a manifest, or a filelog, each revision stores a 2.63 +pointer to its immediate parent (or to its two parents, if it's a 2.64 +merge revision). As I mentioned above, there are also relationships 2.65 +between revisions \emph{across} these structures, and they are 2.66 +hierarchical in nature. 2.67 + 2.68 +For every changeset in a repository, there is exactly one revision 2.69 +stored in the changelog. Each revision of the changelog contains a 2.70 +pointer to a single revision of the manifest. A revision of the 2.71 +manifest stores a pointer to a single revision of each filelog tracked 2.72 +when that changeset was created. These relationships are illustrated 2.73 +in figure~\ref{fig:concepts:metadata}. 2.74 + 2.75 +\begin{figure}[ht] 2.76 + \centering 2.77 + \grafix{metadata} 2.78 + \caption{Metadata relationships} 2.79 + \label{fig:concepts:metadata} 2.80 +\end{figure} 2.81 + 2.82 +Note that there is not a ``one to one'' relationship between revisions 2.83 +in these different metadata files. If the manifest hasn't changed 2.84 +between two changesets, their changelog entries will point to the same 2.85 +revision of the manifest. If a file that Mercurial tracks hasn't 2.86 +changed between two changesets, the entry for that file in the two 2.87 +revisions of the manifest will point to the same revision of its 2.88 +filelog. 2.89 + 2.90 +\section{An efficient, unified, safe storage mechanism} 2.91 + 2.92 +The underpinnings of changelogs, manifests, and filelogs are provided 2.93 +by a single structure called the \emph{revlog}. 2.94 + 2.95 +\subsection{Efficient storage} 2.96 + 2.97 +The revlog provides efficient storage of revisions using a 2.98 +\emph{delta} mechanism. Instead of storing a complete copy of a file 2.99 +for each revision, it stores the changes needed to transform an older 2.100 +revision into the new revision. For many kinds of file data, these 2.101 +deltas are typically a fraction of a percent of the size of a full 2.102 +copy of a file. 2.103 + 2.104 +Some obsolete revision control systems can only work with deltas of 2.105 +text files. They must either store binary files as complete snapshots 2.106 +or encoded into a text representation, both of which are wasteful 2.107 +approaches. Mercurial can efficiently handle deltas of files with 2.108 +arbitrary binary contents; it doesn't need to treat text as special. 2.109 + 2.110 +\subsection{Safe operation} 2.111 + 2.112 +Mercurial only ever \emph{appends} data to the end of a revlog file. 2.113 +It never modifies a section of a file after it has written it. This 2.114 +is both more robust and efficient than schemes that need to modify or 2.115 +rewrite data. 2.116 + 2.117 +In addition, Mercurial treats every write as part of a 2.118 +\emph{transaction} that can span a number of files. A transaction is 2.119 +\emph{atomic}: either the entire transaction succeeds and its effects 2.120 +are all visible to readers in one go, or the whole thing is undone. 2.121 +This guarantee of atomicity means that if you're running two copies of 2.122 +Mercurial, where one is reading data and one is writing it, the reader 2.123 +will never see a partially written result that might confuse it. 2.124 + 2.125 +The fact that Mercurial only appends to files makes it easier to 2.126 +provide this transactional guarantee. The easier it is to do stuff 2.127 +like this, the more confident you should be that it's done correctly. 2.128 + 2.129 +\subsection{Fast retrieval} 2.130 + 2.131 +Mercurial cleverly avoids a pitfall common to all earlier 2.132 +revision control systems: the problem of \emph{inefficient retrieval}. 2.133 +Most revision control systems store the contents of a revision as an 2.134 +incremental series of modifications against a ``snapshot''. To 2.135 +reconstruct a specific revision, you must first read the snapshot, and 2.136 +then every one of the revisions between the snapshot and your target 2.137 +revision. The more history that a file accumulates, the more 2.138 +revisions you must read, hence the longer it takes to reconstruct a 2.139 +particular revision. 2.140 + 2.141 +The innovation that Mercurial applies to this problem is simple but 2.142 +effective. Once the cumulative amount of delta information stored 2.143 +since the last snapshot exceeds a fixed threshold, it stores a new 2.144 +snapshot (compressed, of course), instead of another delta. This 2.145 +makes it possible to reconstruct \emph{any} revision of a file 2.146 +quickly. This approach works so well that it has subsequently been 2.147 +copied by several other revision control systems. 2.148 + 2.149 +\subsubsection{Aside: the influence of video compression} 2.150 + 2.151 +If you're familiar with video compression or have ever watched a TV 2.152 +feed through a digital cable or satellite service, you may know that 2.153 +most video compression schemes store each frame of video as a delta 2.154 +against its predecessor frame. In addition, these schemes use 2.155 +``lossy'' compression techniques to increase the compression ratio, so 2.156 +visual errors accumulate over the course of a number of inter-frame 2.157 +deltas. 2.158 + 2.159 +Because it's possible for a video stream to ``drop out'' occasionally 2.160 +due to signal glitches, and to limit the accumulation of artefacts 2.161 +introduced by the lossy compression process, video encoders 2.162 +periodically insert a complete frame (called a ``key frame'') into the 2.163 +video stream; the next delta is generated against that frame. This 2.164 +means that if the video signal gets interrupted, it will resume once 2.165 +the next key frame is received. Also, the accumulation of encoding 2.166 +errors restarts anew with each key frame. 2.167 + 2.168 +\subsection{Clever compression} 2.169 + 2.170 +When appropriate, Mercurial will store both snapshots and deltas in 2.171 +compressed form. It does this by always \emph{trying to} compress a 2.172 +snapshot or delta, but only storing the compressed version if it's 2.173 +smaller than the uncompressed version. 2.174 + 2.175 +This means that Mercurial does ``the right thing'' when storing a file 2.176 +whose native form is compressed, such as a \texttt{zip} archive or a 2.177 +JPEG image. When these types of files are compressed a second time, 2.178 +the resulting file is usually bigger than the once-compressed form, 2.179 +and so Mercurial will store the plain \texttt{zip} or JPEG. 2.180 + 2.181 +Deltas between revisions of a compressed file are usually larger than 2.182 +snapshots of the file, and Mercurial again does ``the right thing'' in 2.183 +these cases. It finds that such a delta exceeds the threshold at 2.184 +which it should store a complete snapshot of the file, so it stores 2.185 +the snapshot, again saving space compared to a naive delta-only 2.186 +approach. 2.187 + 2.188 +\subsection{Strong integrity} 2.189 + 2.190 +Along with delta or snapshot information, a revlog entry contains a 2.191 +cryptographic hash of the data that it represents. This makes it 2.192 +difficult to forge the contents of a revision, and easy to detect 2.193 +accidental corruption. 2.194 + 2.195 +Mercurial checks these hashes when retrieving file revisions and when 2.196 +pulling changes from a repository. If it encounters an integrity 2.197 +problem, it will complain and stop whatever it's doing. 2.198 + 2.199 +In addition to the effect it has on retrieval efficiency, Mercurial's 2.200 +use of periodic snapshots makes it more robust against partial data 2.201 +corruption. If a revlog becomes partly corrupted due to a hardware 2.202 +error or system bug, it's often possible to reconstruct some or most 2.203 +revisions from the uncorrupted sections of the revlog, both before and 2.204 +after the corrupted section. This would not be possible with a 2.205 +delta-only storage model. 2.206 + 2.207 +\subsection{Read/write ordering and atomicity} 2.208 + 2.209 +Appending to files isn't the whole story when it comes to guaranteeing 2.210 +that a reader won't see a partial write. If you recall 2.211 +figure~\ref{fig:concepts:metadata}, revisions in the changelog point to 2.212 +revisions in the manifest, and revisions in the manifest point to 2.213 +revisions in filelogs. This hierarchy is deliberate. 2.214 + 2.215 +A writer starts a transaction by writing filelog and manifest data, 2.216 +and doesn't write any changelog data until those are finished. A 2.217 +reader starts by reading changelog data, then manifest data, followed 2.218 +by filelog data. 2.219 + 2.220 +Since the writer has always finished writing filelog and manifest data 2.221 +before it writes to the changelog, a reader will never read a pointer 2.222 +to a partially written manifest revision from the changelog, and it will 2.223 +never read a pointer to a partially written filelog revision from the 2.224 +manifest. 2.225 + 2.226 +\subsection{Concurrent access} 2.227 + 2.228 +The read/write ordering and atomicity guarantees mean that Mercurial 2.229 +never needs to \emph{lock} a repository when it's reading data, even 2.230 +if the repository is being written to while the read is occurring. 2.231 +This has a big effect on scalability; you can have an arbitrary number 2.232 +of Mercurial processes safely reading data from a repository safely 2.233 +all at once, no matter whether it's being written to or not. 2.234 + 2.235 +The lockless nature of reading means that if you're sharing a 2.236 +repository on a multi-user system, you don't need to grant other local 2.237 +users permission to \emph{write} to your repository in order for them 2.238 +to be able to clone it or pull changes from it; they only need 2.239 +\emph{read} permission. (This is \emph{not} a common feature among 2.240 +revision control systems, so don't take it for granted! Most require 2.241 +readers to be able to lock a repository to access it safely, and this 2.242 +requires write permission on at least one directory, which of course 2.243 +makes for all kinds of nasty and annoying security and administrative 2.244 +problems.) 2.245 + 2.246 +Mercurial uses a locking mechanism to ensure that only one process can 2.247 +write to a repository at a time. This locking mechanism is safe even 2.248 +over filesystems that are notoriously unsafe for locking, such as NFS. 2.249 +If a repository is locked, a writer will wait for a while to retry if 2.250 +the repository becomes unlocked, but if the repository remains locked 2.251 +for too long, the process attempting to write will time out after a 2.252 +while. This means that your daily automated scripts won't get stuck 2.253 +forever and pile up if a system crashes unnoticed, for example. (Yes, 2.254 +the timeout is configurable, from zero to infinity.) 2.255 + 2.256 + 2.257 + 2.258 %%% Local Variables: 2.259 %%% mode: latex 2.260 %%% TeX-master: "00book"
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 3.2 +++ b/en/metadata.svg Fri Nov 10 12:42:00 2006 -0800 3.3 @@ -0,0 +1,328 @@ 3.4 +<?xml version="1.0" encoding="UTF-8" standalone="no"?> 3.5 +<!-- Created with Inkscape (http://www.inkscape.org/) --> 3.6 +<svg 3.7 + xmlns:dc="http://purl.org/dc/elements/1.1/" 3.8 + xmlns:cc="http://web.resource.org/cc/" 3.9 + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 3.10 + xmlns:svg="http://www.w3.org/2000/svg" 3.11 + xmlns="http://www.w3.org/2000/svg" 3.12 + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" 3.13 + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" 3.14 + width="744.09448819" 3.15 + height="1052.3622047" 3.16 + id="svg2" 3.17 + sodipodi:version="0.32" 3.18 + inkscape:version="0.44.1" 3.19 + sodipodi:docname="metadata.svg" 3.20 + sodipodi:docbase="/home/bos/hg/hgbook/en"> 3.21 + <defs 3.22 + id="defs4"> 3.23 + <marker 3.24 + inkscape:stockid="Arrow1Mend" 3.25 + orient="auto" 3.26 + refY="0.0" 3.27 + refX="0.0" 3.28 + id="Arrow1Mend" 3.29 + style="overflow:visible;"> 3.30 + <path 3.31 + id="path2944" 3.32 + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " 3.33 + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;" 3.34 + transform="scale(0.4) rotate(180) translate(10,0)" /> 3.35 + </marker> 3.36 + </defs> 3.37 + <sodipodi:namedview 3.38 + id="base" 3.39 + pagecolor="#ffffff" 3.40 + bordercolor="#666666" 3.41 + borderopacity="1.0" 3.42 + gridtolerance="10000" 3.43 + guidetolerance="10" 3.44 + objecttolerance="10" 3.45 + inkscape:pageopacity="0.0" 3.46 + inkscape:pageshadow="2" 3.47 + inkscape:zoom="1.4" 3.48 + inkscape:cx="232.14286" 3.49 + inkscape:cy="490.68696" 3.50 + inkscape:document-units="px" 3.51 + inkscape:current-layer="layer1" 3.52 + inkscape:window-width="906" 3.53 + inkscape:window-height="620" 3.54 + inkscape:window-x="181" 3.55 + inkscape:window-y="58" /> 3.56 + <metadata 3.57 + id="metadata7"> 3.58 + <rdf:RDF> 3.59 + <cc:Work 3.60 + rdf:about=""> 3.61 + <dc:format>image/svg+xml</dc:format> 3.62 + <dc:type 3.63 + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> 3.64 + </cc:Work> 3.65 + </rdf:RDF> 3.66 + </metadata> 3.67 + <g 3.68 + inkscape:label="Layer 1" 3.69 + inkscape:groupmode="layer" 3.70 + id="layer1"> 3.71 + <path 3.72 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#a7a7a7;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1;display:inline" 3.73 + d="M 326.94646,471.18359 L 326.94646,510.98123" 3.74 + id="path1910" 3.75 + inkscape:connector-type="polyline" 3.76 + inkscape:connection-end="#rect2962" 3.77 + inkscape:connection-start="#rect2764" /> 3.78 + <path 3.79 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#a7a7a7;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1;display:inline" 3.80 + d="M 326.94646,531.98123 L 326.94646,591.77887" 3.81 + id="path1912" 3.82 + inkscape:connector-type="polyline" 3.83 + inkscape:connection-start="#rect2962" 3.84 + inkscape:connection-end="#rect3000" /> 3.85 + <path 3.86 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#a7a7a7;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1;display:inline" 3.87 + d="M 316.1622,531.98123 L 192.30212,652.57648" 3.88 + id="path1916" 3.89 + inkscape:connector-type="polyline" 3.90 + inkscape:connection-end="#rect3038" 3.91 + inkscape:connection-start="#rect2962" /> 3.92 + <path 3.93 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#484848;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5,1.5;stroke-dashoffset:0" 3.94 + d="M 254.23217,471.18359 L 254.23216,510.98123" 3.95 + id="path3088" 3.96 + inkscape:connector-type="polyline" 3.97 + inkscape:connection-start="#rect1872" 3.98 + inkscape:connection-end="#rect2960" /> 3.99 + <path 3.100 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#484848;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1" 3.101 + d="M 254.23215,531.98123 L 254.23215,591.77887" 3.102 + id="path3090" 3.103 + inkscape:connector-type="polyline" 3.104 + inkscape:connection-start="#rect2960" 3.105 + inkscape:connection-end="#rect2998" /> 3.106 + <path 3.107 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#484848;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:4.5, 1.5;stroke-dashoffset:0;stroke-opacity:1" 3.108 + d="M 248.84002,531.98123 L 186.90999,652.57648" 3.109 + id="path3092" 3.110 + inkscape:connector-type="polyline" 3.111 + inkscape:connection-start="#rect2960" 3.112 + inkscape:connection-end="#rect3038" /> 3.113 + <rect 3.114 + style="fill:#7b7df5;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.115 + id="rect1872" 3.116 + width="51.42857" 3.117 + height="20" 3.118 + x="228.51788" 3.119 + y="450.68359" /> 3.120 + <rect 3.121 + style="fill:#cacbfb;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.122 + id="rect2764" 3.123 + width="51.42857" 3.124 + height="20" 3.125 + x="301.23218" 3.126 + y="450.68359" /> 3.127 + <rect 3.128 + style="fill:#cacbfb;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.129 + id="rect2766" 3.130 + width="51.42857" 3.131 + height="20" 3.132 + x="155.80359" 3.133 + y="450.68359" /> 3.134 + <rect 3.135 + style="fill:#cacbfb;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.136 + id="rect2768" 3.137 + width="51.42857" 3.138 + height="20" 3.139 + x="83.089294" 3.140 + y="450.68359" /> 3.141 + <path 3.142 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.143 + d="M 135.01786,460.68359 L 155.30359,460.68359" 3.144 + id="path2770" 3.145 + inkscape:connector-type="polyline" 3.146 + inkscape:connection-start="#rect2768" 3.147 + inkscape:connection-end="#rect2766" /> 3.148 + <path 3.149 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.150 + d="M 207.73216,460.68359 L 228.01788,460.68359" 3.151 + id="path2772" 3.152 + inkscape:connector-type="polyline" 3.153 + inkscape:connection-start="#rect2766" 3.154 + inkscape:connection-end="#rect1872" /> 3.155 + <path 3.156 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.157 + d="M 280.44645,460.68359 L 300.73218,460.68359" 3.158 + id="path2774" 3.159 + inkscape:connector-type="polyline" 3.160 + inkscape:connection-start="#rect1872" 3.161 + inkscape:connection-end="#rect2764" /> 3.162 + <path 3.163 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" 3.164 + d="M 62.303571,460.68359 L 82.589293,460.68359" 3.165 + id="path2778" 3.166 + inkscape:connector-type="polyline" 3.167 + inkscape:connection-end="#rect2768" /> 3.168 + <rect 3.169 + style="fill:#84f57b;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.170 + id="rect2960" 3.171 + width="51.42857" 3.172 + height="20" 3.173 + x="228.51787" 3.174 + y="511.48123" /> 3.175 + <rect 3.176 + style="fill:#cefbca;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.177 + id="rect2962" 3.178 + width="51.42857" 3.179 + height="20" 3.180 + x="301.23218" 3.181 + y="511.48123" /> 3.182 + <rect 3.183 + style="fill:#cefbca;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.184 + id="rect2964" 3.185 + width="51.42857" 3.186 + height="20" 3.187 + x="155.80357" 3.188 + y="511.48123" /> 3.189 + <rect 3.190 + style="fill:#cefbca;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.191 + id="rect2966" 3.192 + width="51.42857" 3.193 + height="20" 3.194 + x="83.089287" 3.195 + y="511.48123" /> 3.196 + <path 3.197 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.198 + d="M 135.01786,521.48121 L 155.30359,521.48121" 3.199 + id="path2968" 3.200 + inkscape:connector-type="polyline" /> 3.201 + <path 3.202 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.203 + d="M 207.73216,521.48121 L 228.01788,521.48121" 3.204 + id="path2970" 3.205 + inkscape:connector-type="polyline" /> 3.206 + <path 3.207 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.208 + d="M 280.44645,521.48121 L 300.73218,521.48121" 3.209 + id="path2972" 3.210 + inkscape:connector-type="polyline" /> 3.211 + <path 3.212 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" 3.213 + d="M 62.30358,521.48121 L 82.5893,521.48121" 3.214 + id="path2974" 3.215 + inkscape:connector-type="polyline" /> 3.216 + <rect 3.217 + style="fill:#f57b8f;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.218 + id="rect2998" 3.219 + width="51.42857" 3.220 + height="20" 3.221 + x="228.51787" 3.222 + y="592.27887" /> 3.223 + <rect 3.224 + style="fill:#fbcad2;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.225 + id="rect3000" 3.226 + width="51.42857" 3.227 + height="20" 3.228 + x="301.23218" 3.229 + y="592.27887" /> 3.230 + <rect 3.231 + style="fill:#fbcad2;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.232 + id="rect3002" 3.233 + width="51.42857" 3.234 + height="20" 3.235 + x="155.80357" 3.236 + y="592.27887" /> 3.237 + <rect 3.238 + style="fill:#fbcad2;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.239 + id="rect3004" 3.240 + width="51.42857" 3.241 + height="20" 3.242 + x="83.089287" 3.243 + y="592.27887" /> 3.244 + <path 3.245 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.246 + d="M 135.01786,602.27884 L 155.30359,602.27884" 3.247 + id="path3006" 3.248 + inkscape:connector-type="polyline" /> 3.249 + <path 3.250 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.251 + d="M 207.73216,602.27884 L 228.01788,602.27884" 3.252 + id="path3008" 3.253 + inkscape:connector-type="polyline" /> 3.254 + <path 3.255 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.256 + d="M 280.44645,602.27884 L 300.73218,602.27884" 3.257 + id="path3010" 3.258 + inkscape:connector-type="polyline" /> 3.259 + <path 3.260 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" 3.261 + d="M 62.30358,602.27884 L 82.5893,602.27884" 3.262 + id="path3012" 3.263 + inkscape:connector-type="polyline" /> 3.264 + <rect 3.265 + style="fill:#ffced6;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.266 + id="rect3034" 3.267 + width="51.42857" 3.268 + height="20" 3.269 + x="228.51787" 3.270 + y="653.07648" /> 3.271 + <rect 3.272 + style="fill:#f57b8f;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.273 + id="rect3038" 3.274 + width="51.42857" 3.275 + height="20" 3.276 + x="155.80357" 3.277 + y="653.07648" /> 3.278 + <rect 3.279 + style="fill:#fbcad2;fill-opacity:1;stroke:#595959;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" 3.280 + id="rect3040" 3.281 + width="51.42857" 3.282 + height="20" 3.283 + x="83.089287" 3.284 + y="653.07648" /> 3.285 + <path 3.286 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.287 + d="M 135.01786,663.07646 L 155.30359,663.07646" 3.288 + id="path3042" 3.289 + inkscape:connector-type="polyline" /> 3.290 + <path 3.291 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-opacity:1" 3.292 + d="M 207.73216,663.07646 L 228.01788,663.07646" 3.293 + id="path3044" 3.294 + inkscape:connector-type="polyline" /> 3.295 + <path 3.296 + style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#747474;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker-end:url(#Arrow1Mend);stroke-miterlimit:4;stroke-dasharray:3, 3;stroke-dashoffset:0;stroke-opacity:1" 3.297 + d="M 62.30358,663.07646 L 82.5893,663.07646" 3.298 + id="path3048" 3.299 + inkscape:connector-type="polyline" /> 3.300 + <text 3.301 + xml:space="preserve" 3.302 + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman" 3.303 + x="82.072548" 3.304 + y="436.64789" 3.305 + id="text3094"><tspan 3.306 + sodipodi:role="line" 3.307 + id="tspan3096" 3.308 + x="82.072548" 3.309 + y="436.64789">Changelog</tspan></text> 3.310 + <text 3.311 + xml:space="preserve" 3.312 + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman" 3.313 + x="82.306923" 3.314 + y="498.97327" 3.315 + id="text3098"><tspan 3.316 + sodipodi:role="line" 3.317 + id="tspan3100" 3.318 + x="82.306923" 3.319 + y="498.97327">Manifest</tspan></text> 3.320 + <text 3.321 + xml:space="preserve" 3.322 + style="font-size:12px;font-style:normal;font-weight:normal;fill:black;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Times New Roman" 3.323 + x="82.14286" 3.324 + y="580.08569" 3.325 + id="text3102"><tspan 3.326 + sodipodi:role="line" 3.327 + id="tspan3104" 3.328 + x="82.14286" 3.329 + y="580.08569">Filelogs</tspan></text> 3.330 + </g> 3.331 +</svg>