##// END OF EJS Templates
merge backout
Thomas Arendsen Hein -
r6142:50a277e6 merge default
parent child Browse files
Show More
This diff has been collapsed as it changes many lines, (624 lines changed) Show them Hide them
@@ -0,0 +1,624 b''
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <!-- Created with Inkscape (http://www.inkscape.org/) -->
3 <svg
4 xmlns:dc="http://purl.org/dc/elements/1.1/"
5 xmlns:cc="http://web.resource.org/cc/"
6 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
7 xmlns:svg="http://www.w3.org/2000/svg"
8 xmlns="http://www.w3.org/2000/svg"
9 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
10 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11 version="1.0"
12 width="100"
13 height="120"
14 viewBox="0 0 124.766 152.099"
15 id="Layer_1"
16 xml:space="preserve"
17 sodipodi:version="0.32"
18 inkscape:version="0.45.1"
19 sodipodi:docname="logo-droplets.svg"
20 sodipodi:docbase="/home/oxymoron/waste/selenic/public_html/hg-logo"
21 inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
22 id="metadata6845"><rdf:RDF><cc:Work
23 rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
24 rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>Mercurial &quot;droplets&quot; logo</dc:title><dc:creator><cc:Agent><dc:title>Cali Mastny and Matt Mackall</dc:title></cc:Agent></dc:creator><cc:license
25 rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /><dc:date>Feb 12 2008</dc:date></cc:Work><cc:License
26 rdf:about="http://creativecommons.org/licenses/GPL/2.0/"><cc:permits
27 rdf:resource="http://web.resource.org/cc/Reproduction" /><cc:permits
28 rdf:resource="http://web.resource.org/cc/Distribution" /><cc:requires
29 rdf:resource="http://web.resource.org/cc/Notice" /><cc:permits
30 rdf:resource="http://web.resource.org/cc/DerivativeWorks" /><cc:requires
31 rdf:resource="http://web.resource.org/cc/ShareAlike" /><cc:requires
32 rdf:resource="http://web.resource.org/cc/SourceCode" /></cc:License></rdf:RDF></metadata><sodipodi:namedview
33 inkscape:window-height="576"
34 inkscape:window-width="746"
35 inkscape:pageshadow="2"
36 inkscape:pageopacity="0.0"
37 guidetolerance="10.0"
38 gridtolerance="10.0"
39 objecttolerance="10.0"
40 borderopacity="1.0"
41 bordercolor="#666666"
42 pagecolor="#ffffff"
43 id="base"
44 inkscape:zoom="2.3216673"
45 inkscape:cx="4.1210694"
46 inkscape:cy="65.759396"
47 inkscape:window-x="377"
48 inkscape:window-y="398"
49 inkscape:current-layer="Layer_1"
50 width="100px"
51 height="120px"
52 units="px" /><defs
53 id="defs261" />
54 <pattern
55 overflow="visible"
56 viewBox="2.125 -70.896 69 69"
57 id="Polka_Dot_Pattern"
58 patternUnits="userSpaceOnUse"
59 height="69"
60 width="69"
61 y="736.415"
62 x="-316">
63 <g
64 id="g4">
65 <polygon
66 id="polygon6"
67 points="71.125,-1.896 2.125,-1.896 2.125,-70.896 71.125,-70.896 "
68 fill="none" />
69 <polygon
70 id="polygon8"
71 points="71.125,-1.896 2.125,-1.896 2.125,-70.896 71.125,-70.896 "
72 fill="#F7BC60" />
73 <g
74 id="g10">
75 <path
76 id="path12"
77 d="M61.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
78 fill="#FFFFFF" />
79 <path
80 id="path14"
81 d="M54.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
82 fill="#FFFFFF" />
83 <path
84 id="path16"
85 d="M46.439-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
86 fill="#FFFFFF" />
87 <path
88 id="path18"
89 d="M38.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
90 fill="#FFFFFF" />
91 <path
92 id="path20"
93 d="M31.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
94 fill="#FFFFFF" />
95 <path
96 id="path22"
97 d="M23.439-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
98 fill="#FFFFFF" />
99 <path
100 id="path24"
101 d="M15.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
102 fill="#FFFFFF" />
103 <path
104 id="path26"
105 d="M8.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
106 fill="#FFFFFF" />
107 <path
108 id="path28"
109 d="M0.439-71.653c0.018,0.072,0.008,0.127-0.026,0.19C0.361-71.362,0.3-71.4,0.248-71.335 c-0.051,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
110 fill="#FFFFFF" />
111 </g>
112 <g
113 id="g30">
114 <path
115 id="path32"
116 d="M69.439-71.653c0.018,0.072,0.008,0.127-0.026,0.19c-0.052,0.101-0.113,0.062-0.165,0.128 c-0.051,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
117 fill="#FFFFFF" />
118 </g>
119 <path
120 id="path34"
121 d="M0.495-71.653c0.018,0.072,0.008,0.127-0.026,0.19c-0.052,0.101-0.113,0.062-0.165,0.128 c-0.051,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224C0.5-71.68,0.503-71.744,0.51-71.626 c-0.021,0.011-0.021-0.005-0.03-0.025"
122 fill="#FFFFFF" />
123 <g
124 id="g36">
125 <g
126 id="g38">
127 <path
128 id="path40"
129 d="M69.439-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
130 fill="#FFFFFF" />
131 <path
132 id="path42"
133 d="M61.778-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
134 fill="#FFFFFF" />
135 <path
136 id="path44"
137 d="M54.118-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
138 fill="#FFFFFF" />
139 <path
140 id="path46"
141 d="M46.458-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
142 fill="#FFFFFF" />
143 <path
144 id="path48"
145 d="M38.797-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
146 fill="#FFFFFF" />
147 <path
148 id="path50"
149 d="M31.137-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
150 fill="#FFFFFF" />
151 <path
152 id="path52"
153 d="M23.477-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
154 fill="#FFFFFF" />
155 <path
156 id="path54"
157 d="M15.816-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
158 fill="#FFFFFF" />
159 <path
160 id="path56"
161 d="M8.156-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
162 fill="#FFFFFF" />
163 <path
164 id="path58"
165 d="M0.495-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143C2-61.45,2.217-61.397,2.391-61.46c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
166 fill="#FFFFFF" />
167 </g>
168 <g
169 id="g60">
170 <path
171 id="path62"
172 d="M69.439-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
173 fill="#FFFFFF" />
174 <path
175 id="path64"
176 d="M61.778-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
177 fill="#FFFFFF" />
178 <path
179 id="path66"
180 d="M54.118-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
181 fill="#FFFFFF" />
182 <path
183 id="path68"
184 d="M46.458-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
185 fill="#FFFFFF" />
186 <path
187 id="path70"
188 d="M38.797-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
189 fill="#FFFFFF" />
190 <path
191 id="path72"
192 d="M31.137-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
193 fill="#FFFFFF" />
194 <path
195 id="path74"
196 d="M23.477-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
197 fill="#FFFFFF" />
198 <path
199 id="path76"
200 d="M15.816-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
201 fill="#FFFFFF" />
202 <path
203 id="path78"
204 d="M8.156-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
205 fill="#FFFFFF" />
206 <path
207 id="path80"
208 d="M0.495-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-56.374,0.503-56.438,0.51-56.32 c-0.021,0.011-0.021-0.005-0.03-0.025"
209 fill="#FFFFFF" />
210 </g>
211 <g
212 id="g82">
213 <path
214 id="path84"
215 d="M69.439-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
216 fill="#FFFFFF" />
217 <path
218 id="path86"
219 d="M61.778-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
220 fill="#FFFFFF" />
221 <path
222 id="path88"
223 d="M54.118-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
224 fill="#FFFFFF" />
225 <path
226 id="path90"
227 d="M46.458-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
228 fill="#FFFFFF" />
229 <path
230 id="path92"
231 d="M38.797-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
232 fill="#FFFFFF" />
233 <path
234 id="path94"
235 d="M31.137-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
236 fill="#FFFFFF" />
237 <path
238 id="path96"
239 d="M23.477-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
240 fill="#FFFFFF" />
241 <path
242 id="path98"
243 d="M15.816-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
244 fill="#FFFFFF" />
245 <path
246 id="path100"
247 d="M8.156-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
248 fill="#FFFFFF" />
249 <path
250 id="path102"
251 d="M0.495-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
252 fill="#FFFFFF" />
253 </g>
254 <g
255 id="g104">
256 <path
257 id="path106"
258 d="M69.439-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
259 fill="#FFFFFF" />
260 <path
261 id="path108"
262 d="M61.778-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
263 fill="#FFFFFF" />
264 <path
265 id="path110"
266 d="M54.118-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
267 fill="#FFFFFF" />
268 <path
269 id="path112"
270 d="M46.458-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
271 fill="#FFFFFF" />
272 <path
273 id="path114"
274 d="M38.797-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
275 fill="#FFFFFF" />
276 <path
277 id="path116"
278 d="M31.137-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
279 fill="#FFFFFF" />
280 <path
281 id="path118"
282 d="M23.477-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
283 fill="#FFFFFF" />
284 <path
285 id="path120"
286 d="M15.816-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
287 fill="#FFFFFF" />
288 <path
289 id="path122"
290 d="M8.156-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 C8.15-41.004,8.149-41.02,8.14-41.04"
291 fill="#FFFFFF" />
292 <path
293 id="path124"
294 d="M0.495-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
295 fill="#FFFFFF" />
296 </g>
297 <g
298 id="g126">
299 <path
300 id="path128"
301 d="M69.439-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
302 fill="#FFFFFF" />
303 <path
304 id="path130"
305 d="M61.778-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
306 fill="#FFFFFF" />
307 <path
308 id="path132"
309 d="M54.118-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
310 fill="#FFFFFF" />
311 <path
312 id="path134"
313 d="M46.458-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
314 fill="#FFFFFF" />
315 <path
316 id="path136"
317 d="M38.797-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
318 fill="#FFFFFF" />
319 <path
320 id="path138"
321 d="M31.137-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
322 fill="#FFFFFF" />
323 <path
324 id="path140"
325 d="M23.477-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
326 fill="#FFFFFF" />
327 <path
328 id="path142"
329 d="M15.816-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
330 fill="#FFFFFF" />
331 <path
332 id="path144"
333 d="M8.156-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
334 fill="#FFFFFF" />
335 <path
336 id="path146"
337 d="M0.495-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-33.416,0.503-33.48,0.51-33.362 c-0.021,0.011-0.021-0.005-0.03-0.025"
338 fill="#FFFFFF" />
339 </g>
340 <g
341 id="g148">
342 <path
343 id="path150"
344 d="M69.439-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
345 fill="#FFFFFF" />
346 <path
347 id="path152"
348 d="M61.778-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
349 fill="#FFFFFF" />
350 <path
351 id="path154"
352 d="M54.118-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
353 fill="#FFFFFF" />
354 <path
355 id="path156"
356 d="M46.458-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
357 fill="#FFFFFF" />
358 <path
359 id="path158"
360 d="M38.797-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
361 fill="#FFFFFF" />
362 <path
363 id="path160"
364 d="M31.137-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
365 fill="#FFFFFF" />
366 <path
367 id="path162"
368 d="M23.477-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
369 fill="#FFFFFF" />
370 <path
371 id="path164"
372 d="M15.816-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
373 fill="#FFFFFF" />
374 <path
375 id="path166"
376 d="M8.156-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
377 fill="#FFFFFF" />
378 <path
379 id="path168"
380 d="M0.495-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
381 fill="#FFFFFF" />
382 </g>
383 <g
384 id="g170">
385 <path
386 id="path172"
387 d="M69.439-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
388 fill="#FFFFFF" />
389 <path
390 id="path174"
391 d="M61.778-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
392 fill="#FFFFFF" />
393 <path
394 id="path176"
395 d="M54.118-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
396 fill="#FFFFFF" />
397 <path
398 id="path178"
399 d="M46.458-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
400 fill="#FFFFFF" />
401 <path
402 id="path180"
403 d="M38.797-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
404 fill="#FFFFFF" />
405 <path
406 id="path182"
407 d="M31.137-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
408 fill="#FFFFFF" />
409 <path
410 id="path184"
411 d="M23.477-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
412 fill="#FFFFFF" />
413 <path
414 id="path186"
415 d="M15.816-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
416 fill="#FFFFFF" />
417 <path
418 id="path188"
419 d="M8.156-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
420 fill="#FFFFFF" />
421 <path
422 id="path190"
423 d="M0.495-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-18.11,0.503-18.175,0.51-18.057 c-0.021,0.011-0.021-0.005-0.03-0.025"
424 fill="#FFFFFF" />
425 </g>
426 <g
427 id="g192">
428 <path
429 id="path194"
430 d="M69.439-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362C69-9.692,69.159-9.523,69.154-9.4c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
431 fill="#FFFFFF" />
432 <path
433 id="path196"
434 d="M61.778-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
435 fill="#FFFFFF" />
436 <path
437 id="path198"
438 d="M54.118-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
439 fill="#FFFFFF" />
440 <path
441 id="path200"
442 d="M46.458-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
443 fill="#FFFFFF" />
444 <path
445 id="path202"
446 d="M38.797-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
447 fill="#FFFFFF" />
448 <path
449 id="path204"
450 d="M31.137-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
451 fill="#FFFFFF" />
452 <path
453 id="path206"
454 d="M23.477-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
455 fill="#FFFFFF" />
456 <path
457 id="path208"
458 d="M15.816-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053C17.933-7.969,17.839-8.227,18-8.34 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
459 fill="#FFFFFF" />
460 <path
461 id="path210"
462 d="M8.156-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 C7.915-10.05,7.866-9.836,7.886-9.75C7.717-9.692,7.876-9.523,7.871-9.4C7.868-9.351,7.83-9.295,7.826-9.239 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C9.114-7.652,9.321-7.799,9.48-7.837c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
463 fill="#FFFFFF" />
464 <path
465 id="path212"
466 d="M0.495-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 C0.254-10.05,0.205-9.836,0.225-9.75C0.056-9.692,0.215-9.523,0.21-9.4c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37C0.33-8.671,0.501-8.456,0.668-8.325c0.19,0.148,0.365,0.572,0.608,0.631 C1.454-7.652,1.66-7.799,1.819-7.837C2-7.88,2.217-7.827,2.391-7.89c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46C3.477-8.933,3.471-8.995,3.5-9.071 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
467 fill="#FFFFFF" />
468 </g>
469 </g>
470 <g
471 id="g214">
472 <path
473 id="path216"
474 d="M69.439-2.778c0.018,0.072,0.008,0.127-0.026,0.19C69.361-2.487,69.3-2.525,69.248-2.46 c-0.051,0.062-0.099,0.276-0.079,0.362C69-2.04,69.159-1.871,69.154-1.748c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C70.397,0,70.604-0.146,70.763-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
475 fill="#FFFFFF" />
476 <path
477 id="path218"
478 d="M61.778-2.778c0.018,0.072,0.007,0.127-0.026,0.19C61.7-2.487,61.64-2.525,61.587-2.46 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C62.737,0,62.943-0.146,63.103-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C61.915-3.117,61.78-3.02,61.781-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
479 fill="#FFFFFF" />
480 <path
481 id="path220"
482 d="M54.118-2.778c0.018,0.072,0.007,0.127-0.026,0.19C54.04-2.487,53.98-2.525,53.927-2.46 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C55.077,0,55.283-0.146,55.442-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C54.255-3.117,54.12-3.02,54.121-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
483 fill="#FFFFFF" />
484 <path
485 id="path222"
486 d="M46.458-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C47.416,0,47.623-0.146,47.782-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C46.594-3.117,46.459-3.02,46.46-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
487 fill="#FFFFFF" />
488 <path
489 id="path224"
490 d="M38.797-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C39.756,0,39.962-0.146,40.122-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C38.934-3.117,38.799-3.02,38.8-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
491 fill="#FFFFFF" />
492 <path
493 id="path226"
494 d="M31.137-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C32.095,0,32.302-0.146,32.461-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C31.273-3.117,31.139-3.02,31.14-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
495 fill="#FFFFFF" />
496 <path
497 id="path228"
498 d="M23.477-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C24.435,0,24.642-0.146,24.801-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
499 fill="#FFFFFF" />
500 <path
501 id="path230"
502 d="M15.816-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C16.774,0,16.981-0.146,17.14-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 C15.81-2.74,15.809-2.756,15.8-2.776"
503 fill="#FFFFFF" />
504 <path
505 id="path232"
506 d="M8.156-2.778c0.018,0.072,0.007,0.127-0.026,0.19C8.077-2.487,8.018-2.525,7.965-2.46 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35C7.868-1.698,7.83-1.643,7.826-1.587 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C9.114,0,9.321-0.146,9.48-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789C8.954-3.54,8.847-3.448,8.692-3.367 c-0.17,0.088-0.139,0.166-0.318,0.224C8.292-3.117,8.158-3.02,8.159-2.92C8.16-2.805,8.164-2.869,8.17-2.751 C8.15-2.74,8.149-2.756,8.14-2.776"
507 fill="#FFFFFF" />
508 <path
509 id="path234"
510 d="M0.495-2.778c0.018,0.072,0.008,0.127-0.026,0.19C0.417-2.487,0.356-2.525,0.304-2.46 C0.253-2.397,0.205-2.184,0.225-2.098C0.056-2.04,0.215-1.871,0.21-1.748c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37C0.33-1.019,0.501-0.804,0.668-0.673c0.19,0.148,0.365,0.572,0.608,0.631 C1.454,0,1.66-0.146,1.819-0.185C2-0.228,2.217-0.175,2.391-0.237c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46C3.477-1.28,3.471-1.343,3.5-1.419 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789C1.293-3.54,1.187-3.448,1.031-3.367 c-0.17,0.088-0.139,0.166-0.318,0.224C0.632-3.117,0.498-3.02,0.498-2.92C0.5-2.805,0.503-2.869,0.51-2.751 C0.489-2.74,0.488-2.756,0.479-2.776"
511 fill="#FFFFFF" />
512 </g>
513 </g>
514 </pattern>
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537 <rect
538 style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.97552931;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
539 id="rect6847"
540 width="124.77364"
541 height="150.12347"
542 x="0.31690097"
543 y="0.98776293" /><path
544 d="M 9.8480335,124.60683 C 11.62496,123.82337 13.513211,123.43203 15.327243,123.43203 C 17.067063,123.43203 18.177759,123.85879 18.806894,124.74937 C 20.139374,123.8596 21.953416,123.43203 23.360116,123.43203 C 27.581053,123.43203 27.728648,125.14068 27.728648,130.16028 L 27.728648,141.26547 C 27.728648,141.76382 27.802857,141.76382 25.692811,141.76382 L 25.692811,129.94606 C 25.692811,126.31544 25.618592,125.21154 23.213365,125.21154 C 22.139794,125.21154 21.029108,125.4603 19.844204,126.24379 L 19.844204,141.5142 C 19.807099,141.65677 19.732887,141.69215 19.474821,141.72758 C 19.436863,141.72758 19.400602,141.763 19.362653,141.763 L 17.807522,141.763 L 17.807522,129.94606 C 17.807522,126.45791 17.807522,125.17607 15.29098,125.17607 C 14.2174,125.17607 13.143818,125.38944 11.884705,125.99501 L 11.884705,141.26547 C 11.884705,141.76382 11.958925,141.76382 9.8488776,141.76382 L 9.8488776,124.60683 M 37.680118,123.43203 C 34.533596,123.43203 31.053954,124.32176 31.053954,133.8263 C 31.053954,141.15915 33.607611,142.29771 37.125192,142.29771 C 39.826435,142.29771 42.159131,141.40799 42.159131,140.98039 C 42.159131,140.44659 42.084921,139.62768 41.900221,139.16468 C 40.75243,139.94814 39.123081,140.37486 37.309893,140.37486 C 34.829612,140.37486 33.164001,139.66309 33.126052,134.14592 C 34.755402,134.14592 38.902128,134.11044 41.97444,133.50498 C 42.233351,132.33022 42.343821,130.62155 42.343821,129.12711 C 42.343821,125.56743 40.900016,123.43203 37.680118,123.43203 M 37.494584,125.21154 C 39.715955,125.21154 40.307995,126.67048 40.3451,129.51849 C 40.3451,130.26565 40.307995,131.15541 40.19667,132.00972 C 38.123729,132.50815 34.60612,132.50815 33.125209,132.50815 C 33.385806,126.0304 35.606333,125.21154 37.494584,125.21154 M 45.565397,124.99816 C 47.304384,123.85879 48.897464,123.43203 50.525969,123.43203 C 52.34,123.43203 53.191776,123.93046 53.191776,124.53602 C 53.191776,124.89187 53.079617,125.49742 52.894917,125.85331 C 52.376261,125.56823 51.785075,125.31945 50.821131,125.31945 C 49.637079,125.31945 48.526385,125.63909 47.638339,126.42255 L 47.638339,141.26632 C 47.638339,141.7647 47.675453,141.7647 45.565397,141.7647 L 45.565397,124.99816 M 64.254794,124.60683 C 64.254794,124.14383 62.700508,123.43203 61.145377,123.43203 C 58.145598,123.43203 54.481256,124.4643 54.481256,133.25617 C 54.481256,141.58507 56.70347,142.3331 60.589608,142.3331 C 62.514121,142.3331 64.254794,141.30089 64.254794,140.73161 C 64.254794,140.4111 64.181418,139.91269 63.99504,139.48515 C 63.217475,140.05441 62.033423,140.58905 60.775152,140.58905 C 58.11018,140.58905 56.55504,139.84185 56.55504,133.3633 C 56.55504,126.20837 59.108698,125.21154 61.330069,125.21154 C 62.58834,125.21154 63.291694,125.56743 63.99504,126.0304 C 64.181418,125.60367 64.254794,124.99816 64.254794,124.60683 M 78.435657,141.15915 C 76.806308,141.97803 74.659991,142.29851 72.808845,142.29851 C 68.070088,142.29851 67.366733,140.30571 67.366733,135.57114 L 67.366733,124.42971 C 67.366733,123.96757 67.330471,123.96757 69.440527,123.96757 L 69.440527,135.7854 C 69.440527,139.34513 69.958338,140.55538 72.734626,140.55538 C 73.808215,140.55538 75.289126,140.34199 76.399811,139.70105 L 76.399811,124.43056 C 76.399811,123.96839 76.325602,123.96839 78.435657,123.96839 L 78.435657,141.15915 M 82.657438,124.99816 C 84.396406,123.85879 85.98865,123.43203 87.617156,123.43203 C 89.431178,123.43203 90.282962,123.93046 90.282962,124.53602 C 90.282962,124.89187 90.171639,125.49742 89.986938,125.85331 C 89.468283,125.56823 88.876272,125.31945 87.913163,125.31945 C 86.729111,125.31945 85.618415,125.63909 84.729535,126.42255 L 84.729535,141.26632 C 84.729535,141.7647 84.767484,141.7647 82.657438,141.7647 L 82.657438,124.99816 M 95.036045,123.9659 C 93.406714,123.9659 92.926008,123.9659 92.926008,124.92729 L 92.926008,141.76382 C 94.99895,141.76382 95.036045,141.76382 95.036045,141.26547 L 95.036045,123.9659 M 92.851787,117.70149 C 92.851787,118.87629 93.222023,119.30304 93.961631,119.33843 C 94.813415,119.33843 95.220746,118.73376 95.220746,117.66526 C 95.257851,116.56214 94.960991,116.06374 94.11006,116.06374 C 93.296243,116.06374 92.888893,116.66926 92.851787,117.70149 M 98.547748,124.99816 C 98.547748,124.60683 98.62196,124.39264 98.770389,124.28635 C 99.473743,123.89502 102.17666,123.43203 105.24898,123.43203 C 107.58166,123.43203 109.06174,124.53602 109.06174,127.73899 L 109.06174,130.05231 C 109.06174,136.38835 108.87704,141.12293 108.87704,141.12293 C 108.02528,141.58507 106.43387,142.29771 103.84143,142.29771 C 101.17646,142.3331 98.511478,142.0843 98.511478,136.81596 C 98.511478,131.7972 101.25067,131.01375 103.98986,131.01375 C 105.02633,131.01375 106.24834,131.12082 107.06301,131.4413 C 107.06301,131.4413 107.06301,129.12711 107.06301,128.13033 C 107.06301,125.81704 105.87895,125.31862 104.47141,125.31862 C 102.58399,125.31862 99.956127,125.67451 98.808337,126.20837 C 98.585707,125.81704 98.547748,125.21154 98.547748,124.99816 M 107.06216,132.9011 C 106.35882,132.65147 105.35945,132.54522 104.65609,132.54522 C 102.54604,132.54522 100.62069,132.97198 100.62069,136.88763 C 100.62069,140.55363 102.21293,140.58991 104.10032,140.58991 C 105.28522,140.58991 106.47014,140.26946 106.87663,139.84271 C 106.87747,139.84185 107.06216,135.57029 107.06216,132.9011 M 114.91792,141.26547 C 114.91792,141.76382 114.95503,141.76382 112.88124,141.76382 L 112.88124,116.56214 C 112.88124,115.60073 113.28857,115.60073 114.91792,115.60073 L 114.91792,141.26547"
545 style="fill:#010101;stroke-width:2.02999997;stroke-miterlimit:4;stroke-dasharray:none"
546 id="text2611" /><g
547 transform="matrix(0.9351326,0,0,0.9351326,150.39508,-1.251766)"
548 id="g4503"
549 style="opacity:1"><path
550 d="M -45.749655,92.691592 C -25.709638,59.370739 -49.98206,5.3291313 -94.363693,10.819389 C -134.46337,15.776665 -135.10949,57.983708 -99.76917,68.010455 C -69.186498,76.695132 -93.451029,96.093536 -92.742037,109.01138 C -92.030055,121.92728 -66.155038,126.61324 -45.749655,92.691592 z "
551 style="fill:#1b1a1b"
552 id="path2339" /><circle
553 cx="33.728001"
554 cy="85.363998"
555 r="15.414"
556 transform="matrix(1.0917947,-0.2858168,0.2858168,1.0917947,-180.30817,13.494135)"
557 style="fill:#1b1a1b"
558 id="circle2341"
559 sodipodi:cx="33.728001"
560 sodipodi:cy="85.363998"
561 sodipodi:rx="15.414"
562 sodipodi:ry="15.414" /><path
563 d="M -140.06215,48.935849 C -146.31997,49.541603 -150.90082,55.100456 -150.29507,61.358275 C -149.68817,67.620461 -144.12955,72.20487 -137.87064,71.59883 C -131.61373,70.985148 -127.02904,65.427621 -127.63726,59.169282 C -128.24543,52.915596 -133.80324,48.329809 -140.06215,48.935849 z "
564 style="fill:#1b1a1b"
565 id="path2343" /><path
566 d="M -44.99294,91.339709 C -24.951831,58.018571 -49.224253,3.976963 -93.605885,9.4672202 C -133.70556,14.424496 -134.35249,56.632918 -99.012168,66.659664 C -68.429497,75.344341 -92.694028,94.742745 -91.984749,107.66168 C -91.271961,120.5762 -65.398322,125.26135 -44.99294,91.339709 z "
567 style="fill:#bfbfbf"
568 id="path2561" /><path
569 d="M -86.84228,112.75985 C -88.056751,110.79004 -86.19955,108.60176 -84.290569,108.76815 C -81.251858,109.03428 -74.635637,108.73252 -69.415044,105.77341 C -56.372412,98.379694 -36.300952,62.803704 -46.395841,40.365295 C -50.915249,30.320886 -53.115898,27.444964 -57.770162,22.531645 C -58.719625,21.529587 -58.174556,21.584053 -57.531623,21.923221 C -55.014762,23.244092 -50.592026,28.36035 -46.055478,36.687677 C -38.390628,50.757116 -38.788117,67.483141 -41.638835,77.975343 C -43.624548,85.27439 -50.464117,101.78644 -60.480639,108.92577 C -70.5197,116.0815 -82.266433,120.18559 -86.84228,112.75985 z "
570 style="fill:#000000"
571 id="path2563" /><path
572 d="M -95.930347,66.591355 C -102.76341,64.562985 -111.57238,61.738267 -116.66758,55.073789 C -120.42371,50.15984 -122.3305,44.796759 -122.81745,41.755703 C -122.99069,40.670602 -123.13785,39.765332 -122.82526,39.515509 C -122.68064,39.399486 -120.02045,45.412302 -116.04367,50.451645 C -112.06769,55.492366 -106.51047,58.440379 -101.88092,59.511496 C -97.763206,60.46345 -89.233623,62.555175 -86.347769,65.013729 C -83.380949,67.540918 -83.133309,73.00119 -84.131664,73.617197 C -85.138469,74.236583 -87.180025,69.187603 -95.930347,66.591355 z "
573 style="fill:#000000"
574 id="path2565" /><path
575 d="M -81.840812,113.72311 C -81.972699,115.28707 -80.176315,115.59377 -77.75828,115.23141 C -74.658947,114.76654 -72.037923,114.41754 -68.470623,112.62971 C -63.63582,110.20674 -58.742752,106.74072 -55.159223,102.06476 C -44.467444,88.115271 -40.681354,71.610444 -41.264404,69.236185 C -41.459242,71.196944 -44.040349,81.489071 -49.943268,90.767882 C -57.52457,102.68631 -63.022197,109.03464 -75.701416,112.1124 C -79.230011,112.96964 -81.668137,111.66432 -81.840812,113.72311 z "
576 style="fill:#ffffff"
577 id="path2567" /><path
578 d="M -109.96233,59.479354 C -108.51822,60.704238 -105.55938,62.336389 -99.737455,64.245644 C -92.705873,66.551032 -89.282274,68.550326 -87.848506,69.508429 C -86.329222,70.525809 -85.366279,72.795951 -85.27115,70.779631 C -85.17194,68.761076 -86.416123,67.025373 -89.192166,66.104839 C -91.070345,65.481234 -94.229847,63.996111 -97.258539,63.398373 C -99.204694,63.014221 -102.37098,62.251845 -105.08636,61.420426 C -106.57454,60.963046 -108.09089,60.161888 -109.96233,59.479354 z "
579 style="fill:#ffffff"
580 id="path2569" /><circle
581 cx="34.681"
582 cy="84.375"
583 r="15.414"
584 transform="matrix(1.0917947,-0.2858168,0.2858168,1.0917947,-180.30817,13.494135)"
585 style="fill:#bfbfbf"
586 id="circle2577"
587 sodipodi:cx="34.681"
588 sodipodi:cy="84.375"
589 sodipodi:rx="15.414"
590 sodipodi:ry="15.414" /><path
591 d="M -128.68413,108.37945 C -115.15301,120.91784 -94.786007,103.69471 -103.75445,88.482597 C -104.76154,86.774656 -106.06907,85.474351 -105.63906,86.782721 C -102.77288,95.529828 -105.42141,102.44941 -110.3632,106.01451 C -115.20857,109.5112 -121.86847,110.09622 -127.20028,107.33186 C -128.76601,106.5203 -129.41538,107.70291 -128.68413,108.37945 z "
592 style="fill:#000000"
593 id="path2579" /><path
594 d="M -118.06686,110.95477 C -116.34413,110.59244 -106.32442,107.99742 -103.97055,99.756195 C -103.23743,97.186709 -103.1058,97.702893 -103.31295,99.095232 C -104.37035,106.20143 -111.08741,111.44338 -116.80312,111.63773 C -117.963,111.75704 -119.48484,111.25131 -118.06686,110.95477 z "
595 style="fill:#ffffff"
596 id="path2585" /><path
597 d="M -139.30435,47.583681 C -145.56216,48.189435 -150.14301,53.748288 -149.53726,60.006106 C -148.93065,66.2672 -143.37174,70.852702 -137.11392,70.246948 C -130.85592,69.632979 -126.27151,64.074361 -126.88083,57.816308 C -127.48791,51.562336 -133.04544,46.977641 -139.30435,47.583681 z "
598 style="fill:#bfbfbf"
599 id="path2589" /><path
600 d="M -144.46878,67.571208 C -144.39939,68.375508 -143.29781,69.408789 -141.56718,69.883196 C -140.08038,70.290771 -136.24758,71.332594 -131.32372,68.224839 C -126.39986,65.117084 -125.8321,56.804464 -128.07041,54.35955 C -128.76326,53.121154 -129.66426,52.21957 -128.94737,54.195974 C -127.13695,59.186468 -130.65487,63.854586 -133.68917,66.0162 C -136.72238,68.177528 -140.56932,67.154692 -142.14014,66.675779 C -143.71095,66.196867 -144.53929,66.740369 -144.46878,67.571208 z "
601 style="fill:#000000"
602 id="path2591" /><path
603 d="M -138.11472,68.687851 C -137.66344,68.281557 -135.37889,68.447629 -133.31622,67.338341 C -131.25464,66.229338 -128.80419,63.798254 -128.36692,60.343756 C -128.10933,58.315237 -128.03197,58.824631 -127.92942,59.929403 C -128.24939,65.67243 -133.53086,68.844638 -136.55132,69.263202 C -137.36636,69.376239 -138.8007,69.307247 -138.11472,68.687851 z "
604 style="fill:#ffffff"
605 id="path2597" /><path
606 d="M -47.767489,69.693822 C -39.234739,45.099506 -57.090457,7.9576459 -93.212919,12.425552 C -125.85191,16.461012 -126.37823,50.814524 -97.613495,58.976486 C -65.031338,63.908526 -84.650966,88.487524 -87.434101,100.88229 C -89.929232,111.99304 -61.102889,113.82164 -47.767489,69.693822 z "
607 style="fill:#999999"
608 id="path2561_1_" /><path
609 d="M -70.093288,88.904346 C -78.920045,87.812046 -91.622267,107.74061 -79.645446,105.40671 C -67.670523,103.07448 -91.622267,107.74061 -79.645446,105.40671 C -73.888849,104.55302 -69.119803,102.52058 -64.850547,97.64761 C -59.283982,91.295233 -50.968477,77.5735 -48.563483,68.707586 C -46.537563,61.232354 -47.555881,49.650767 -49.644305,60.532553 C -51.786232,71.700167 -61.266532,89.996647 -70.093288,88.904346 z "
610 style="fill:#f3f3f3"
611 id="path2571" /><path
612 d="M -129.3854,104.84502 C -127.34184,104.87935 -126.10573,105.16706 -124.03635,106.61908 C -119.94568,108.31891 -112.42648,107.24179 -108.9543,102.67081 C -105.48212,98.099823 -105.36811,91.801741 -106.69103,87.996073 C -109.92728,78.682039 -123.67593,78.846722 -129.81795,86.579362 C -136.46216,95.2146 -131.42897,104.81069 -129.3854,104.84502 z "
613 style="fill:#999999"
614 id="path2581" /><path
615 d="M -147.63565,61.683628 C -147.22833,62.966318 -146.18754,64.837882 -143.9897,65.149887 C -141.05481,65.566524 -140.45479,66.892551 -136.9892,66.204631 C -133.52361,65.516711 -130.89674,62.676625 -129.84557,59.535064 C -128.64212,55.188187 -130.44406,52.944024 -133.15599,50.940416 C -135.86791,48.936808 -141.83359,49.152263 -145.3938,52.39768 C -147.92393,54.702631 -148.62733,58.560726 -147.63565,61.683628 z "
616 style="fill:#999999"
617 id="path2593_2_" /><path
618 d="M -136.11009,64.55822 C -133.44721,63.861113 -129.92545,60.232613 -131.67381,57.462279 C -133.83086,54.048798 -139.84051,56.970651 -140.04374,60.77103 C -140.24777,64.572786 -138.93238,65.297057 -136.11009,64.55822 z "
619 style="fill:#f3f3f3"
620 id="path256" /><path
621 d="M -116.11512,105.50904 C -113.8431,104.91425 -106.88259,102.0818 -108.18994,91.962983 C -108.85161,86.83742 -111.64725,98.324328 -116.82409,100.04237 C -124.66721,102.64507 -123.78607,107.51719 -116.11512,105.50904 z "
622 style="fill:#f3f3f3"
623 id="path258" /></g>
624 </svg> No newline at end of file
@@ -0,0 +1,50 b''
1 # Some default global settings for common merge tools
2
3 [merge-tools]
4 kdiff3.args=--auto -L1 base --L2 local --L3 other $base $local $other -o $output
5 kdiff3.regkey=Software\KDiff3
6 kdiff3.regappend=\kdiff3.exe
7 kdiff3.fixeol=True
8 kdiff3.gui=True
9
10 gvimdiff.args=--nofork -d -g -O $local $other $base
11 gvimdiff.regkey=Software\Vim\GVim
12 gvimdiff.regname=path
13 gvimdiff.priority=-9
14
15 merge.checkconflicts=True
16 merge.priority=-10
17
18 gpyfm.gui=True
19
20 meld.gui=True
21
22 tkdiff.args=$local $other -a $base -o $output
23 tkdiff.gui=True
24 tkdiff.priority=-8
25
26 xxdiff.args=--show-merged-pane --exit-with-merge-status --title1 local --title2 base --title3 other --merged-filename $output --merge $local $base $other
27 xxdiff.gui=True
28 xxdiff.priority=-8
29
30 diffmerge.args=--nosplash --merge --title1=base --title2=local --title3=other $base $local $other
31 diffmerge.checkchanged=True
32 diffmerge.gui=True
33
34 p4merge.args=$base $local $other $output
35 p4merge.regkey=Software\Perforce\Environment
36 p4merge.regname=P4INSTROOT
37 p4merge.regappend=\p4merge.exe
38 p4merge.gui=True
39 p4merge.priority=-8
40
41 tortoisemerge.args=/base: $output /mine:$local /theirs:$other /merged:$output
42 tortoisemerge.regkey=Software\TortoiseSVN
43 tortoisemerge.gui=True
44
45 ecmerge.args=$base $local $other --mode=merge3 --title0=base --title1=local --title2=other --to=$output
46 ecmerge.regkey=Software\Elli\xc3\xa9 Computing\Merge
47 ecmerge.gui=True
48
49 filemerge.args=-left $other -right $local -ancestor $base -merge $output
50 filemerge.gui=True
@@ -0,0 +1,301 b''
1 # GNU Arch support for the convert extension
2
3 from common import NoRepo, checktool, commandline, commit, converter_source
4 from mercurial.i18n import _
5 from mercurial import util
6 import os, shutil, tempfile, stat
7
8 class gnuarch_source(converter_source, commandline):
9
10 class gnuarch_rev:
11 def __init__(self, rev):
12 self.rev = rev
13 self.summary = ''
14 self.date = None
15 self.author = ''
16 self.add_files = []
17 self.mod_files = []
18 self.del_files = []
19 self.ren_files = {}
20 self.ren_dirs = {}
21
22 def __init__(self, ui, path, rev=None):
23 super(gnuarch_source, self).__init__(ui, path, rev=rev)
24
25 if not os.path.exists(os.path.join(path, '{arch}')):
26 raise NoRepo(_("%s does not look like a GNU Arch repo" % path))
27
28 # Could use checktool, but we want to check for baz or tla.
29 self.execmd = None
30 if util.find_exe('baz'):
31 self.execmd = 'baz'
32 else:
33 if util.find_exe('tla'):
34 self.execmd = 'tla'
35 else:
36 raise util.Abort(_('cannot find a GNU Arch tool'))
37
38 commandline.__init__(self, ui, self.execmd)
39
40 self.path = os.path.realpath(path)
41 self.tmppath = None
42
43 self.treeversion = None
44 self.lastrev = None
45 self.changes = {}
46 self.parents = {}
47 self.tags = {}
48 self.modecache = {}
49
50 def before(self):
51 if self.execmd == 'tla':
52 output = self.run0('tree-version', self.path)
53 else:
54 output = self.run0('tree-version', '-d', self.path)
55 self.treeversion = output.strip()
56
57 self.ui.status(_('analyzing tree version %s...\n' % self.treeversion))
58
59 # Get name of temporary directory
60 version = self.treeversion.split('/')
61 self.tmppath = os.path.join(tempfile.gettempdir(),
62 'hg-%s' % version[1])
63
64 # Generate parents dictionary
65 child = []
66 output, status = self.runlines('revisions', self.treeversion)
67 self.checkexit(status, 'archive registered?')
68 for l in output:
69 rev = l.strip()
70 self.changes[rev] = self.gnuarch_rev(rev)
71
72 # Read author, date and summary
73 catlog = self.runlines0('cat-log', '-d', self.path, rev)
74 self._parsecatlog(catlog, rev)
75
76 self.parents[rev] = child
77 child = [rev]
78 if rev == self.rev:
79 break
80 self.parents[None] = child
81
82 def after(self):
83 self.ui.debug(_('cleaning up %s\n' % self.tmppath))
84 shutil.rmtree(self.tmppath, ignore_errors=True)
85
86 def getheads(self):
87 return self.parents[None]
88
89 def getfile(self, name, rev):
90 if rev != self.lastrev:
91 raise util.Abort(_('internal calling inconsistency'))
92
93 # Raise IOError if necessary (i.e. deleted files).
94 if not os.path.exists(os.path.join(self.tmppath, name)):
95 raise IOError
96
97 data, mode = self._getfile(name, rev)
98 self.modecache[(name, rev)] = mode
99
100 return data
101
102 def getmode(self, name, rev):
103 return self.modecache[(name, rev)]
104
105 def getchanges(self, rev):
106 self.modecache = {}
107 self._update(rev)
108 changes = []
109 copies = {}
110
111 for f in self.changes[rev].add_files:
112 changes.append((f, rev))
113
114 for f in self.changes[rev].mod_files:
115 changes.append((f, rev))
116
117 for f in self.changes[rev].del_files:
118 changes.append((f, rev))
119
120 for src in self.changes[rev].ren_files:
121 to = self.changes[rev].ren_files[src]
122 changes.append((src, rev))
123 changes.append((to, rev))
124 copies[src] = to
125
126 for src in self.changes[rev].ren_dirs:
127 to = self.changes[rev].ren_dirs[src]
128 chgs, cps = self._rendirchanges(src, to);
129 changes += [(f, rev) for f in chgs]
130 for c in cps:
131 copies[c] = cps[c]
132
133 changes.sort()
134 self.lastrev = rev
135
136 return changes, copies
137
138 def getcommit(self, rev):
139 changes = self.changes[rev]
140 return commit(author = changes.author, date = changes.date,
141 desc = changes.summary, parents = self.parents[rev])
142
143 def gettags(self):
144 return self.tags
145
146 def _execute(self, cmd, *args, **kwargs):
147 cmdline = [self.execmd, cmd]
148 cmdline += args
149 cmdline = [util.shellquote(arg) for arg in cmdline]
150 cmdline += ['>', util.nulldev, '2>', util.nulldev]
151 cmdline = util.quotecommand(' '.join(cmdline))
152 self.ui.debug(cmdline, '\n')
153 return os.system(cmdline)
154
155 def _update(self, rev):
156 if rev == 'base-0':
157 # Initialise 'base-0' revision
158 self._obtainrevision(rev)
159 else:
160 self.ui.debug(_('applying revision %s...\n' % rev))
161 revision = '%s--%s' % (self.treeversion, rev)
162 changeset, status = self.runlines('replay', '-d', self.tmppath,
163 revision)
164 if status:
165 # Something went wrong while merging (baz or tla
166 # issue?), get latest revision and try from there
167 shutil.rmtree(self.tmppath, ignore_errors=True)
168 self._obtainrevision(rev)
169 else:
170 old_rev = self.parents[rev][0]
171 self.ui.debug(_('computing changeset between %s and %s...\n' \
172 % (old_rev, rev)))
173 rev_a = '%s--%s' % (self.treeversion, old_rev)
174 rev_b = '%s--%s' % (self.treeversion, rev)
175 self._parsechangeset(changeset, rev)
176
177 def _getfile(self, name, rev):
178 mode = os.lstat(os.path.join(self.tmppath, name)).st_mode
179 if stat.S_ISLNK(mode):
180 data = os.readlink(os.path.join(self.tmppath, name))
181 mode = mode and 'l' or ''
182 else:
183 data = open(os.path.join(self.tmppath, name), 'rb').read()
184 mode = (mode & 0111) and 'x' or ''
185 return data, mode
186
187 def _exclude(self, name):
188 exclude = [ '{arch}', '.arch-ids', '.arch-inventory' ]
189 for exc in exclude:
190 if name.find(exc) != -1:
191 return True
192 return False
193
194 def _readcontents(self, path):
195 files = []
196 contents = os.listdir(path)
197 while len(contents) > 0:
198 c = contents.pop()
199 p = os.path.join(path, c)
200 # os.walk could be used, but here we avoid internal GNU
201 # Arch files and directories, thus saving a lot time.
202 if not self._exclude(p):
203 if os.path.isdir(p):
204 contents += [os.path.join(c, f) for f in os.listdir(p)]
205 else:
206 files.append(c)
207 return files
208
209 def _rendirchanges(self, src, dest):
210 changes = []
211 copies = {}
212 files = self._readcontents(os.path.join(self.tmppath, dest))
213 for f in files:
214 s = os.path.join(src, f)
215 d = os.path.join(dest, f)
216 changes.append(s)
217 changes.append(d)
218 copies[s] = d
219 return changes, copies
220
221 def _obtainrevision(self, rev):
222 self.ui.debug(_('obtaining revision %s...\n' % rev))
223 revision = '%s--%s' % (self.treeversion, rev)
224 output = self._execute('get', revision, self.tmppath)
225 self.checkexit(output)
226 self.ui.debug(_('analysing revision %s...\n' % rev))
227 files = self._readcontents(self.tmppath)
228 self.changes[rev].add_files += files
229
230 def _stripbasepath(self, path):
231 if path.startswith('./'):
232 return path[2:]
233 return path
234
235 def _parsecatlog(self, data, rev):
236 summary = []
237 for l in data:
238 l = l.strip()
239 if summary:
240 summary.append(l)
241 elif l.startswith('Summary:'):
242 summary.append(l[len('Summary: '):])
243 elif l.startswith('Standard-date:'):
244 date = l[len('Standard-date: '):]
245 strdate = util.strdate(date, '%Y-%m-%d %H:%M:%S')
246 self.changes[rev].date = util.datestr(strdate)
247 elif l.startswith('Creator:'):
248 self.changes[rev].author = l[len('Creator: '):]
249 self.changes[rev].summary = '\n'.join(summary)
250
251 def _parsechangeset(self, data, rev):
252 for l in data:
253 l = l.strip()
254 # Added file (ignore added directory)
255 if l.startswith('A') and not l.startswith('A/'):
256 file = self._stripbasepath(l[1:].strip())
257 if not self._exclude(file):
258 self.changes[rev].add_files.append(file)
259 # Deleted file (ignore deleted directory)
260 elif l.startswith('D') and not l.startswith('D/'):
261 file = self._stripbasepath(l[1:].strip())
262 if not self._exclude(file):
263 self.changes[rev].del_files.append(file)
264 # Modified binary file
265 elif l.startswith('Mb'):
266 file = self._stripbasepath(l[2:].strip())
267 if not self._exclude(file):
268 self.changes[rev].mod_files.append(file)
269 # Modified link
270 elif l.startswith('M->'):
271 file = self._stripbasepath(l[3:].strip())
272 if not self._exclude(file):
273 self.changes[rev].mod_files.append(file)
274 # Modified file
275 elif l.startswith('M'):
276 file = self._stripbasepath(l[1:].strip())
277 if not self._exclude(file):
278 self.changes[rev].mod_files.append(file)
279 # Renamed file (or link)
280 elif l.startswith('=>'):
281 files = l[2:].strip().split(' ')
282 if len(files) == 1:
283 files = l[2:].strip().split('\t')
284 src = self._stripbasepath(files[0])
285 dst = self._stripbasepath(files[1])
286 if not self._exclude(src) and not self._exclude(dst):
287 self.changes[rev].ren_files[src] = dst
288 # Conversion from file to link or from link to file (modified)
289 elif l.startswith('ch'):
290 file = self._stripbasepath(l[2:].strip())
291 if not self._exclude(file):
292 self.changes[rev].mod_files.append(file)
293 # Renamed directory
294 elif l.startswith('/>'):
295 dirs = l[2:].strip().split(' ')
296 if len(dirs) == 1:
297 dirs = l[2:].strip().split('\t')
298 src = self._stripbasepath(dirs[0])
299 dst = self._stripbasepath(dirs[1])
300 if not self._exclude(src) and not self._exclude(dst):
301 self.changes[rev].ren_dirs[src] = dst
@@ -0,0 +1,217 b''
1 # filemerge.py - file-level merge handling for Mercurial
2 #
3 # Copyright 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
4 #
5 # This software may be used and distributed according to the terms
6 # of the GNU General Public License, incorporated herein by reference.
7
8 from node import *
9 from i18n import _
10 import util, os, tempfile, context, simplemerge, re, filecmp
11
12 def _toolstr(ui, tool, part, default=""):
13 return ui.config("merge-tools", tool + "." + part, default)
14
15 def _toolbool(ui, tool, part, default=False):
16 return ui.configbool("merge-tools", tool + "." + part, default)
17
18 def _findtool(ui, tool):
19 k = _toolstr(ui, tool, "regkey")
20 if k:
21 p = util.lookup_reg(k, _toolstr(ui, tool, "regname"))
22 if p:
23 p = util.find_exe(p + _toolstr(ui, tool, "regappend"))
24 if p:
25 return p
26 return util.find_exe(_toolstr(ui, tool, "executable", tool))
27
28 def _picktool(repo, ui, path, binary, symlink):
29 def check(tool, pat, symlink, binary):
30 tmsg = tool
31 if pat:
32 tmsg += " specified for " + pat
33 if pat and not _findtool(ui, tool): # skip search if not matching
34 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
35 elif symlink and not _toolbool(ui, tool, "symlink"):
36 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
37 elif binary and not _toolbool(ui, tool, "binary"):
38 ui.warn(_("tool %s can't handle binary\n") % tmsg)
39 elif not util.gui() and _toolbool(ui, tool, "gui"):
40 ui.warn(_("tool %s requires a GUI\n") % tmsg)
41 else:
42 return True
43 return False
44
45 # HGMERGE takes precedence
46 hgmerge = os.environ.get("HGMERGE")
47 if hgmerge:
48 return (hgmerge, hgmerge)
49
50 # then patterns
51 for pat, tool in ui.configitems("merge-patterns"):
52 mf = util.matcher(repo.root, "", [pat], [], [])[1]
53 if mf(path) and check(tool, pat, symlink, False):
54 toolpath = _findtool(ui, tool)
55 return (tool, '"' + toolpath + '"')
56
57 # then merge tools
58 tools = {}
59 for k,v in ui.configitems("merge-tools"):
60 t = k.split('.')[0]
61 if t not in tools:
62 tools[t] = int(_toolstr(ui, t, "priority", "0"))
63 names = tools.keys()
64 tools = [(-p,t) for t,p in tools.items()]
65 tools.sort()
66 uimerge = ui.config("ui", "merge")
67 if uimerge:
68 if uimerge not in names:
69 return (uimerge, uimerge)
70 tools.insert(0, (None, uimerge)) # highest priority
71 tools.append((None, "hgmerge")) # the old default, if found
72 for p,t in tools:
73 toolpath = _findtool(ui, t)
74 if toolpath and check(t, None, symlink, binary):
75 return (t, '"' + toolpath + '"')
76 # internal merge as last resort
77 return (not (symlink or binary) and "internal:merge" or None, None)
78
79 def _eoltype(data):
80 "Guess the EOL type of a file"
81 if '\0' in data: # binary
82 return None
83 if '\r\n' in data: # Windows
84 return '\r\n'
85 if '\r' in data: # Old Mac
86 return '\r'
87 if '\n' in data: # UNIX
88 return '\n'
89 return None # unknown
90
91 def _matcheol(file, origfile):
92 "Convert EOL markers in a file to match origfile"
93 tostyle = _eoltype(open(origfile, "rb").read())
94 if tostyle:
95 data = open(file, "rb").read()
96 style = _eoltype(data)
97 if style:
98 newdata = data.replace(style, tostyle)
99 if newdata != data:
100 open(file, "wb").write(newdata)
101
102 def filemerge(repo, fw, fd, fo, wctx, mctx):
103 """perform a 3-way merge in the working directory
104
105 fw = original filename in the working directory
106 fd = destination filename in the working directory
107 fo = filename in other parent
108 wctx, mctx = working and merge changecontexts
109 """
110
111 def temp(prefix, ctx):
112 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
113 (fd, name) = tempfile.mkstemp(prefix=pre)
114 data = repo.wwritedata(ctx.path(), ctx.data())
115 f = os.fdopen(fd, "wb")
116 f.write(data)
117 f.close()
118 return name
119
120 def isbin(ctx):
121 try:
122 return util.binary(ctx.data())
123 except IOError:
124 return False
125
126 fco = mctx.filectx(fo)
127 if not fco.cmp(wctx.filectx(fd).data()): # files identical?
128 return None
129
130 ui = repo.ui
131 fcm = wctx.filectx(fw)
132 fca = fcm.ancestor(fco) or repo.filectx(fw, fileid=nullrev)
133 binary = isbin(fcm) or isbin(fco) or isbin(fca)
134 symlink = fcm.islink() or fco.islink()
135 tool, toolpath = _picktool(repo, ui, fw, binary, symlink)
136 ui.debug(_("picked tool '%s' for %s (binary %s symlink %s)\n") %
137 (tool, fw, binary, symlink))
138
139 if not tool:
140 tool = "internal:local"
141 if ui.prompt(_(" no tool found to merge %s\n"
142 "keep (l)ocal or take (o)ther?") % fw,
143 _("[lo]"), _("l")) != _("l"):
144 tool = "internal:other"
145 if tool == "internal:local":
146 return 0
147 if tool == "internal:other":
148 repo.wwrite(fd, fco.data(), fco.fileflags())
149 return 0
150 if tool == "internal:fail":
151 return 1
152
153 # do the actual merge
154 a = repo.wjoin(fd)
155 b = temp("base", fca)
156 c = temp("other", fco)
157 out = ""
158 back = a + ".orig"
159 util.copyfile(a, back)
160
161 if fw != fo:
162 repo.ui.status(_("merging %s and %s\n") % (fw, fo))
163 else:
164 repo.ui.status(_("merging %s\n") % fw)
165 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
166
167 # do we attempt to simplemerge first?
168 if _toolbool(ui, tool, "premerge", not (binary or symlink)):
169 r = simplemerge.simplemerge(a, b, c, quiet=True)
170 if not r:
171 ui.debug(_(" premerge successful\n"))
172 os.unlink(back)
173 os.unlink(b)
174 os.unlink(c)
175 return 0
176 util.copyfile(back, a) # restore from backup and try again
177
178 env = dict(HG_FILE=fd,
179 HG_MY_NODE=str(wctx.parents()[0]),
180 HG_OTHER_NODE=str(mctx),
181 HG_MY_ISLINK=fcm.islink(),
182 HG_OTHER_ISLINK=fco.islink(),
183 HG_BASE_ISLINK=fca.islink())
184
185 if tool == "internal:merge":
186 r = simplemerge.simplemerge(a, b, c, label=['local', 'other'])
187 else:
188 args = _toolstr(ui, tool, "args", '$local $base $other')
189 if "$output" in args:
190 out, a = a, back # read input from backup, write to original
191 replace = dict(local=a, base=b, other=c, output=out)
192 args = re.sub("\$(local|base|other|output)",
193 lambda x: '"%s"' % replace[x.group()[1:]], args)
194 r = util.system(toolpath + ' ' + args, cwd=repo.root, environ=env)
195
196 if not r and _toolbool(ui, tool, "checkconflicts"):
197 if re.match("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcm.data()):
198 r = 1
199
200 if not r and _toolbool(ui, tool, "checkchanged"):
201 if filecmp.cmp(repo.wjoin(fd), back):
202 if ui.prompt(_(" output file %s appears unchanged\n"
203 "was merge successful (yn)?") % fd,
204 _("[yn]"), _("n")) != _("y"):
205 r = 1
206
207 if _toolbool(ui, tool, "fixeol"):
208 _matcheol(repo.wjoin(fd), back)
209
210 if r:
211 repo.ui.warn(_("merging %s failed!\n") % fd)
212 else:
213 os.unlink(back)
214
215 os.unlink(b)
216 os.unlink(c)
217 return r
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,72 b''
1 #!/bin/sh
2
3 "$TESTDIR/hghave" baz || exit 80
4
5 mkdir do_not_use_HOME_baz
6 cd do_not_use_HOME_baz
7 HOME=`pwd`; export HOME
8 cd ..
9 baz my-id "mercurial <mercurial@selenic.com>"
10
11 echo "[extensions]" >> $HGRCPATH
12 echo "convert=" >> $HGRCPATH
13 echo 'hgext.graphlog =' >> $HGRCPATH
14
15 echo % create baz archive
16 baz make-archive baz@mercurial--convert hg-test-convert-baz
17
18 echo % initialize baz repo
19 mkdir baz-repo
20 cd baz-repo/
21 baz init-tree baz@mercurial--convert/baz--test--0
22 baz import
23
24 echo % create initial files
25 echo 'this is a file' > a
26 baz add a
27 mkdir src
28 baz add src
29 cd src
30 dd count=1 if=/dev/zero of=b > /dev/null 2> /dev/null
31 baz add b
32 baz commit -s "added a file, src and src/b (binary)"
33
34 echo % create link file and modify a
35 ln -s ../a a-link
36 baz add a-link
37 echo 'this a modification to a' >> ../a
38 baz commit -s "added link to a and modify a"
39
40 echo % create second link and modify b
41 ln -s ../a a-link-2
42 baz add a-link-2
43 dd count=1 seek=1 if=/dev/zero of=b > /dev/null 2> /dev/null
44 baz commit -s "added second link and modify b"
45
46 echo % b file to link and a-link-2 to regular file
47 rm -f a-link-2
48 echo 'this is now a regular file' > a-link-2
49 ln -sf ../a b
50 baz commit -s "file to link and link to file test"
51
52 echo % move a-link-2 file and src directory
53 cd ..
54 baz mv src/a-link-2 c
55 baz mv src test
56 baz commit -s "move and rename a-link-2 file and src directory"
57
58 cd ..
59
60 echo % converting baz repo to Mercurial
61 hg convert baz-repo baz-repo-hg
62
63 baz register-archive -d baz@mercurial--convert
64
65 glog()
66 {
67 hg glog --template '#rev# "#desc|firstline#" files: #files#\n' "$@"
68 }
69
70 echo % show graph log
71 glog -R baz-repo-hg
72 hg -R baz-repo-hg manifest --debug
@@ -0,0 +1,75 b''
1 % create baz archive
2 % initialize baz repo
3 * creating version baz@mercurial--convert/baz--test--0
4 * imported baz@mercurial--convert/baz--test--0
5 % create initial files
6 * build pristine tree for baz@mercurial--convert/baz--test--0--base-0
7 * Scanning for full-tree revision: .
8 * from import revision: baz@mercurial--convert/baz--test--0--base-0
9 A/ .arch-ids
10 A/ src
11 A/ src/.arch-ids
12 A .arch-ids/a.id
13 A a
14 A src/.arch-ids/=id
15 A src/.arch-ids/b.id
16 A src/b
17 * update pristine tree (baz@mercurial--convert/baz--test--0--base-0 => baz--test--0--patch-1)
18 * committed baz@mercurial--convert/baz--test--0--patch-1
19 % create link file and modify a
20 A src/.arch-ids/a-link.id
21 A src/a-link
22 M a
23 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-1 => baz--test--0--patch-2)
24 * committed baz@mercurial--convert/baz--test--0--patch-2
25 % create second link and modify b
26 A src/.arch-ids/a-link-2.id
27 A src/a-link-2
28 Mb src/b
29 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-2 => baz--test--0--patch-3)
30 * committed baz@mercurial--convert/baz--test--0--patch-3
31 % b file to link and a-link-2 to regular file
32 fl src/b
33 lf src/a-link-2
34 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-3 => baz--test--0--patch-4)
35 * committed baz@mercurial--convert/baz--test--0--patch-4
36 % move a-link-2 file and src directory
37 D/ src/.arch-ids
38 A/ test/.arch-ids
39 /> src test
40 => src/.arch-ids/a-link-2.id .arch-ids/c.id
41 => src/a-link-2 c
42 => src/.arch-ids/=id test/.arch-ids/=id
43 => src/.arch-ids/a-link.id test/.arch-ids/a-link.id
44 => src/.arch-ids/b.id test/.arch-ids/b.id
45 * update pristine tree (baz@mercurial--convert/baz--test--0--patch-4 => baz--test--0--patch-5)
46 * committed baz@mercurial--convert/baz--test--0--patch-5
47 % converting baz repo to Mercurial
48 initializing destination baz-repo-hg repository
49 analyzing tree version baz@mercurial--convert/baz--test--0...
50 scanning source...
51 sorting...
52 converting...
53 5 initial import
54 4 added a file, src and src/b (binary)
55 3 added link to a and modify a
56 2 added second link and modify b
57 1 file to link and link to file test
58 0 move and rename a-link-2 file and src directory
59 % show graph log
60 o 5 "move and rename a-link-2 file and src directory" files: c src/a-link src/a-link-2 src/b test/a-link test/b
61 |
62 o 4 "file to link and link to file test" files: src/a-link-2 src/b
63 |
64 o 3 "added second link and modify b" files: src/a-link-2 src/b
65 |
66 o 2 "added link to a and modify a" files: a src/a-link
67 |
68 o 1 "added a file, src and src/b (binary)" files: a src/b
69 |
70 o 0 "initial import" files:
71
72 c4072c4b72e1cabace081888efa148ee80ca3cbb 644 a
73 e3207be798aaf87a444a62903621edab4ddc1fb6 644 c
74 1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/a-link
75 1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/b
@@ -0,0 +1,40 b''
1 #!/bin/sh
2
3 cat >> $HGRCPATH <<EOF
4 [extensions]
5 convert=
6 graphlog=
7 EOF
8
9 hg init t
10 cd t
11 echo a >> a
12 hg ci -Am a0 -d '1 0'
13 hg branch brancha
14 echo a >> a
15 hg ci -m a1 -d '2 0'
16 echo a >> a
17 hg ci -m a2 -d '3 0'
18 echo a >> a
19 hg ci -m a3 -d '4 0'
20 hg up -C 0
21 hg branch branchb
22 echo b >> b
23 hg ci -Am b0 -d '5 0'
24 hg up -C brancha
25 echo a >> a
26 hg ci -m a4 -d '6 0'
27 echo a >> a
28 hg ci -m a5 -d '7 0'
29 echo a >> a
30 hg ci -m a6 -d '8 0'
31 hg up -C branchb
32 echo b >> b
33 hg ci -m b1 -d '9 0'
34 cd ..
35
36 echo % convert with datesort
37 hg convert --datesort t t2
38 echo % graph converted repo
39 hg -R t2 glog --template '#rev# "#desc#"\n'
40
@@ -0,0 +1,40 b''
1 adding a
2 marked working directory as branch brancha
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 marked working directory as branch branchb
5 adding b
6 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
7 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
8 % convert with datesort
9 initializing destination t2 repository
10 scanning source...
11 sorting...
12 converting...
13 8 a0
14 7 a1
15 6 a2
16 5 a3
17 4 b0
18 3 a4
19 2 a5
20 1 a6
21 0 b1
22 % graph converted repo
23 o 8 "b1"
24 |
25 | o 7 "a6"
26 | |
27 | o 6 "a5"
28 | |
29 | o 5 "a4"
30 | |
31 o | 4 "b0"
32 | |
33 | o 3 "a3"
34 | |
35 | o 2 "a2"
36 | |
37 | o 1 "a1"
38 |/
39 o 0 "a0"
40
@@ -0,0 +1,72 b''
1 #!/bin/sh
2
3 "$TESTDIR/hghave" tla || exit 80
4
5 mkdir do_not_use_HOME_tla
6 cd do_not_use_HOME_tla
7 HOME=`pwd`; export HOME
8 cd ..
9 tla my-id "mercurial <mercurial@selenic.com>"
10
11 echo "[extensions]" >> $HGRCPATH
12 echo "convert=" >> $HGRCPATH
13 echo 'hgext.graphlog =' >> $HGRCPATH
14
15 echo % create tla archive
16 tla make-archive tla@mercurial--convert `pwd`/hg-test-convert-tla
17
18 echo % initialize tla repo
19 mkdir tla-repo
20 cd tla-repo/
21 tla init-tree tla@mercurial--convert/tla--test--0
22 tla import
23
24 echo % create initial files
25 echo 'this is a file' > a
26 tla add a
27 mkdir src
28 tla add src
29 cd src
30 dd count=1 if=/dev/zero of=b > /dev/null 2> /dev/null
31 tla add b
32 tla commit -s "added a file, src and src/b (binary)"
33
34 echo % create link file and modify a
35 ln -s ../a a-link
36 tla add a-link
37 echo 'this a modification to a' >> ../a
38 tla commit -s "added link to a and modify a"
39
40 echo % create second link and modify b
41 ln -s ../a a-link-2
42 tla add a-link-2
43 dd count=1 seek=1 if=/dev/zero of=b > /dev/null 2> /dev/null
44 tla commit -s "added second link and modify b"
45
46 echo % b file to link and a-link-2 to regular file
47 rm -f a-link-2
48 echo 'this is now a regular file' > a-link-2
49 ln -sf ../a b
50 tla commit -s "file to link and link to file test"
51
52 echo % move a-link-2 file and src directory
53 cd ..
54 tla mv src/a-link-2 c
55 tla mv src test
56 tla commit -s "move and rename a-link-2 file and src directory"
57
58 cd ..
59
60 echo % converting tla repo to Mercurial
61 hg convert tla-repo tla-repo-hg
62
63 tla register-archive -d tla@mercurial--convert
64
65 glog()
66 {
67 hg glog --template '#rev# "#desc|firstline#" files: #files#\n' "$@"
68 }
69
70 echo % show graph log
71 glog -R tla-repo-hg
72 hg -R tla-repo-hg manifest --debug
@@ -0,0 +1,72 b''
1 % create tla archive
2 % initialize tla repo
3 * creating version tla@mercurial--convert/tla--test--0
4 * imported tla@mercurial--convert/tla--test--0
5 % create initial files
6 A/ .arch-ids
7 A/ src
8 A/ src/.arch-ids
9 A .arch-ids/a.id
10 A a
11 A src/.arch-ids/=id
12 A src/.arch-ids/b.id
13 A src/b
14 * update pristine tree (tla@mercurial--convert/tla--test--0--base-0 => tla--test--0--patch-1)
15 * committed tla@mercurial--convert/tla--test--0--patch-1
16 % create link file and modify a
17 A src/.arch-ids/a-link.id
18 A src/a-link
19 M a
20 * update pristine tree (tla@mercurial--convert/tla--test--0--patch-1 => tla--test--0--patch-2)
21 * committed tla@mercurial--convert/tla--test--0--patch-2
22 % create second link and modify b
23 A src/.arch-ids/a-link-2.id
24 A src/a-link-2
25 Mb src/b
26 * update pristine tree (tla@mercurial--convert/tla--test--0--patch-2 => tla--test--0--patch-3)
27 * committed tla@mercurial--convert/tla--test--0--patch-3
28 % b file to link and a-link-2 to regular file
29 fl src/b
30 lf src/a-link-2
31 * update pristine tree (tla@mercurial--convert/tla--test--0--patch-3 => tla--test--0--patch-4)
32 * committed tla@mercurial--convert/tla--test--0--patch-4
33 % move a-link-2 file and src directory
34 D/ src/.arch-ids
35 A/ test/.arch-ids
36 /> src test
37 => src/.arch-ids/a-link-2.id .arch-ids/c.id
38 => src/a-link-2 c
39 => src/.arch-ids/=id test/.arch-ids/=id
40 => src/.arch-ids/a-link.id test/.arch-ids/a-link.id
41 => src/.arch-ids/b.id test/.arch-ids/b.id
42 * update pristine tree (tla@mercurial--convert/tla--test--0--patch-4 => tla--test--0--patch-5)
43 * committed tla@mercurial--convert/tla--test--0--patch-5
44 % converting tla repo to Mercurial
45 initializing destination tla-repo-hg repository
46 analyzing tree version tla@mercurial--convert/tla--test--0...
47 scanning source...
48 sorting...
49 converting...
50 5 initial import
51 4 added a file, src and src/b (binary)
52 3 added link to a and modify a
53 2 added second link and modify b
54 1 file to link and link to file test
55 0 move and rename a-link-2 file and src directory
56 % show graph log
57 o 5 "move and rename a-link-2 file and src directory" files: c src/a-link src/a-link-2 src/b test/a-link test/b
58 |
59 o 4 "file to link and link to file test" files: src/a-link-2 src/b
60 |
61 o 3 "added second link and modify b" files: src/a-link-2 src/b
62 |
63 o 2 "added link to a and modify a" files: a src/a-link
64 |
65 o 1 "added a file, src and src/b (binary)" files: a src/b
66 |
67 o 0 "initial import" files:
68
69 c4072c4b72e1cabace081888efa148ee80ca3cbb 644 a
70 e3207be798aaf87a444a62903621edab4ddc1fb6 644 c
71 1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/a-link
72 1f6b5bb93f1da278ef1fead1e4740a03d8802e9f 644 @ test/b
@@ -0,0 +1,60 b''
1 #!/bin/sh
2
3 hg init
4
5 cat > .hg/hgrc <<EOF
6 [extensions]
7 prefixfilter = prefix.py
8 [encode]
9 *.txt = stripprefix: Copyright 2046, The Masters
10 [decode]
11 *.txt = insertprefix: Copyright 2046, The Masters
12 EOF
13
14 cat > prefix.py <<EOF
15 from mercurial import util
16 def stripprefix(s, cmd, filename, **kwargs):
17 header = '%s\n' % cmd
18 if s[:len(header)] != header:
19 raise util.Abort('missing header "%s" in %s' % (cmd, filename))
20 return s[len(header):]
21 def insertprefix(s, cmd):
22 return '%s\n%s' % (cmd, s)
23 def reposetup(ui, repo):
24 repo.adddatafilter('stripprefix:', stripprefix)
25 repo.adddatafilter('insertprefix:', insertprefix)
26 EOF
27
28 cat > .hgignore <<EOF
29 .hgignore
30 prefix.py
31 prefix.pyc
32 EOF
33
34 cat > stuff.txt <<EOF
35 Copyright 2046, The Masters
36 Some stuff to ponder very carefully.
37 EOF
38 hg add stuff.txt
39 hg ci -m stuff
40
41 echo '% Repository data:'
42 hg cat stuff.txt
43
44 echo '% Fresh checkout:'
45 rm stuff.txt
46 hg up
47 cat stuff.txt
48 echo >> stuff.txt <<EOF
49 Very very carefully.
50 EOF
51 hg stat
52
53 cat > morestuff.txt <<EOF
54 Unauthorized material subject to destruction.
55 EOF
56
57 echo '% Problem encoding:'
58 hg add morestuff.txt
59 hg ci -m morestuff
60 hg stat
@@ -0,0 +1,11 b''
1 % Repository data:
2 Some stuff to ponder very carefully.
3 % Fresh checkout:
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
5 Copyright 2046, The Masters
6 Some stuff to ponder very carefully.
7 M stuff.txt
8 % Problem encoding:
9 abort: missing header "Copyright 2046, The Masters" in morestuff.txt
10 M stuff.txt
11 A morestuff.txt
@@ -0,0 +1,90 b''
1 #!/bin/sh
2
3 # test that new files created in .hg inherit the permissions from .hg/store
4
5 "$TESTDIR/hghave" unix-permissions || exit 80
6
7 mkdir dir
8 # just in case somebody has a strange $TMPDIR
9 chmod g-s dir
10 cd dir
11
12 cat >printmodes.py <<EOF
13 import os, sys
14
15 allnames = []
16 isdir = {}
17 for root, dirs, files in os.walk(sys.argv[1]):
18 for d in dirs:
19 name = os.path.join(root, d)
20 isdir[name] = 1
21 allnames.append(name)
22 for f in files:
23 name = os.path.join(root, f)
24 allnames.append(name)
25 allnames.sort()
26 for name in allnames:
27 suffix = name in isdir and '/' or ''
28 print '%05o %s%s' % (os.lstat(name).st_mode & 07777, name, suffix)
29 EOF
30
31 cat >mode.py <<EOF
32 import sys
33 import os
34 print '%05o' % os.lstat(sys.argv[1]).st_mode
35 EOF
36
37 umask 077
38
39 hg init repo
40 cd repo
41
42 chmod 0770 .hg/store
43
44 echo '% before commit'
45 echo '% store can be written by the group, other files cannot'
46 echo '% store is setgid'
47 python ../printmodes.py .
48
49 mkdir dir
50 touch foo dir/bar
51 hg ci -qAm 'add files'
52
53 echo
54 echo '% after commit'
55 echo '% working dir files can only be written by the owner'
56 echo '% files created in .hg can be written by the group'
57 echo '% (in particular, store/**, dirstate, branch.cache, undo files)'
58 echo '% new directories are setgid'
59 python ../printmodes.py .
60
61 umask 007
62 hg init ../push
63 echo
64 echo '% before push'
65 echo '% group can write everything'
66 python ../printmodes.py ../push
67
68 umask 077
69 hg -q push ../push
70 echo
71 echo '% after push'
72 echo '% group can still write everything'
73 python ../printmodes.py ../push
74
75 # Test that we don't lose the setgid bit when we call chmod.
76 # Not all systems support setgid directories (e.g. HFS+), so
77 # just check that directories have the same mode.
78 cd ..
79 hg init setgid
80 cd setgid
81 chmod g+s .hg/store 2> /dev/null
82 mkdir dir
83 touch dir/file
84 hg ci -qAm 'add dir/file'
85 storemode=`python ../mode.py .hg/store`
86 dirmode=`python ../mode.py .hg/store/data/dir`
87 if [ "$storemode" != "$dirmode" ]; then
88 echo "$storemode != $dirmode"
89 fi
90
@@ -0,0 +1,54 b''
1 % before commit
2 % store can be written by the group, other files cannot
3 % store is setgid
4 00700 ./.hg/
5 00600 ./.hg/00changelog.i
6 00600 ./.hg/requires
7 00770 ./.hg/store/
8
9 % after commit
10 % working dir files can only be written by the owner
11 % files created in .hg can be written by the group
12 % (in particular, store/**, dirstate, branch.cache, undo files)
13 % new directories are setgid
14 00700 ./.hg/
15 00600 ./.hg/00changelog.i
16 00660 ./.hg/dirstate
17 00600 ./.hg/requires
18 00770 ./.hg/store/
19 00660 ./.hg/store/00changelog.i
20 00660 ./.hg/store/00manifest.i
21 00770 ./.hg/store/data/
22 00770 ./.hg/store/data/dir/
23 00660 ./.hg/store/data/dir/bar.i
24 00660 ./.hg/store/data/foo.i
25 00660 ./.hg/store/undo
26 00660 ./.hg/undo.branch
27 00660 ./.hg/undo.dirstate
28 00700 ./dir/
29 00600 ./dir/bar
30 00600 ./foo
31
32 % before push
33 % group can write everything
34 00770 ../push/.hg/
35 00660 ../push/.hg/00changelog.i
36 00660 ../push/.hg/requires
37 00770 ../push/.hg/store/
38
39 % after push
40 % group can still write everything
41 00770 ../push/.hg/
42 00660 ../push/.hg/00changelog.i
43 00660 ../push/.hg/branch.cache
44 00660 ../push/.hg/requires
45 00770 ../push/.hg/store/
46 00660 ../push/.hg/store/00changelog.i
47 00660 ../push/.hg/store/00manifest.i
48 00770 ../push/.hg/store/data/
49 00770 ../push/.hg/store/data/dir/
50 00660 ../push/.hg/store/data/dir/bar.i
51 00660 ../push/.hg/store/data/foo.i
52 00660 ../push/.hg/store/undo
53 00660 ../push/.hg/undo.branch
54 00660 ../push/.hg/undo.dirstate
1 NO CONTENT: new file 100644, binary diff hidden
NO CONTENT: new file 100644, binary diff hidden
@@ -0,0 +1,36 b''
1 #!/bin/sh
2
3 cat > writelines.py <<EOF
4 import sys
5 path = sys.argv[1]
6 args = sys.argv[2:]
7 assert (len(args) % 2) == 0
8
9 f = file(path, 'wb')
10 for i in xrange(len(args)/2):
11 count, s = args[2*i:2*i+2]
12 count = int(count)
13 s = s.decode('string_escape')
14 f.write(s*count)
15 f.close()
16
17 EOF
18
19 echo "[extensions]" >> $HGRCPATH
20 echo "mq=" >> $HGRCPATH
21 echo "[diff]" >> $HGRCPATH
22 echo "git=1" >> $HGRCPATH
23
24 echo % build diff with CRLF
25 hg init repo
26 cd repo
27 python ../writelines.py b 5 'a\n' 5 'a\r\n'
28 hg ci -Am addb
29 python ../writelines.py b 2 'a\n' 10 'b\n' 2 'a\r\n'
30 hg diff > b.diff
31 hg up -C
32 echo % qimport CRLF diff
33 hg qimport b.diff
34 hg qpush
35
36
@@ -0,0 +1,7 b''
1 % build diff with CRLF
2 adding b
3 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 % qimport CRLF diff
5 adding b.diff to series file
6 applying b.diff
7 Now at: b.diff
@@ -0,0 +1,44 b''
1 #!/bin/sh
2
3 echo '[extensions]' >> $HGRCPATH
4 echo 'hgext.mq =' >> $HGRCPATH
5
6 hg init repo
7 cd repo
8
9 echo foo > foo
10 hg ci -qAm 'add a file'
11
12 hg qinit
13
14 hg qnew foo
15 echo foo >> foo
16 hg qrefresh -m 'append foo'
17
18 hg qnew bar
19 echo bar >> foo
20 hg qrefresh -m 'append bar'
21
22 echo '% try to commit on top of a patch'
23 echo quux >> foo
24 hg ci -m 'append quux'
25
26 # cheat a bit...
27 mv .hg/patches .hg/patches2
28 hg ci -m 'append quux'
29 mv .hg/patches2 .hg/patches
30
31 echo '% qpop/qrefresh on the wrong revision'
32 hg qpop
33 hg qpop -n patches 2>&1 | sed -e 's/\(using patch queue:\).*/\1/'
34 hg qrefresh
35
36 hg up -C qtip
37 echo '% qpop'
38 hg qpop
39
40 echo '% qrefresh'
41 hg qrefresh
42
43 echo '% tip:'
44 hg tip --template '#rev# #desc#\n'
@@ -0,0 +1,14 b''
1 % try to commit on top of a patch
2 abort: cannot commit over an applied mq patch
3 % qpop/qrefresh on the wrong revision
4 abort: working directory revision is not qtip
5 using patch queue:
6 abort: popping would remove a revision not managed by this patch queue
7 abort: working directory revision is not qtip
8 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
9 % qpop
10 abort: popping would remove a revision not managed by this patch queue
11 % qrefresh
12 abort: cannot refresh a revision with children
13 % tip:
14 3 append quux
@@ -0,0 +1,17 b''
1 #!/bin/sh
2
3 "$TESTDIR/hghave" execbit || exit 80
4
5 hg init repo
6 cd repo
7 echo foo > foo
8 chmod 644 foo
9 hg ci -qAm '644'
10
11 chmod 755 foo
12 hg ci -qAm '755'
13
14 echo '% reverting to rev 0'
15 hg revert -a -r 0
16 hg st
17 hg diff --git
@@ -0,0 +1,6 b''
1 % reverting to rev 0
2 reverting foo
3 M foo
4 diff --git a/foo b/foo
5 old mode 100755
6 new mode 100644
@@ -9,9 +9,9 b''
9 # enable demandloading to reduce startup time
9 # enable demandloading to reduce startup time
10 from mercurial import demandimport; demandimport.enable()
10 from mercurial import demandimport; demandimport.enable()
11
11
12 # send python tracebacks to the browser if an error occurs:
12 # Uncomment to send python tracebacks to the browser if an error occurs:
13 import cgitb
13 #import cgitb
14 cgitb.enable()
14 #cgitb.enable()
15
15
16 # If you'd like to serve pages with UTF-8 instead of your default
16 # If you'd like to serve pages with UTF-8 instead of your default
17 # locale charset, you can do so by uncommenting the following lines.
17 # locale charset, you can do so by uncommenting the following lines.
This diff has been collapsed as it changes many lines, (546 lines changed) Show them Hide them
@@ -1,503 +1,11 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # Copyright (C) 2004, 2005 Canonical Ltd
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18
19 # mbp: "you know that thing where cvs gives you conflict markers?"
20 # s: "i hate that."
21
2
22 from mercurial import demandimport
3 from mercurial import demandimport
23 demandimport.enable()
4 demandimport.enable()
24
5
25 from mercurial import util, mdiff, fancyopts
6 import os, sys
26 from mercurial.i18n import _
7 from mercurial.i18n import _
27
8 from mercurial import simplemerge, fancyopts, util
28
29 class CantReprocessAndShowBase(Exception):
30 pass
31
32
33 def warn(message):
34 sys.stdout.flush()
35 sys.stderr.write(message)
36 sys.stderr.flush()
37
38
39 def intersect(ra, rb):
40 """Given two ranges return the range where they intersect or None.
41
42 >>> intersect((0, 10), (0, 6))
43 (0, 6)
44 >>> intersect((0, 10), (5, 15))
45 (5, 10)
46 >>> intersect((0, 10), (10, 15))
47 >>> intersect((0, 9), (10, 15))
48 >>> intersect((0, 9), (7, 15))
49 (7, 9)
50 """
51 assert ra[0] <= ra[1]
52 assert rb[0] <= rb[1]
53
54 sa = max(ra[0], rb[0])
55 sb = min(ra[1], rb[1])
56 if sa < sb:
57 return sa, sb
58 else:
59 return None
60
61
62 def compare_range(a, astart, aend, b, bstart, bend):
63 """Compare a[astart:aend] == b[bstart:bend], without slicing.
64 """
65 if (aend-astart) != (bend-bstart):
66 return False
67 for ia, ib in zip(xrange(astart, aend), xrange(bstart, bend)):
68 if a[ia] != b[ib]:
69 return False
70 else:
71 return True
72
73
74
75
76 class Merge3Text(object):
77 """3-way merge of texts.
78
79 Given strings BASE, OTHER, THIS, tries to produce a combined text
80 incorporating the changes from both BASE->OTHER and BASE->THIS."""
81 def __init__(self, basetext, atext, btext, base=None, a=None, b=None):
82 self.basetext = basetext
83 self.atext = atext
84 self.btext = btext
85 if base is None:
86 base = mdiff.splitnewlines(basetext)
87 if a is None:
88 a = mdiff.splitnewlines(atext)
89 if b is None:
90 b = mdiff.splitnewlines(btext)
91 self.base = base
92 self.a = a
93 self.b = b
94
95
96
97 def merge_lines(self,
98 name_a=None,
99 name_b=None,
100 name_base=None,
101 start_marker='<<<<<<<',
102 mid_marker='=======',
103 end_marker='>>>>>>>',
104 base_marker=None,
105 reprocess=False):
106 """Return merge in cvs-like form.
107 """
108 self.conflicts = False
109 newline = '\n'
110 if len(self.a) > 0:
111 if self.a[0].endswith('\r\n'):
112 newline = '\r\n'
113 elif self.a[0].endswith('\r'):
114 newline = '\r'
115 if base_marker and reprocess:
116 raise CantReprocessAndShowBase()
117 if name_a:
118 start_marker = start_marker + ' ' + name_a
119 if name_b:
120 end_marker = end_marker + ' ' + name_b
121 if name_base and base_marker:
122 base_marker = base_marker + ' ' + name_base
123 merge_regions = self.merge_regions()
124 if reprocess is True:
125 merge_regions = self.reprocess_merge_regions(merge_regions)
126 for t in merge_regions:
127 what = t[0]
128 if what == 'unchanged':
129 for i in range(t[1], t[2]):
130 yield self.base[i]
131 elif what == 'a' or what == 'same':
132 for i in range(t[1], t[2]):
133 yield self.a[i]
134 elif what == 'b':
135 for i in range(t[1], t[2]):
136 yield self.b[i]
137 elif what == 'conflict':
138 self.conflicts = True
139 yield start_marker + newline
140 for i in range(t[3], t[4]):
141 yield self.a[i]
142 if base_marker is not None:
143 yield base_marker + newline
144 for i in range(t[1], t[2]):
145 yield self.base[i]
146 yield mid_marker + newline
147 for i in range(t[5], t[6]):
148 yield self.b[i]
149 yield end_marker + newline
150 else:
151 raise ValueError(what)
152
153
154
155
156
157 def merge_annotated(self):
158 """Return merge with conflicts, showing origin of lines.
159
160 Most useful for debugging merge.
161 """
162 for t in self.merge_regions():
163 what = t[0]
164 if what == 'unchanged':
165 for i in range(t[1], t[2]):
166 yield 'u | ' + self.base[i]
167 elif what == 'a' or what == 'same':
168 for i in range(t[1], t[2]):
169 yield what[0] + ' | ' + self.a[i]
170 elif what == 'b':
171 for i in range(t[1], t[2]):
172 yield 'b | ' + self.b[i]
173 elif what == 'conflict':
174 yield '<<<<\n'
175 for i in range(t[3], t[4]):
176 yield 'A | ' + self.a[i]
177 yield '----\n'
178 for i in range(t[5], t[6]):
179 yield 'B | ' + self.b[i]
180 yield '>>>>\n'
181 else:
182 raise ValueError(what)
183
184
185
186
187
188 def merge_groups(self):
189 """Yield sequence of line groups. Each one is a tuple:
190
191 'unchanged', lines
192 Lines unchanged from base
193
194 'a', lines
195 Lines taken from a
196
197 'same', lines
198 Lines taken from a (and equal to b)
199
200 'b', lines
201 Lines taken from b
202
203 'conflict', base_lines, a_lines, b_lines
204 Lines from base were changed to either a or b and conflict.
205 """
206 for t in self.merge_regions():
207 what = t[0]
208 if what == 'unchanged':
209 yield what, self.base[t[1]:t[2]]
210 elif what == 'a' or what == 'same':
211 yield what, self.a[t[1]:t[2]]
212 elif what == 'b':
213 yield what, self.b[t[1]:t[2]]
214 elif what == 'conflict':
215 yield (what,
216 self.base[t[1]:t[2]],
217 self.a[t[3]:t[4]],
218 self.b[t[5]:t[6]])
219 else:
220 raise ValueError(what)
221
222
223 def merge_regions(self):
224 """Return sequences of matching and conflicting regions.
225
226 This returns tuples, where the first value says what kind we
227 have:
228
229 'unchanged', start, end
230 Take a region of base[start:end]
231
232 'same', astart, aend
233 b and a are different from base but give the same result
234
235 'a', start, end
236 Non-clashing insertion from a[start:end]
237
238 Method is as follows:
239
240 The two sequences align only on regions which match the base
241 and both descendents. These are found by doing a two-way diff
242 of each one against the base, and then finding the
243 intersections between those regions. These "sync regions"
244 are by definition unchanged in both and easily dealt with.
245
246 The regions in between can be in any of three cases:
247 conflicted, or changed on only one side.
248 """
249
250 # section a[0:ia] has been disposed of, etc
251 iz = ia = ib = 0
252
253 for zmatch, zend, amatch, aend, bmatch, bend in self.find_sync_regions():
254 #print 'match base [%d:%d]' % (zmatch, zend)
255
256 matchlen = zend - zmatch
257 assert matchlen >= 0
258 assert matchlen == (aend - amatch)
259 assert matchlen == (bend - bmatch)
260
261 len_a = amatch - ia
262 len_b = bmatch - ib
263 len_base = zmatch - iz
264 assert len_a >= 0
265 assert len_b >= 0
266 assert len_base >= 0
267
268 #print 'unmatched a=%d, b=%d' % (len_a, len_b)
269
270 if len_a or len_b:
271 # try to avoid actually slicing the lists
272 equal_a = compare_range(self.a, ia, amatch,
273 self.base, iz, zmatch)
274 equal_b = compare_range(self.b, ib, bmatch,
275 self.base, iz, zmatch)
276 same = compare_range(self.a, ia, amatch,
277 self.b, ib, bmatch)
278
279 if same:
280 yield 'same', ia, amatch
281 elif equal_a and not equal_b:
282 yield 'b', ib, bmatch
283 elif equal_b and not equal_a:
284 yield 'a', ia, amatch
285 elif not equal_a and not equal_b:
286 yield 'conflict', iz, zmatch, ia, amatch, ib, bmatch
287 else:
288 raise AssertionError("can't handle a=b=base but unmatched")
289
290 ia = amatch
291 ib = bmatch
292 iz = zmatch
293
294 # if the same part of the base was deleted on both sides
295 # that's OK, we can just skip it.
296
297
298 if matchlen > 0:
299 assert ia == amatch
300 assert ib == bmatch
301 assert iz == zmatch
302
303 yield 'unchanged', zmatch, zend
304 iz = zend
305 ia = aend
306 ib = bend
307
308
309 def reprocess_merge_regions(self, merge_regions):
310 """Where there are conflict regions, remove the agreed lines.
311
312 Lines where both A and B have made the same changes are
313 eliminated.
314 """
315 for region in merge_regions:
316 if region[0] != "conflict":
317 yield region
318 continue
319 type, iz, zmatch, ia, amatch, ib, bmatch = region
320 a_region = self.a[ia:amatch]
321 b_region = self.b[ib:bmatch]
322 matches = mdiff.get_matching_blocks(''.join(a_region),
323 ''.join(b_region))
324 next_a = ia
325 next_b = ib
326 for region_ia, region_ib, region_len in matches[:-1]:
327 region_ia += ia
328 region_ib += ib
329 reg = self.mismatch_region(next_a, region_ia, next_b,
330 region_ib)
331 if reg is not None:
332 yield reg
333 yield 'same', region_ia, region_len+region_ia
334 next_a = region_ia + region_len
335 next_b = region_ib + region_len
336 reg = self.mismatch_region(next_a, amatch, next_b, bmatch)
337 if reg is not None:
338 yield reg
339
340
341 def mismatch_region(next_a, region_ia, next_b, region_ib):
342 if next_a < region_ia or next_b < region_ib:
343 return 'conflict', None, None, next_a, region_ia, next_b, region_ib
344 mismatch_region = staticmethod(mismatch_region)
345
346
347 def find_sync_regions(self):
348 """Return a list of sync regions, where both descendents match the base.
349
350 Generates a list of (base1, base2, a1, a2, b1, b2). There is
351 always a zero-length sync region at the end of all the files.
352 """
353
354 ia = ib = 0
355 amatches = mdiff.get_matching_blocks(self.basetext, self.atext)
356 bmatches = mdiff.get_matching_blocks(self.basetext, self.btext)
357 len_a = len(amatches)
358 len_b = len(bmatches)
359
360 sl = []
361
362 while ia < len_a and ib < len_b:
363 abase, amatch, alen = amatches[ia]
364 bbase, bmatch, blen = bmatches[ib]
365
366 # there is an unconflicted block at i; how long does it
367 # extend? until whichever one ends earlier.
368 i = intersect((abase, abase+alen), (bbase, bbase+blen))
369 if i:
370 intbase = i[0]
371 intend = i[1]
372 intlen = intend - intbase
373
374 # found a match of base[i[0], i[1]]; this may be less than
375 # the region that matches in either one
376 assert intlen <= alen
377 assert intlen <= blen
378 assert abase <= intbase
379 assert bbase <= intbase
380
381 asub = amatch + (intbase - abase)
382 bsub = bmatch + (intbase - bbase)
383 aend = asub + intlen
384 bend = bsub + intlen
385
386 assert self.base[intbase:intend] == self.a[asub:aend], \
387 (self.base[intbase:intend], self.a[asub:aend])
388
389 assert self.base[intbase:intend] == self.b[bsub:bend]
390
391 sl.append((intbase, intend,
392 asub, aend,
393 bsub, bend))
394
395 # advance whichever one ends first in the base text
396 if (abase + alen) < (bbase + blen):
397 ia += 1
398 else:
399 ib += 1
400
401 intbase = len(self.base)
402 abase = len(self.a)
403 bbase = len(self.b)
404 sl.append((intbase, intbase, abase, abase, bbase, bbase))
405
406 return sl
407
408
409
410 def find_unconflicted(self):
411 """Return a list of ranges in base that are not conflicted."""
412 am = mdiff.get_matching_blocks(self.basetext, self.atext)
413 bm = mdiff.get_matching_blocks(self.basetext, self.btext)
414
415 unc = []
416
417 while am and bm:
418 # there is an unconflicted block at i; how long does it
419 # extend? until whichever one ends earlier.
420 a1 = am[0][0]
421 a2 = a1 + am[0][2]
422 b1 = bm[0][0]
423 b2 = b1 + bm[0][2]
424 i = intersect((a1, a2), (b1, b2))
425 if i:
426 unc.append(i)
427
428 if a2 < b2:
429 del am[0]
430 else:
431 del bm[0]
432
433 return unc
434
435
436 # bzr compatible interface, for the tests
437 class Merge3(Merge3Text):
438 """3-way merge of texts.
439
440 Given BASE, OTHER, THIS, tries to produce a combined text
441 incorporating the changes from both BASE->OTHER and BASE->THIS.
442 All three will typically be sequences of lines."""
443 def __init__(self, base, a, b):
444 basetext = '\n'.join([i.strip('\n') for i in base] + [''])
445 atext = '\n'.join([i.strip('\n') for i in a] + [''])
446 btext = '\n'.join([i.strip('\n') for i in b] + [''])
447 if util.binary(basetext) or util.binary(atext) or util.binary(btext):
448 raise util.Abort(_("don't know how to merge binary files"))
449 Merge3Text.__init__(self, basetext, atext, btext, base, a, b)
450
451
452 def simplemerge(local, base, other, **opts):
453 def readfile(filename):
454 f = open(filename, "rb")
455 text = f.read()
456 f.close()
457 if util.binary(text):
458 msg = _("%s looks like a binary file.") % filename
459 if not opts.get('text'):
460 raise util.Abort(msg)
461 elif not opts.get('quiet'):
462 warn(_('warning: %s\n') % msg)
463 return text
464
465 name_a = local
466 name_b = other
467 labels = opts.get('label', [])
468 if labels:
469 name_a = labels.pop(0)
470 if labels:
471 name_b = labels.pop(0)
472 if labels:
473 raise util.Abort(_("can only specify two labels."))
474
475 localtext = readfile(local)
476 basetext = readfile(base)
477 othertext = readfile(other)
478
479 orig = local
480 local = os.path.realpath(local)
481 if not opts.get('print'):
482 opener = util.opener(os.path.dirname(local))
483 out = opener(os.path.basename(local), "w", atomictemp=True)
484 else:
485 out = sys.stdout
486
487 reprocess = not opts.get('no_minimal')
488
489 m3 = Merge3Text(basetext, localtext, othertext)
490 for line in m3.merge_lines(name_a=name_a, name_b=name_b,
491 reprocess=reprocess):
492 out.write(line)
493
494 if not opts.get('print'):
495 out.rename()
496
497 if m3.conflicts:
498 if not opts.get('quiet'):
499 warn(_("warning: conflicts during merge.\n"))
500 return 1
501
9
502 options = [('L', 'label', [], _('labels to use on conflict markers')),
10 options = [('L', 'label', [], _('labels to use on conflict markers')),
503 ('a', 'text', None, _('treat all files as text')),
11 ('a', 'text', None, _('treat all files as text')),
@@ -517,6 +25,9 b" usage = _('''simplemerge [OPTS] LOCAL BA"
517 By default, LOCAL is overwritten with the results of this operation.
25 By default, LOCAL is overwritten with the results of this operation.
518 ''')
26 ''')
519
27
28 class ParseError(Exception):
29 """Exception raised on errors in parsing the command line."""
30
520 def showhelp():
31 def showhelp():
521 sys.stdout.write(usage)
32 sys.stdout.write(usage)
522 sys.stdout.write('\noptions:\n')
33 sys.stdout.write('\noptions:\n')
@@ -530,33 +41,24 b' def showhelp():'
530 for first, second in out_opts:
41 for first, second in out_opts:
531 sys.stdout.write(' %-*s %s\n' % (opts_len, first, second))
42 sys.stdout.write(' %-*s %s\n' % (opts_len, first, second))
532
43
533 class ParseError(Exception):
44 try:
534 """Exception raised on errors in parsing the command line."""
45 opts = {}
535
536 def main(argv):
537 try:
46 try:
538 opts = {}
47 args = fancyopts.fancyopts(sys.argv[1:], options, opts)
539 try:
48 except fancyopts.getopt.GetoptError, e:
540 args = fancyopts.fancyopts(argv[1:], options, opts)
49 raise ParseError(e)
541 except fancyopts.getopt.GetoptError, e:
50 if opts['help']:
542 raise ParseError(e)
543 if opts['help']:
544 showhelp()
545 return 0
546 if len(args) != 3:
547 raise ParseError(_('wrong number of arguments'))
548 return simplemerge(*args, **opts)
549 except ParseError, e:
550 sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
551 showhelp()
51 showhelp()
552 return 1
52 sys.exit(0)
553 except util.Abort, e:
53 if len(args) != 3:
554 sys.stderr.write("abort: %s\n" % e)
54 raise ParseError(_('wrong number of arguments'))
555 return 255
55 sys.exit(simplemerge.simplemerge(*args, **opts))
556 except KeyboardInterrupt:
56 except ParseError, e:
557 return 255
57 sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
558
58 showhelp()
559 if __name__ == '__main__':
59 sys.exit(1)
560 import sys
60 except util.Abort, e:
561 import os
61 sys.stderr.write("abort: %s\n" % e)
562 sys.exit(main(sys.argv))
62 sys.exit(255)
63 except KeyboardInterrupt:
64 sys.exit(255)
@@ -233,6 +233,82 b' format::'
233 you to store longer filenames in some situations at the expense of
233 you to store longer filenames in some situations at the expense of
234 compatibility.
234 compatibility.
235
235
236 merge-patterns::
237 This section specifies merge tools to associate with particular file
238 patterns. Tools matched here will take precedence over the default
239 merge tool. Patterns are globs by default, rooted at the repository root.
240
241 Example:
242
243 [merge-patterns]
244 **.c = kdiff3
245 **.jpg = myimgmerge
246
247 merge-tools::
248 This section configures external merge tools to use for file-level
249 merges.
250
251 Example ~/.hgrc:
252
253 [merge-tools]
254 # Override stock tool location
255 kdiff3.executable = ~/bin/kdiff3
256 # Specify command line
257 kdiff3.args = $base $local $other -o $output
258 # Give higher priority
259 kdiff3.priority = 1
260
261 # Define new tool
262 myHtmlTool.args = -m $local $other $base $output
263 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
264 myHtmlTool.priority = 1
265
266 Supported arguments:
267 priority;;
268 The priority in which to evaluate this tool.
269 Default: 0.
270 executable;;
271 Either just the name of the executable or its pathname.
272 Default: the tool name.
273 args;;
274 The arguments to pass to the tool executable. You can refer to the files
275 being merged as well as the output file through these variables: $base,
276 $local, $other, $output.
277 Default: $local $base $other
278 premerge;;
279 Attempt to run internal non-interactive 3-way merge tool before
280 launching external tool.
281 Default: True
282 binary;;
283 This tool can merge binary files. Defaults to False, unless tool
284 was selected by file pattern match.
285 symlink;;
286 This tool can merge symlinks. Defaults to False, even if tool was
287 selected by file pattern match.
288 checkconflicts;;
289 Check whether there are conflicts even though the tool reported
290 success.
291 Default: False
292 checkchanged;;
293 Check whether outputs were written even though the tool reported
294 success.
295 Default: False
296 fixeol;;
297 Attempt to fix up EOL changes caused by the merge tool.
298 Default: False
299 gui:;
300 This tool requires a graphical interface to run. Default: False
301 regkey;;
302 Windows registry key which describes install location of this tool.
303 Mercurial will search for this key first under HKEY_CURRENT_USER and
304 then under HKEY_LOCAL_MACHINE. Default: None
305 regname;;
306 Name of value to read from specified registry key. Defaults to the
307 unnamed (default) value.
308 regappend;;
309 String to append to the value read from the registry, typically the
310 executable name of the tool. Default: None
311
236 hooks::
312 hooks::
237 Commands or Python functions that get automatically executed by
313 Commands or Python functions that get automatically executed by
238 various actions such as starting or finishing a commit. Multiple
314 various actions such as starting or finishing a commit. Multiple
@@ -453,7 +529,18 b' ui::'
453 Template string for commands that print changesets.
529 Template string for commands that print changesets.
454 merge;;
530 merge;;
455 The conflict resolution program to use during a manual merge.
531 The conflict resolution program to use during a manual merge.
456 Default is "hgmerge".
532 There are some internal tools available:
533
534 internal:local;;
535 keep the local version
536 internal:other;;
537 use the other version
538 internal:merge;;
539 use the internal non-interactive merge tool
540 internal:fail;;
541 fail to merge
542
543 See the merge-tools section for more information on configuring tools.
457 patch;;
544 patch;;
458 command to use to apply patches. Look for 'gpatch' or 'patch' in PATH if
545 command to use to apply patches. Look for 'gpatch' or 'patch' in PATH if
459 unset.
546 unset.
@@ -19,6 +19,7 b' def convert(ui, src, dest=None, revmapfi'
19 - Darcs
19 - Darcs
20 - git
20 - git
21 - Subversion
21 - Subversion
22 - GNU Arch
22
23
23 Accepted destination formats:
24 Accepted destination formats:
24 - Mercurial
25 - Mercurial
@@ -30,8 +30,8 b" SKIPREV = 'SKIP'"
30 class commit(object):
30 class commit(object):
31 def __init__(self, author, date, desc, parents, branch=None, rev=None,
31 def __init__(self, author, date, desc, parents, branch=None, rev=None,
32 extra={}):
32 extra={}):
33 self.author = author
33 self.author = author or 'unknown'
34 self.date = date
34 self.date = date or '0 0'
35 self.desc = desc
35 self.desc = desc
36 self.parents = parents
36 self.parents = parents
37 self.branch = branch
37 self.branch = branch
@@ -227,7 +227,7 b' class commandline(object):'
227 except TypeError:
227 except TypeError:
228 pass
228 pass
229 cmdline = [util.shellquote(arg) for arg in cmdline]
229 cmdline = [util.shellquote(arg) for arg in cmdline]
230 cmdline += ['<', util.nulldev]
230 cmdline += ['2>', util.nulldev, '<', util.nulldev]
231 cmdline = ' '.join(cmdline)
231 cmdline = ' '.join(cmdline)
232 self.ui.debug(cmdline, '\n')
232 self.ui.debug(cmdline, '\n')
233 return cmdline
233 return cmdline
@@ -246,6 +246,12 b' class commandline(object):'
246 self.ui.debug(output)
246 self.ui.debug(output)
247 return output, fp.close()
247 return output, fp.close()
248
248
249 def runlines(self, cmd, *args, **kwargs):
250 fp = self._run(cmd, *args, **kwargs)
251 output = fp.readlines()
252 self.ui.debug(''.join(output))
253 return output, fp.close()
254
249 def checkexit(self, status, output=''):
255 def checkexit(self, status, output=''):
250 if status:
256 if status:
251 if output:
257 if output:
@@ -259,6 +265,11 b' class commandline(object):'
259 self.checkexit(status, output)
265 self.checkexit(status, output)
260 return output
266 return output
261
267
268 def runlines0(self, cmd, *args, **kwargs):
269 output, status = self.runlines(cmd, *args, **kwargs)
270 self.checkexit(status, ''.join(output))
271 return output
272
262 def getargmax(self):
273 def getargmax(self):
263 if '_argmax' in self.__dict__:
274 if '_argmax' in self.__dict__:
264 return self._argmax
275 return self._argmax
@@ -311,6 +322,8 b' class mapfile(dict):'
311 self._read()
322 self._read()
312
323
313 def _read(self):
324 def _read(self):
325 if self.path is None:
326 return
314 try:
327 try:
315 fp = open(self.path, 'r')
328 fp = open(self.path, 'r')
316 except IOError, err:
329 except IOError, err:
@@ -11,18 +11,28 b' from darcs import darcs_source'
11 from git import convert_git
11 from git import convert_git
12 from hg import mercurial_source, mercurial_sink
12 from hg import mercurial_source, mercurial_sink
13 from subversion import debugsvnlog, svn_source, svn_sink
13 from subversion import debugsvnlog, svn_source, svn_sink
14 from gnuarch import gnuarch_source
14 import filemap
15 import filemap
15
16
16 import os, shutil
17 import os, shutil
17 from mercurial import hg, util
18 from mercurial import hg, util
18 from mercurial.i18n import _
19 from mercurial.i18n import _
19
20
21 orig_encoding = 'ascii'
22
23 def recode(s):
24 if isinstance(s, unicode):
25 return s.encode(orig_encoding, 'replace')
26 else:
27 return s.decode('utf-8').encode(orig_encoding, 'replace')
28
20 source_converters = [
29 source_converters = [
21 ('cvs', convert_cvs),
30 ('cvs', convert_cvs),
22 ('git', convert_git),
31 ('git', convert_git),
23 ('svn', svn_source),
32 ('svn', svn_source),
24 ('hg', mercurial_source),
33 ('hg', mercurial_source),
25 ('darcs', darcs_source),
34 ('darcs', darcs_source),
35 ('gnuarch', gnuarch_source),
26 ]
36 ]
27
37
28 sink_converters = [
38 sink_converters = [
@@ -74,6 +84,8 b' class converter(object):'
74 self.readauthormap(opts.get('authors'))
84 self.readauthormap(opts.get('authors'))
75 self.authorfile = self.dest.authorfile()
85 self.authorfile = self.dest.authorfile()
76
86
87 self.splicemap = mapfile(ui, ui.config('convert', 'splicemap'))
88
77 def walktree(self, heads):
89 def walktree(self, heads):
78 '''Return a mapping that identifies the uncommitted parents of every
90 '''Return a mapping that identifies the uncommitted parents of every
79 uncommitted changeset.'''
91 uncommitted changeset.'''
@@ -98,6 +110,7 b' class converter(object):'
98 visit = parents.keys()
110 visit = parents.keys()
99 seen = {}
111 seen = {}
100 children = {}
112 children = {}
113 actives = []
101
114
102 while visit:
115 while visit:
103 n = visit.pop(0)
116 n = visit.pop(0)
@@ -106,49 +119,63 b' class converter(object):'
106 # Ensure that nodes without parents are present in the 'children'
119 # Ensure that nodes without parents are present in the 'children'
107 # mapping.
120 # mapping.
108 children.setdefault(n, [])
121 children.setdefault(n, [])
122 hasparent = False
109 for p in parents[n]:
123 for p in parents[n]:
110 if not p in self.map:
124 if not p in self.map:
111 visit.append(p)
125 visit.append(p)
126 hasparent = True
112 children.setdefault(p, []).append(n)
127 children.setdefault(p, []).append(n)
128 if not hasparent:
129 actives.append(n)
130
131 del seen
132 del visit
133
134 if self.opts.get('datesort'):
135 dates = {}
136 def getdate(n):
137 if n not in dates:
138 dates[n] = util.parsedate(self.commitcache[n].date)
139 return dates[n]
140
141 def picknext(nodes):
142 return min([(getdate(n), n) for n in nodes])[1]
143 else:
144 prev = [None]
145 def picknext(nodes):
146 # Return the first eligible child of the previously converted
147 # revision, or any of them.
148 next = nodes[0]
149 for n in nodes:
150 if prev[0] in parents[n]:
151 next = n
152 break
153 prev[0] = next
154 return next
113
155
114 s = []
156 s = []
115 removed = {}
157 pendings = {}
116 visit = children.keys()
158 while actives:
117 while visit:
159 n = picknext(actives)
118 n = visit.pop(0)
160 actives.remove(n)
119 if n in removed: continue
161 s.append(n)
120 dep = 0
121 if n in parents:
122 for p in parents[n]:
123 if p in self.map: continue
124 if p not in removed:
125 # we're still dependent
126 visit.append(n)
127 dep = 1
128 break
129
162
130 if not dep:
163 # Update dependents list
131 # all n's parents are in the list
164 for c in children.get(n, []):
132 removed[n] = 1
165 if c not in pendings:
133 if n not in self.map:
166 pendings[c] = [p for p in parents[c] if p not in self.map]
134 s.append(n)
167 try:
135 if n in children:
168 pendings[c].remove(n)
136 for c in children[n]:
169 except ValueError:
137 visit.insert(0, c)
170 raise util.Abort(_('cycle detected between %s and %s')
171 % (recode(c), recode(n)))
172 if not pendings[c]:
173 # Parents are converted, node is eligible
174 actives.insert(0, c)
175 pendings[c] = None
138
176
139 if self.opts.get('datesort'):
177 if len(s) != len(parents):
140 depth = {}
178 raise util.Abort(_("not all revisions were sorted"))
141 for n in s:
142 depth[n] = 0
143 pl = [p for p in self.commitcache[n].parents
144 if p not in self.map]
145 if pl:
146 depth[n] = max([depth[p] for p in pl]) + 1
147
148 s = [(depth[n], util.parsedate(self.commitcache[n].date), n)
149 for n in s]
150 s.sort()
151 s = [e[2] for e in s]
152
179
153 return s
180 return s
154
181
@@ -224,16 +251,18 b' class converter(object):'
224 # Merely marks that a copy happened.
251 # Merely marks that a copy happened.
225 self.dest.copyfile(copyf, f)
252 self.dest.copyfile(copyf, f)
226
253
227 parents = [b[0] for b in pbranches]
254 try:
255 parents = [self.splicemap[rev]]
256 self.ui.debug('spliced in %s as parents of %s\n' %
257 (parents, rev))
258 except KeyError:
259 parents = [b[0] for b in pbranches]
228 newnode = self.dest.putcommit(filenames, parents, commit)
260 newnode = self.dest.putcommit(filenames, parents, commit)
229 self.source.converted(rev, newnode)
261 self.source.converted(rev, newnode)
230 self.map[rev] = newnode
262 self.map[rev] = newnode
231
263
232 def convert(self):
264 def convert(self):
233
265
234 def recode(s):
235 return s.decode('utf-8').encode(orig_encoding, 'replace')
236
237 try:
266 try:
238 self.source.before()
267 self.source.before()
239 self.dest.before()
268 self.dest.before()
@@ -284,8 +313,6 b' class converter(object):'
284 self.source.after()
313 self.source.after()
285 self.map.close()
314 self.map.close()
286
315
287 orig_encoding = 'ascii'
288
289 def convert(ui, src, dest=None, revmapfile=None, **opts):
316 def convert(ui, src, dest=None, revmapfile=None, **opts):
290 global orig_encoding
317 global orig_encoding
291 orig_encoding = util._encoding
318 orig_encoding = util._encoding
@@ -71,7 +71,7 b' class convert_cvs(converter_source):'
71 elif l.startswith("Ancestor branch"):
71 elif l.startswith("Ancestor branch"):
72 ancestor = l[17:-1]
72 ancestor = l[17:-1]
73 # figure out the parent later
73 # figure out the parent later
74 self.parent[id] = None
74 self.parent[id] = self.lastbranch[ancestor]
75 elif l.startswith("Author"):
75 elif l.startswith("Author"):
76 author = self.recode(l[8:-1])
76 author = self.recode(l[8:-1])
77 elif l.startswith("Tag:") or l.startswith("Tags:"):
77 elif l.startswith("Tag:") or l.startswith("Tags:"):
@@ -101,13 +101,14 b' class convert_cvs(converter_source):'
101 p = []
101 p = []
102 if branch == "HEAD":
102 if branch == "HEAD":
103 branch = ""
103 branch = ""
104 if branch and p[0] == None:
104 if branch:
105 latest = None
105 latest = None
106 # the last changeset that contains a base
106 # the last changeset that contains a base
107 # file is our parent
107 # file is our parent
108 for r in oldrevs:
108 for r in oldrevs:
109 latest = max(filerevids[r], latest)
109 latest = max(filerevids.get(r, None), latest)
110 p = [latest]
110 if latest:
111 p = [latest]
111
112
112 # add current commit to set
113 # add current commit to set
113 c = commit(author=author, date=date, parents=p,
114 c = commit(author=author, date=date, parents=p,
@@ -102,7 +102,6 b' class convert_git(converter_source):'
102 tzs, tzh, tzm = tz[-5:-4] + "1", tz[-4:-2], tz[-2:]
102 tzs, tzh, tzm = tz[-5:-4] + "1", tz[-4:-2], tz[-2:]
103 tz = -int(tzs) * (int(tzh) * 3600 + int(tzm))
103 tz = -int(tzs) * (int(tzh) * 3600 + int(tzm))
104 date = tm + " " + str(tz)
104 date = tm + " " + str(tz)
105 author = author or "unknown"
106
105
107 c = commit(parents=parents, date=date, author=author, desc=message,
106 c = commit(parents=parents, date=date, author=author, desc=message,
108 rev=version)
107 rev=version)
@@ -947,7 +947,7 b' class svn_sink(converter_sink, commandli'
947 os.rename(tempname, wdest)
947 os.rename(tempname, wdest)
948
948
949 def dirs_of(self, files):
949 def dirs_of(self, files):
950 dirs = set()
950 dirs = util.set()
951 for f in files:
951 for f in files:
952 if os.path.isdir(self.wjoin(f)):
952 if os.path.isdir(self.wjoin(f)):
953 dirs.add(f)
953 dirs.add(f)
@@ -970,7 +970,8 b' class svn_sink(converter_sink, commandli'
970
970
971 def tidy_dirs(self, names):
971 def tidy_dirs(self, names):
972 dirs = list(self.dirs_of(names))
972 dirs = list(self.dirs_of(names))
973 dirs.sort(reverse=True)
973 dirs.sort()
974 dirs.reverse()
974 deleted = []
975 deleted = []
975 for d in dirs:
976 for d in dirs:
976 wd = self.wjoin(d)
977 wd = self.wjoin(d)
@@ -991,7 +992,7 b' class svn_sink(converter_sink, commandli'
991 return self.revid(self.childmap[parent])
992 return self.revid(self.childmap[parent])
992 except KeyError:
993 except KeyError:
993 pass
994 pass
994 entries = set(self.delete)
995 entries = util.set(self.delete)
995 files = util.frozenset(files)
996 files = util.frozenset(files)
996 entries.update(self.add_dirs(files.difference(entries)))
997 entries.update(self.add_dirs(files.difference(entries)))
997 if self.copies:
998 if self.copies:
@@ -80,13 +80,18 b' def snapshot_wdir(ui, repo, files, tmpro'
80 '''snapshot files from working directory.
80 '''snapshot files from working directory.
81 if not using snapshot, -I/-X does not work and recursive diff
81 if not using snapshot, -I/-X does not work and recursive diff
82 in tools like kdiff3 and meld displays too many files.'''
82 in tools like kdiff3 and meld displays too many files.'''
83 dirname = os.path.basename(repo.root)
83 repo_root = repo.root
84
85 dirname = os.path.basename(repo_root)
84 if dirname == "":
86 if dirname == "":
85 dirname = "root"
87 dirname = "root"
86 base = os.path.join(tmproot, dirname)
88 base = os.path.join(tmproot, dirname)
87 os.mkdir(base)
89 os.mkdir(base)
88 ui.note(_('making snapshot of %d files from working dir\n') %
90 ui.note(_('making snapshot of %d files from working dir\n') %
89 (len(files)))
91 (len(files)))
92
93 fns_and_mtime = []
94
90 for fn in files:
95 for fn in files:
91 wfn = util.pconvert(fn)
96 wfn = util.pconvert(fn)
92 ui.note(' %s\n' % wfn)
97 ui.note(' %s\n' % wfn)
@@ -94,13 +99,27 b' def snapshot_wdir(ui, repo, files, tmpro'
94 destdir = os.path.dirname(dest)
99 destdir = os.path.dirname(dest)
95 if not os.path.isdir(destdir):
100 if not os.path.isdir(destdir):
96 os.makedirs(destdir)
101 os.makedirs(destdir)
102
97 fp = open(dest, 'wb')
103 fp = open(dest, 'wb')
98 for chunk in util.filechunkiter(repo.wopener(wfn)):
104 for chunk in util.filechunkiter(repo.wopener(wfn)):
99 fp.write(chunk)
105 fp.write(chunk)
100 return dirname
106 fp.close()
107
108 fns_and_mtime.append((dest, os.path.join(repo_root, fn),
109 os.path.getmtime(dest)))
110
111
112 return dirname, fns_and_mtime
101
113
102
114
103 def dodiff(ui, repo, diffcmd, diffopts, pats, opts):
115 def dodiff(ui, repo, diffcmd, diffopts, pats, opts):
116 '''Do the actuall diff:
117
118 - copy to a temp structure if diffing 2 internal revisions
119 - copy to a temp structure if diffing working revision with
120 another one and more than 1 file is changed
121 - just invoke the diff for a single file in the working dir
122 '''
104 node1, node2 = cmdutil.revpair(repo, opts['rev'])
123 node1, node2 = cmdutil.revpair(repo, opts['rev'])
105 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
124 files, matchfn, anypats = cmdutil.matchpats(repo, pats, opts)
106 modified, added, removed, deleted, unknown = repo.status(
125 modified, added, removed, deleted, unknown = repo.status(
@@ -115,11 +134,17 b' def dodiff(ui, repo, diffcmd, diffopts, '
115 dir1 = snapshot_node(ui, repo, modified + removed, node1, tmproot)
134 dir1 = snapshot_node(ui, repo, modified + removed, node1, tmproot)
116 changes = len(modified) + len(removed) + len(added)
135 changes = len(modified) + len(removed) + len(added)
117
136
137 fns_and_mtime = []
138
118 # If node2 in not the wc or there is >1 change, copy it
139 # If node2 in not the wc or there is >1 change, copy it
119 if node2:
140 if node2:
120 dir2 = snapshot_node(ui, repo, modified + added, node2, tmproot)
141 dir2 = snapshot_node(ui, repo, modified + added, node2, tmproot)
121 elif changes > 1:
142 elif changes > 1:
122 dir2 = snapshot_wdir(ui, repo, modified + added, tmproot)
143 #we only actually need to get the files to copy back to the working
144 #dir in this case (because the other cases are: diffing 2 revisions
145 #or single file -- in which case the file is already directly passed
146 #to the diff tool).
147 dir2, fns_and_mtime = snapshot_wdir(ui, repo, modified + added, tmproot)
123 else:
148 else:
124 # This lets the diff tool open the changed file directly
149 # This lets the diff tool open the changed file directly
125 dir2 = ''
150 dir2 = ''
@@ -142,6 +167,13 b' def dodiff(ui, repo, diffcmd, diffopts, '
142 util.shellquote(dir1), util.shellquote(dir2)))
167 util.shellquote(dir1), util.shellquote(dir2)))
143 ui.debug('running %r in %s\n' % (cmdline, tmproot))
168 ui.debug('running %r in %s\n' % (cmdline, tmproot))
144 util.system(cmdline, cwd=tmproot)
169 util.system(cmdline, cwd=tmproot)
170
171 for copy_fn, working_fn, mtime in fns_and_mtime:
172 if os.path.getmtime(copy_fn) != mtime:
173 ui.debug('File changed while diffing. '
174 'Overwriting: %s (src: %s)\n' % (working_fn, copy_fn))
175 util.copyfile(copy_fn, working_fn)
176
145 return 1
177 return 1
146 finally:
178 finally:
147 ui.note(_('cleaning up temp directory\n'))
179 ui.note(_('cleaning up temp directory\n'))
@@ -65,6 +65,10 b" def fetch(ui, repo, source='default', **"
65 modheads = repo.pull(other, heads=revs)
65 modheads = repo.pull(other, heads=revs)
66 return postincoming(other, modheads)
66 return postincoming(other, modheads)
67
67
68 date = opts.get('date')
69 if date:
70 opts['date'] = util.parsedate(date)
71
68 parent, p2 = repo.dirstate.parents()
72 parent, p2 = repo.dirstate.parents()
69 if parent != repo.changelog.tip():
73 if parent != repo.changelog.tip():
70 raise util.Abort(_('working dir not at tip '
74 raise util.Abort(_('working dir not at tip '
@@ -203,6 +203,11 b' def sign(ui, repo, *revs, **opts):'
203 mygpg = newgpg(ui, **opts)
203 mygpg = newgpg(ui, **opts)
204 sigver = "0"
204 sigver = "0"
205 sigmessage = ""
205 sigmessage = ""
206
207 date = opts.get('date')
208 if date:
209 opts['date'] = util.parsedate(date)
210
206 if revs:
211 if revs:
207 nodes = [repo.lookup(n) for n in revs]
212 nodes = [repo.lookup(n) for n in revs]
208 else:
213 else:
@@ -7,7 +7,8 b' imerge - interactive merge'
7
7
8 from mercurial.i18n import _
8 from mercurial.i18n import _
9 from mercurial.node import *
9 from mercurial.node import *
10 from mercurial import commands, cmdutil, dispatch, fancyopts, hg, merge, util
10 from mercurial import commands, cmdutil, dispatch, fancyopts
11 from mercurial import hg, filemerge, util
11 import os, tarfile
12 import os, tarfile
12
13
13 class InvalidStateFileException(Exception): pass
14 class InvalidStateFileException(Exception): pass
@@ -126,7 +127,7 b' class Imerge(object):'
126 self.wctx._parents.pop()
127 self.wctx._parents.pop()
127 try:
128 try:
128 # TODO: we should probably revert the file if merge fails
129 # TODO: we should probably revert the file if merge fails
129 return merge.filemerge(self.repo, fn, fd, fo, self.wctx, p2)
130 return filemerge.filemerge(self.repo, fn, fd, fo, self.wctx, p2)
130 finally:
131 finally:
131 self.wctx._parents.append(p2)
132 self.wctx._parents.append(p2)
132 if realmerge:
133 if realmerge:
@@ -135,13 +136,13 b' class Imerge(object):'
135 del os.environ['HGMERGE']
136 del os.environ['HGMERGE']
136
137
137 def start(self, rev=None):
138 def start(self, rev=None):
138 _filemerge = merge.filemerge
139 _filemerge = filemerge.filemerge
139 def filemerge(repo, fw, fd, fo, wctx, mctx):
140 def filemerge_(repo, fw, fd, fo, wctx, mctx):
140 self.conflicts[fw] = (fd, fo)
141 self.conflicts[fw] = (fd, fo)
141
142
142 merge.filemerge = filemerge
143 filemerge.filemerge = filemerge_
143 commands.merge(self.ui, self.repo, rev=rev)
144 commands.merge(self.ui, self.repo, rev=rev)
144 merge.filemerge = _filemerge
145 filemerge.filemerge = _filemerge
145
146
146 self.wctx = self.repo.workingctx()
147 self.wctx = self.repo.workingctx()
147 self.save()
148 self.save()
@@ -80,23 +80,73 b" like CVS' $Log$, are not supported. A ke"
80
80
81 from mercurial import commands, cmdutil, context, dispatch, filelog, revlog
81 from mercurial import commands, cmdutil, context, dispatch, filelog, revlog
82 from mercurial import patch, localrepo, templater, templatefilters, util
82 from mercurial import patch, localrepo, templater, templatefilters, util
83 from mercurial.hgweb import webcommands
83 from mercurial.node import *
84 from mercurial.node import *
84 from mercurial.i18n import _
85 from mercurial.i18n import _
85 import re, shutil, sys, tempfile, time
86 import re, shutil, tempfile, time
86
87
87 commands.optionalrepo += ' kwdemo'
88 commands.optionalrepo += ' kwdemo'
88
89
90 # hg commands that do not act on keywords
91 nokwcommands = ('add addremove bundle copy export grep identify incoming init'
92 ' log outgoing push remove rename rollback tip'
93 ' convert email glog')
94
89 # hg commands that trigger expansion only when writing to working dir,
95 # hg commands that trigger expansion only when writing to working dir,
90 # not when reading filelog, and unexpand when reading from working dir
96 # not when reading filelog, and unexpand when reading from working dir
91 restricted = ('diff1', 'record',
97 restricted = 'record qfold qimport qnew qpush qrefresh qrecord'
92 'qfold', 'qimport', 'qnew', 'qpush', 'qrefresh', 'qrecord')
93
98
94 def utcdate(date):
99 def utcdate(date):
95 '''Returns hgdate in cvs-like UTC format.'''
100 '''Returns hgdate in cvs-like UTC format.'''
96 return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0]))
101 return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0]))
97
102
98
103
99 _kwtemplater = None
104 # make keyword tools accessible
105 kwtools = {'templater': None, 'hgcmd': None}
106
107 # store originals of monkeypatches
108 _patchfile_init = patch.patchfile.__init__
109 _patch_diff = patch.diff
110 _dispatch_parse = dispatch._parse
111
112 def _kwpatchfile_init(self, ui, fname, missing=False):
113 '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
114 rejects or conflicts due to expanded keywords in working dir.'''
115 _patchfile_init(self, ui, fname, missing=missing)
116 # shrink keywords read from working dir
117 kwt = kwtools['templater']
118 self.lines = kwt.shrinklines(self.fname, self.lines)
119
120 def _kw_diff(repo, node1=None, node2=None, files=None, match=util.always,
121 fp=None, changes=None, opts=None):
122 '''Monkeypatch patch.diff to avoid expansion except when
123 comparing against working dir.'''
124 if node2 is not None:
125 kwtools['templater'].matcher = util.never
126 elif node1 is not None and node1 != repo.changectx().node():
127 kwtools['templater'].restrict = True
128 _patch_diff(repo, node1=node1, node2=node2, files=files, match=match,
129 fp=fp, changes=changes, opts=opts)
130
131 def _kwweb_changeset(web, req, tmpl):
132 '''Wraps webcommands.changeset turning off keyword expansion.'''
133 kwtools['templater'].matcher = util.never
134 return web.changeset(tmpl, web.changectx(req))
135
136 def _kwweb_filediff(web, req, tmpl):
137 '''Wraps webcommands.filediff turning off keyword expansion.'''
138 kwtools['templater'].matcher = util.never
139 return web.filediff(tmpl, web.filectx(req))
140
141 def _kwdispatch_parse(ui, args):
142 '''Monkeypatch dispatch._parse to obtain running hg command.'''
143 cmd, func, args, options, cmdoptions = _dispatch_parse(ui, args)
144 kwtools['hgcmd'] = cmd
145 return cmd, func, args, options, cmdoptions
146
147 # dispatch._parse is run before reposetup, so wrap it here
148 dispatch._parse = _kwdispatch_parse
149
100
150
101 class kwtemplater(object):
151 class kwtemplater(object):
102 '''
152 '''
@@ -113,13 +163,11 b' class kwtemplater(object):'
113 'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
163 'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
114 }
164 }
115
165
116 def __init__(self, ui, repo, inc, exc, hgcmd):
166 def __init__(self, ui, repo, inc, exc):
117 self.ui = ui
167 self.ui = ui
118 self.repo = repo
168 self.repo = repo
119 self.matcher = util.matcher(repo.root, inc=inc, exc=exc)[1]
169 self.matcher = util.matcher(repo.root, inc=inc, exc=exc)[1]
120 self.hgcmd = hgcmd
170 self.restrict = kwtools['hgcmd'] in restricted.split()
121 self.commitnode = None
122 self.path = ''
123
171
124 kwmaps = self.ui.configitems('keywordmaps')
172 kwmaps = self.ui.configitems('keywordmaps')
125 if kwmaps: # override default templates
173 if kwmaps: # override default templates
@@ -134,47 +182,89 b' class kwtemplater(object):'
134 self.ct = cmdutil.changeset_templater(self.ui, self.repo,
182 self.ct = cmdutil.changeset_templater(self.ui, self.repo,
135 False, '', False)
183 False, '', False)
136
184
137 def substitute(self, node, data, subfunc):
185 def getnode(self, path, fnode):
138 '''Obtains file's changenode if commit node not given,
186 '''Derives changenode from file path and filenode.'''
139 and calls given substitution function.'''
187 # used by kwfilelog.read and kwexpand
140 if self.commitnode:
188 c = context.filectx(self.repo, path, fileid=fnode)
141 fnode = self.commitnode
189 return c.node()
142 else:
143 c = context.filectx(self.repo, self.path, fileid=node)
144 fnode = c.node()
145
190
191 def substitute(self, data, path, node, subfunc):
192 '''Replaces keywords in data with expanded template.'''
146 def kwsub(mobj):
193 def kwsub(mobj):
147 '''Substitutes keyword using corresponding template.'''
148 kw = mobj.group(1)
194 kw = mobj.group(1)
149 self.ct.use_template(self.templates[kw])
195 self.ct.use_template(self.templates[kw])
150 self.ui.pushbuffer()
196 self.ui.pushbuffer()
151 self.ct.show(changenode=fnode, root=self.repo.root, file=self.path)
197 self.ct.show(changenode=node, root=self.repo.root, file=path)
152 return '$%s: %s $' % (kw, templatefilters.firstline(
198 ekw = templatefilters.firstline(self.ui.popbuffer())
153 self.ui.popbuffer()))
199 return '$%s: %s $' % (kw, ekw)
154
155 return subfunc(kwsub, data)
200 return subfunc(kwsub, data)
156
201
157 def expand(self, node, data):
202 def expand(self, path, node, data):
158 '''Returns data with keywords expanded.'''
203 '''Returns data with keywords expanded.'''
159 if util.binary(data) or self.hgcmd in restricted:
204 if not self.restrict and self.matcher(path) and not util.binary(data):
160 return data
205 changenode = self.getnode(path, node)
161 return self.substitute(node, data, self.re_kw.sub)
206 return self.substitute(data, path, changenode, self.re_kw.sub)
207 return data
208
209 def iskwfile(self, path, islink):
210 '''Returns true if path matches [keyword] pattern
211 and is not a symbolic link.
212 Caveat: localrepository._link fails on Windows.'''
213 return self.matcher(path) and not islink(path)
162
214
163 def process(self, node, data, expand):
215 def overwrite(self, node=None, expand=True, files=None):
164 '''Returns a tuple: data, count.
216 '''Overwrites selected files expanding/shrinking keywords.'''
165 Count is number of keywords/keyword substitutions,
217 ctx = self.repo.changectx(node)
166 telling caller whether to act on file containing data.'''
218 mf = ctx.manifest()
167 if util.binary(data):
219 if node is not None: # commit
168 return data, None
220 files = [f for f in ctx.files() if f in mf]
169 if expand:
221 notify = self.ui.debug
170 return self.substitute(node, data, self.re_kw.subn)
222 else: # kwexpand/kwshrink
171 return data, self.re_kw.search(data)
223 notify = self.ui.note
224 candidates = [f for f in files if self.iskwfile(f, mf.linkf)]
225 if candidates:
226 self.restrict = True # do not expand when reading
227 candidates.sort()
228 action = expand and 'expanding' or 'shrinking'
229 for f in candidates:
230 fp = self.repo.file(f)
231 data = fp.read(mf[f])
232 if util.binary(data):
233 continue
234 if expand:
235 changenode = node or self.getnode(f, mf[f])
236 data, found = self.substitute(data, f, changenode,
237 self.re_kw.subn)
238 else:
239 found = self.re_kw.search(data)
240 if found:
241 notify(_('overwriting %s %s keywords\n') % (f, action))
242 self.repo.wwrite(f, data, mf.flags(f))
243 self.repo.dirstate.normal(f)
244 self.restrict = False
172
245
173 def shrink(self, text):
246 def shrinktext(self, text):
247 '''Unconditionally removes all keyword substitutions from text.'''
248 return self.re_kw.sub(r'$\1$', text)
249
250 def shrink(self, fname, text):
174 '''Returns text with all keyword substitutions removed.'''
251 '''Returns text with all keyword substitutions removed.'''
175 if util.binary(text):
252 if self.matcher(fname) and not util.binary(text):
176 return text
253 return self.shrinktext(text)
177 return self.re_kw.sub(r'$\1$', text)
254 return text
255
256 def shrinklines(self, fname, lines):
257 '''Returns lines with keyword substitutions removed.'''
258 if self.matcher(fname):
259 text = ''.join(lines)
260 if not util.binary(text):
261 return self.shrinktext(text).splitlines(True)
262 return lines
263
264 def wread(self, fname, data):
265 '''If in restricted mode returns data read from wdir with
266 keyword substitutions removed.'''
267 return self.restrict and self.shrink(fname, data) or data
178
268
179 class kwfilelog(filelog.filelog):
269 class kwfilelog(filelog.filelog):
180 '''
270 '''
@@ -183,84 +273,41 b' class kwfilelog(filelog.filelog):'
183 '''
273 '''
184 def __init__(self, opener, path):
274 def __init__(self, opener, path):
185 super(kwfilelog, self).__init__(opener, path)
275 super(kwfilelog, self).__init__(opener, path)
186 _kwtemplater.path = path
276 self.kwt = kwtools['templater']
187
277 self.path = path
188 def kwctread(self, node, expand):
189 '''Reads expanding and counting keywords, called from _overwrite.'''
190 data = super(kwfilelog, self).read(node)
191 return _kwtemplater.process(node, data, expand)
192
278
193 def read(self, node):
279 def read(self, node):
194 '''Expands keywords when reading filelog.'''
280 '''Expands keywords when reading filelog.'''
195 data = super(kwfilelog, self).read(node)
281 data = super(kwfilelog, self).read(node)
196 return _kwtemplater.expand(node, data)
282 return self.kwt.expand(self.path, node, data)
197
283
198 def add(self, text, meta, tr, link, p1=None, p2=None):
284 def add(self, text, meta, tr, link, p1=None, p2=None):
199 '''Removes keyword substitutions when adding to filelog.'''
285 '''Removes keyword substitutions when adding to filelog.'''
200 text = _kwtemplater.shrink(text)
286 text = self.kwt.shrink(self.path, text)
201 return super(kwfilelog, self).add(text, meta, tr, link, p1=p1, p2=p2)
287 return super(kwfilelog, self).add(text, meta, tr, link, p1=p1, p2=p2)
202
288
203 def cmp(self, node, text):
289 def cmp(self, node, text):
204 '''Removes keyword substitutions for comparison.'''
290 '''Removes keyword substitutions for comparison.'''
205 text = _kwtemplater.shrink(text)
291 text = self.kwt.shrink(self.path, text)
206 if self.renamed(node):
292 if self.renamed(node):
207 t2 = super(kwfilelog, self).read(node)
293 t2 = super(kwfilelog, self).read(node)
208 return t2 != text
294 return t2 != text
209 return revlog.revlog.cmp(self, node, text)
295 return revlog.revlog.cmp(self, node, text)
210
296
211
297 def _status(ui, repo, kwt, *pats, **opts):
212 # store original patch.patchfile.__init__
213 _patchfile_init = patch.patchfile.__init__
214
215 def _kwpatchfile_init(self, ui, fname, missing=False):
216 '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
217 rejects or conflicts due to expanded keywords in working dir.'''
218 _patchfile_init(self, ui, fname, missing=missing)
219
220 if _kwtemplater.matcher(self.fname):
221 # shrink keywords read from working dir
222 kwshrunk = _kwtemplater.shrink(''.join(self.lines))
223 self.lines = kwshrunk.splitlines(True)
224
225
226 def _iskwfile(f, link):
227 return not link(f) and _kwtemplater.matcher(f)
228
229 def _status(ui, repo, *pats, **opts):
230 '''Bails out if [keyword] configuration is not active.
298 '''Bails out if [keyword] configuration is not active.
231 Returns status of working directory.'''
299 Returns status of working directory.'''
232 if _kwtemplater:
300 if kwt:
233 files, match, anypats = cmdutil.matchpats(repo, pats, opts)
301 files, match, anypats = cmdutil.matchpats(repo, pats, opts)
234 return repo.status(files=files, match=match, list_clean=True)
302 return repo.status(files=files, match=match, list_clean=True)
235 if ui.configitems('keyword'):
303 if ui.configitems('keyword'):
236 raise util.Abort(_('[keyword] patterns cannot match'))
304 raise util.Abort(_('[keyword] patterns cannot match'))
237 raise util.Abort(_('no [keyword] patterns configured'))
305 raise util.Abort(_('no [keyword] patterns configured'))
238
306
239 def _overwrite(ui, repo, node=None, expand=True, files=None):
240 '''Overwrites selected files expanding/shrinking keywords.'''
241 ctx = repo.changectx(node)
242 mf = ctx.manifest()
243 if node is not None: # commit
244 _kwtemplater.commitnode = node
245 files = [f for f in ctx.files() if f in mf]
246 notify = ui.debug
247 else: # kwexpand/kwshrink
248 notify = ui.note
249 candidates = [f for f in files if _iskwfile(f, mf.linkf)]
250 if candidates:
251 candidates.sort()
252 action = expand and 'expanding' or 'shrinking'
253 for f in candidates:
254 fp = repo.file(f, kwmatch=True)
255 data, kwfound = fp.kwctread(mf[f], expand)
256 if kwfound:
257 notify(_('overwriting %s %s keywords\n') % (f, action))
258 repo.wwrite(f, data, mf.flags(f))
259 repo.dirstate.normal(f)
260
261 def _kwfwrite(ui, repo, expand, *pats, **opts):
307 def _kwfwrite(ui, repo, expand, *pats, **opts):
262 '''Selects files and passes them to _overwrite.'''
308 '''Selects files and passes them to kwtemplater.overwrite.'''
263 status = _status(ui, repo, *pats, **opts)
309 kwt = kwtools['templater']
310 status = _status(ui, repo, kwt, *pats, **opts)
264 modified, added, removed, deleted, unknown, ignored, clean = status
311 modified, added, removed, deleted, unknown, ignored, clean = status
265 if modified or added or removed or deleted:
312 if modified or added or removed or deleted:
266 raise util.Abort(_('outstanding uncommitted changes in given files'))
313 raise util.Abort(_('outstanding uncommitted changes in given files'))
@@ -268,7 +315,7 b' def _kwfwrite(ui, repo, expand, *pats, *'
268 try:
315 try:
269 wlock = repo.wlock()
316 wlock = repo.wlock()
270 lock = repo.lock()
317 lock = repo.lock()
271 _overwrite(ui, repo, expand=expand, files=clean)
318 kwt.overwrite(expand=expand, files=clean)
272 finally:
319 finally:
273 del wlock, lock
320 del wlock, lock
274
321
@@ -370,13 +417,16 b' def files(ui, repo, *pats, **opts):'
370 keyword expansion.
417 keyword expansion.
371 That is, files matched by [keyword] config patterns but not symlinks.
418 That is, files matched by [keyword] config patterns but not symlinks.
372 '''
419 '''
373 status = _status(ui, repo, *pats, **opts)
420 kwt = kwtools['templater']
421 status = _status(ui, repo, kwt, *pats, **opts)
374 modified, added, removed, deleted, unknown, ignored, clean = status
422 modified, added, removed, deleted, unknown, ignored, clean = status
375 files = modified + added + clean
423 files = modified + added + clean
376 if opts.get('untracked'):
424 if opts.get('untracked'):
377 files += unknown
425 files += unknown
378 files.sort()
426 files.sort()
379 kwfiles = [f for f in files if _iskwfile(f, repo._link)]
427 wctx = repo.workingctx()
428 islink = lambda p: 'l' in wctx.fileflags(p)
429 kwfiles = [f for f in files if kwt.iskwfile(f, islink)]
380 cwd = pats and repo.getcwd() or ''
430 cwd = pats and repo.getcwd() or ''
381 kwfstats = not opts.get('ignore') and (('K', kwfiles),) or ()
431 kwfstats = not opts.get('ignore') and (('K', kwfiles),) or ()
382 if opts.get('all') or opts.get('ignore'):
432 if opts.get('all') or opts.get('ignore'):
@@ -407,28 +457,15 b' def reposetup(ui, repo):'
407 This is done for local repos only, and only if there are
457 This is done for local repos only, and only if there are
408 files configured at all for keyword substitution.'''
458 files configured at all for keyword substitution.'''
409
459
410 if not repo.local():
460 try:
411 return
461 if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
462 or '.hg' in util.splitpath(repo.root)
463 or repo._url.startswith('bundle:')):
464 return
465 except AttributeError:
466 pass
412
467
413 nokwcommands = ('add', 'addremove', 'bundle', 'clone', 'copy',
468 inc, exc = [], ['.hg*']
414 'export', 'grep', 'identify', 'incoming', 'init',
415 'log', 'outgoing', 'push', 'remove', 'rename',
416 'rollback', 'tip',
417 'convert')
418 hgcmd, func, args, opts, cmdopts = dispatch._parse(ui, sys.argv[1:])
419 if hgcmd in nokwcommands:
420 return
421
422 if hgcmd == 'diff':
423 # only expand if comparing against working dir
424 node1, node2 = cmdutil.revpair(repo, cmdopts.get('rev'))
425 if node2 is not None:
426 return
427 # shrink if rev is not current node
428 if node1 is not None and node1 != repo.changectx().node():
429 hgcmd = 'diff1'
430
431 inc, exc = [], ['.hgtags']
432 for pat, opt in ui.configitems('keyword'):
469 for pat, opt in ui.configitems('keyword'):
433 if opt != 'ignore':
470 if opt != 'ignore':
434 inc.append(pat)
471 inc.append(pat)
@@ -437,26 +474,21 b' def reposetup(ui, repo):'
437 if not inc:
474 if not inc:
438 return
475 return
439
476
440 global _kwtemplater
477 kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
441 _kwtemplater = kwtemplater(ui, repo, inc, exc, hgcmd)
442
478
443 class kwrepo(repo.__class__):
479 class kwrepo(repo.__class__):
444 def file(self, f, kwmatch=False):
480 def file(self, f):
445 if f[0] == '/':
481 if f[0] == '/':
446 f = f[1:]
482 f = f[1:]
447 if kwmatch or _kwtemplater.matcher(f):
483 return kwfilelog(self.sopener, f)
448 return kwfilelog(self.sopener, f)
449 return filelog.filelog(self.sopener, f)
450
484
451 def wread(self, filename):
485 def wread(self, filename):
452 data = super(kwrepo, self).wread(filename)
486 data = super(kwrepo, self).wread(filename)
453 if hgcmd in restricted and _kwtemplater.matcher(filename):
487 return kwt.wread(filename, data)
454 return _kwtemplater.shrink(data)
455 return data
456
488
457 def commit(self, files=None, text='', user=None, date=None,
489 def commit(self, files=None, text='', user=None, date=None,
458 match=util.always, force=False, force_editor=False,
490 match=util.always, force=False, force_editor=False,
459 p1=None, p2=None, extra={}):
491 p1=None, p2=None, extra={}, empty_ok=False):
460 wlock = lock = None
492 wlock = lock = None
461 _p1 = _p2 = None
493 _p1 = _p2 = None
462 try:
494 try:
@@ -484,13 +516,14 b' def reposetup(ui, repo):'
484 self).commit(files=files, text=text, user=user,
516 self).commit(files=files, text=text, user=user,
485 date=date, match=match, force=force,
517 date=date, match=match, force=force,
486 force_editor=force_editor,
518 force_editor=force_editor,
487 p1=p1, p2=p2, extra=extra)
519 p1=p1, p2=p2, extra=extra,
520 empty_ok=empty_ok)
488
521
489 # restore commit hooks
522 # restore commit hooks
490 for name, cmd in commithooks.iteritems():
523 for name, cmd in commithooks.iteritems():
491 ui.setconfig('hooks', name, cmd)
524 ui.setconfig('hooks', name, cmd)
492 if node is not None:
525 if node is not None:
493 _overwrite(ui, self, node=node)
526 kwt.overwrite(node=node)
494 repo.hook('commit', node=node, parent1=_p1, parent2=_p2)
527 repo.hook('commit', node=node, parent1=_p1, parent2=_p2)
495 return node
528 return node
496 finally:
529 finally:
@@ -498,6 +531,9 b' def reposetup(ui, repo):'
498
531
499 repo.__class__ = kwrepo
532 repo.__class__ = kwrepo
500 patch.patchfile.__init__ = _kwpatchfile_init
533 patch.patchfile.__init__ = _kwpatchfile_init
534 patch.diff = _kw_diff
535 webcommands.changeset = webcommands.rev = _kwweb_changeset
536 webcommands.filediff = webcommands.diff = _kwweb_filediff
501
537
502
538
503 cmdtable = {
539 cmdtable = {
@@ -600,11 +600,21 b' class queue:'
600 raise util.Abort(_("local changes found"))
600 raise util.Abort(_("local changes found"))
601 return m, a, r, d
601 return m, a, r, d
602
602
603 _reserved = ('series', 'status', 'guards')
604 def check_reserved_name(self, name):
605 if (name in self._reserved or name.startswith('.hg')
606 or name.startswith('.mq')):
607 raise util.Abort(_('"%s" cannot be used as the name of a patch')
608 % name)
609
603 def new(self, repo, patch, *pats, **opts):
610 def new(self, repo, patch, *pats, **opts):
604 msg = opts.get('msg')
611 msg = opts.get('msg')
605 force = opts.get('force')
612 force = opts.get('force')
606 user = opts.get('user')
613 user = opts.get('user')
607 date = opts.get('date')
614 date = opts.get('date')
615 if date:
616 date = util.parsedate(date)
617 self.check_reserved_name(patch)
608 if os.path.exists(self.join(patch)):
618 if os.path.exists(self.join(patch)):
609 raise util.Abort(_('patch "%s" already exists') % patch)
619 raise util.Abort(_('patch "%s" already exists') % patch)
610 if opts.get('include') or opts.get('exclude') or pats:
620 if opts.get('include') or opts.get('exclude') or pats:
@@ -632,7 +642,7 b' class queue:'
632 p.write("# HG changeset patch\n")
642 p.write("# HG changeset patch\n")
633 if user:
643 if user:
634 p.write("# User " + user + "\n")
644 p.write("# User " + user + "\n")
635 p.write("# Date " + date + "\n")
645 p.write("# Date %d %d\n" % date)
636 p.write("\n")
646 p.write("\n")
637 elif user:
647 elif user:
638 p.write("From: " + user + "\n")
648 p.write("From: " + user + "\n")
@@ -872,10 +882,16 b' class queue:'
872 start = info[0]
882 start = info[0]
873 rev = revlog.bin(info[1])
883 rev = revlog.bin(info[1])
874
884
885 if update:
886 top = self.check_toppatch(repo)
887
888 if repo.changelog.heads(rev) != [revlog.bin(self.applied[-1].rev)]:
889 raise util.Abort("popping would remove a revision not "
890 "managed by this patch queue")
891
875 # we know there are no local changes, so we can make a simplified
892 # we know there are no local changes, so we can make a simplified
876 # form of hg.update.
893 # form of hg.update.
877 if update:
894 if update:
878 top = self.check_toppatch(repo)
879 qp = self.qparents(repo, rev)
895 qp = self.qparents(repo, rev)
880 changes = repo.changelog.read(qp)
896 changes = repo.changelog.read(qp)
881 mmap = repo.manifest.read(changes[0])
897 mmap = repo.manifest.read(changes[0])
@@ -898,8 +914,8 b' class queue:'
898 except: pass
914 except: pass
899 repo.dirstate.forget(f)
915 repo.dirstate.forget(f)
900 repo.dirstate.setparents(qp, revlog.nullid)
916 repo.dirstate.setparents(qp, revlog.nullid)
917 del self.applied[start:end]
901 self.strip(repo, rev, update=False, backup='strip')
918 self.strip(repo, rev, update=False, backup='strip')
902 del self.applied[start:end]
903 if len(self.applied):
919 if len(self.applied):
904 self.ui.write("Now at: %s\n" % self.applied[-1].name)
920 self.ui.write("Now at: %s\n" % self.applied[-1].name)
905 else:
921 else:
@@ -921,11 +937,16 b' class queue:'
921 if len(self.applied) == 0:
937 if len(self.applied) == 0:
922 self.ui.write("No patches applied\n")
938 self.ui.write("No patches applied\n")
923 return 1
939 return 1
940 newdate = opts.get('date')
941 if newdate:
942 newdate = '%d %d' % util.parsedate(newdate)
924 wlock = repo.wlock()
943 wlock = repo.wlock()
925 try:
944 try:
926 self.check_toppatch(repo)
945 self.check_toppatch(repo)
927 (top, patchfn) = (self.applied[-1].rev, self.applied[-1].name)
946 (top, patchfn) = (self.applied[-1].rev, self.applied[-1].name)
928 top = revlog.bin(top)
947 top = revlog.bin(top)
948 if repo.changelog.heads(top) != [top]:
949 raise util.Abort("cannot refresh a revision with children")
929 cparents = repo.changelog.parents(top)
950 cparents = repo.changelog.parents(top)
930 patchparent = self.qparents(repo, top)
951 patchparent = self.qparents(repo, top)
931 message, comments, user, date, patchfound = self.readheaders(patchfn)
952 message, comments, user, date, patchfound = self.readheaders(patchfn)
@@ -979,7 +1000,6 b' class queue:'
979 comments = ['From: ' + newuser, ''] + comments
1000 comments = ['From: ' + newuser, ''] + comments
980 user = newuser
1001 user = newuser
981
1002
982 newdate = opts.get('date')
983 if newdate:
1003 if newdate:
984 if setheaderfield(comments, ['# Date '], newdate):
1004 if setheaderfield(comments, ['# Date '], newdate):
985 date = newdate
1005 date = newdate
@@ -1112,12 +1132,13 b' class queue:'
1112 if not user:
1132 if not user:
1113 user = changes[1]
1133 user = changes[1]
1114
1134
1135 self.applied.pop()
1136 self.applied_dirty = 1
1115 self.strip(repo, top, update=False,
1137 self.strip(repo, top, update=False,
1116 backup='strip')
1138 backup='strip')
1117 n = repo.commit(filelist, message, user, date, match=matchfn,
1139 n = repo.commit(filelist, message, user, date, match=matchfn,
1118 force=1)
1140 force=1)
1119 self.applied[-1] = statusentry(revlog.hex(n), patchfn)
1141 self.applied.append(statusentry(revlog.hex(n), patchfn))
1120 self.applied_dirty = 1
1121 self.removeundo(repo)
1142 self.removeundo(repo)
1122 else:
1143 else:
1123 self.printdiff(repo, patchparent, fp=patchf)
1144 self.printdiff(repo, patchparent, fp=patchf)
@@ -1406,6 +1427,7 b' class queue:'
1406
1427
1407 if not patchname:
1428 if not patchname:
1408 patchname = normname('%d.diff' % r)
1429 patchname = normname('%d.diff' % r)
1430 self.check_reserved_name(patchname)
1409 checkseries(patchname)
1431 checkseries(patchname)
1410 checkfile(patchname)
1432 checkfile(patchname)
1411 self.full_series.insert(0, patchname)
1433 self.full_series.insert(0, patchname)
@@ -1428,6 +1450,7 b' class queue:'
1428 raise util.Abort(_('-e is incompatible with import from -'))
1450 raise util.Abort(_('-e is incompatible with import from -'))
1429 if not patchname:
1451 if not patchname:
1430 patchname = normname(filename)
1452 patchname = normname(filename)
1453 self.check_reserved_name(patchname)
1431 if not os.path.isfile(self.join(patchname)):
1454 if not os.path.isfile(self.join(patchname)):
1432 raise util.Abort(_("patch %s does not exist") % patchname)
1455 raise util.Abort(_("patch %s does not exist") % patchname)
1433 else:
1456 else:
@@ -1437,11 +1460,12 b' class queue:'
1437 raise util.Abort(_('need --name to import a patch from -'))
1460 raise util.Abort(_('need --name to import a patch from -'))
1438 text = sys.stdin.read()
1461 text = sys.stdin.read()
1439 else:
1462 else:
1440 text = file(filename).read()
1463 text = file(filename, 'rb').read()
1441 except IOError:
1464 except IOError:
1442 raise util.Abort(_("unable to read %s") % patchname)
1465 raise util.Abort(_("unable to read %s") % patchname)
1443 if not patchname:
1466 if not patchname:
1444 patchname = normname(os.path.basename(filename))
1467 patchname = normname(os.path.basename(filename))
1468 self.check_reserved_name(patchname)
1445 checkfile(patchname)
1469 checkfile(patchname)
1446 patchf = self.opener(patchname, "w")
1470 patchf = self.opener(patchname, "w")
1447 patchf.write(text)
1471 patchf.write(text)
@@ -1534,6 +1558,8 b' def init(ui, repo, **opts):'
1534 if r:
1558 if r:
1535 if not os.path.exists(r.wjoin('.hgignore')):
1559 if not os.path.exists(r.wjoin('.hgignore')):
1536 fp = r.wopener('.hgignore', 'w')
1560 fp = r.wopener('.hgignore', 'w')
1561 fp.write('^\\.hg\n')
1562 fp.write('^\\.mq\n')
1537 fp.write('syntax: glob\n')
1563 fp.write('syntax: glob\n')
1538 fp.write('status\n')
1564 fp.write('status\n')
1539 fp.write('guards\n')
1565 fp.write('guards\n')
@@ -2147,6 +2173,12 b' def reposetup(ui, repo):'
2147 return tagscache
2173 return tagscache
2148
2174
2149 mqtags = [(revlog.bin(patch.rev), patch.name) for patch in q.applied]
2175 mqtags = [(revlog.bin(patch.rev), patch.name) for patch in q.applied]
2176
2177 if mqtags[-1][0] not in self.changelog.nodemap:
2178 self.ui.warn('mq status file refers to unknown node %s\n'
2179 % revlog.short(mqtags[-1][0]))
2180 return tagscache
2181
2150 mqtags.append((mqtags[-1][0], 'qtip'))
2182 mqtags.append((mqtags[-1][0], 'qtip'))
2151 mqtags.append((mqtags[0][0], 'qbase'))
2183 mqtags.append((mqtags[0][0], 'qbase'))
2152 mqtags.append((self.changelog.parents(mqtags[0][0])[0], 'qparent'))
2184 mqtags.append((self.changelog.parents(mqtags[0][0])[0], 'qparent'))
@@ -2158,16 +2190,19 b' def reposetup(ui, repo):'
2158
2190
2159 return tagscache
2191 return tagscache
2160
2192
2161 def _branchtags(self):
2193 def _branchtags(self, partial, lrev):
2162 q = self.mq
2194 q = self.mq
2163 if not q.applied:
2195 if not q.applied:
2164 return super(mqrepo, self)._branchtags()
2196 return super(mqrepo, self)._branchtags(partial, lrev)
2165
2197
2166 self.branchcache = {} # avoid recursion in changectx
2167 cl = self.changelog
2198 cl = self.changelog
2168 partial, last, lrev = self._readbranchcache()
2199 qbasenode = revlog.bin(q.applied[0].rev)
2200 if qbasenode not in cl.nodemap:
2201 self.ui.warn('mq status file refers to unknown node %s\n'
2202 % revlog.short(qbasenode))
2203 return super(mqrepo, self)._branchtags(partial, lrev)
2169
2204
2170 qbase = cl.rev(revlog.bin(q.applied[0].rev))
2205 qbase = cl.rev(qbasenode)
2171 start = lrev + 1
2206 start = lrev + 1
2172 if start < qbase:
2207 if start < qbase:
2173 # update the cache (excluding the patches) and save it
2208 # update the cache (excluding the patches) and save it
@@ -2213,8 +2248,9 b' cmdtable = {'
2213 "^qdiff":
2248 "^qdiff":
2214 (diff,
2249 (diff,
2215 [('g', 'git', None, _('use git extended diff format')),
2250 [('g', 'git', None, _('use git extended diff format')),
2251 ('U', 'unified', 3, _('number of lines of context to show')),
2216 ] + commands.walkopts,
2252 ] + commands.walkopts,
2217 _('hg qdiff [-I] [-X] [-g] [FILE]...')),
2253 _('hg qdiff [-I] [-X] [-U NUM] [-g] [FILE]...')),
2218 "qdelete|qremove|qrm":
2254 "qdelete|qremove|qrm":
2219 (delete,
2255 (delete,
2220 [('k', 'keep', None, _('keep patch file')),
2256 [('k', 'keep', None, _('keep patch file')),
@@ -9,9 +9,9 b''
9 # enable importing on demand to reduce startup time
9 # enable importing on demand to reduce startup time
10 from mercurial import demandimport; demandimport.enable()
10 from mercurial import demandimport; demandimport.enable()
11
11
12 # send python tracebacks to the browser if an error occurs:
12 # Uncomment to send python tracebacks to the browser if an error occurs:
13 import cgitb
13 #import cgitb
14 cgitb.enable()
14 #cgitb.enable()
15
15
16 # If you'd like to serve pages with UTF-8 instead of your default
16 # If you'd like to serve pages with UTF-8 instead of your default
17 # locale charset, you can do so by uncommenting the following lines.
17 # locale charset, you can do so by uncommenting the following lines.
@@ -9,9 +9,9 b''
9 # enable importing on demand to reduce startup time
9 # enable importing on demand to reduce startup time
10 from mercurial import demandimport; demandimport.enable()
10 from mercurial import demandimport; demandimport.enable()
11
11
12 # send python tracebacks to the browser if an error occurs:
12 # Uncomment to send python tracebacks to the browser if an error occurs:
13 import cgitb
13 #import cgitb
14 cgitb.enable()
14 #cgitb.enable()
15
15
16 # If you'd like to serve pages with UTF-8 instead of your default
16 # If you'd like to serve pages with UTF-8 instead of your default
17 # locale charset, you can do so by uncommenting the following lines.
17 # locale charset, you can do so by uncommenting the following lines.
@@ -208,6 +208,8 b' def archive(repo, dest, node, kind, deco'
208 archiver.addfile(name, mode, islink, data)
208 archiver.addfile(name, mode, islink, data)
209
209
210 ctx = repo.changectx(node)
210 ctx = repo.changectx(node)
211 if kind not in archivers:
212 raise util.Abort(_("unknown archive type '%s'" % kind))
211 archiver = archivers[kind](dest, prefix, mtime or ctx.date()[0])
213 archiver = archivers[kind](dest, prefix, mtime or ctx.date()[0])
212 m = ctx.manifest()
214 m = ctx.manifest()
213 items = m.items()
215 items = m.items()
@@ -154,8 +154,10 b' class bundlerepository(localrepo.localre'
154 def __init__(self, ui, path, bundlename):
154 def __init__(self, ui, path, bundlename):
155 localrepo.localrepository.__init__(self, ui, path)
155 localrepo.localrepository.__init__(self, ui, path)
156
156
157 self._url = 'bundle:' + bundlename
157 if path:
158 if path: self._url += '+' + path
158 self._url = 'bundle:' + path + '+' + bundlename
159 else:
160 self._url = 'bundle:' + bundlename
159
161
160 self.tempfile = None
162 self.tempfile = None
161 self.bundlefile = open(bundlename, "rb")
163 self.bundlefile = open(bundlename, "rb")
@@ -1115,6 +1115,9 b' def walkchangerevs(ui, repo, pats, chang'
1115
1115
1116 def commit(ui, repo, commitfunc, pats, opts):
1116 def commit(ui, repo, commitfunc, pats, opts):
1117 '''commit the specified files or all outstanding changes'''
1117 '''commit the specified files or all outstanding changes'''
1118 date = opts.get('date')
1119 if date:
1120 opts['date'] = util.parsedate(date)
1118 message = logmessage(opts)
1121 message = logmessage(opts)
1119
1122
1120 # extract addremove carefully -- this function can be called from a command
1123 # extract addremove carefully -- this function can be called from a command
@@ -1133,10 +1136,11 b' def commit(ui, repo, commitfunc, pats, o'
1133 continue
1136 continue
1134 if f not in files:
1137 if f not in files:
1135 rf = repo.wjoin(f)
1138 rf = repo.wjoin(f)
1139 rel = repo.pathto(f)
1136 try:
1140 try:
1137 mode = os.lstat(rf)[stat.ST_MODE]
1141 mode = os.lstat(rf)[stat.ST_MODE]
1138 except OSError:
1142 except OSError:
1139 raise util.Abort(_("file %s not found!") % rf)
1143 raise util.Abort(_("file %s not found!") % rel)
1140 if stat.S_ISDIR(mode):
1144 if stat.S_ISDIR(mode):
1141 name = f + '/'
1145 name = f + '/'
1142 if slist is None:
1146 if slist is None:
@@ -1145,12 +1149,12 b' def commit(ui, repo, commitfunc, pats, o'
1145 i = bisect.bisect(slist, name)
1149 i = bisect.bisect(slist, name)
1146 if i >= len(slist) or not slist[i].startswith(name):
1150 if i >= len(slist) or not slist[i].startswith(name):
1147 raise util.Abort(_("no match under directory %s!")
1151 raise util.Abort(_("no match under directory %s!")
1148 % rf)
1152 % rel)
1149 elif not (stat.S_ISREG(mode) or stat.S_ISLNK(mode)):
1153 elif not (stat.S_ISREG(mode) or stat.S_ISLNK(mode)):
1150 raise util.Abort(_("can't commit %s: "
1154 raise util.Abort(_("can't commit %s: "
1151 "unsupported file type!") % rf)
1155 "unsupported file type!") % rel)
1152 elif f not in repo.dirstate:
1156 elif f not in repo.dirstate:
1153 raise util.Abort(_("file %s not tracked!") % rf)
1157 raise util.Abort(_("file %s not tracked!") % rel)
1154 else:
1158 else:
1155 files = []
1159 files = []
1156 try:
1160 try:
@@ -78,7 +78,8 b' def annotate(ui, repo, *pats, **opts):'
78 detects as binary. With -a, annotate will generate an annotation
78 detects as binary. With -a, annotate will generate an annotation
79 anyway, probably with undesirable results.
79 anyway, probably with undesirable results.
80 """
80 """
81 getdate = util.cachefunc(lambda x: util.datestr(x[0].date()))
81 datefunc = ui.quiet and util.shortdate or util.datestr
82 getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
82
83
83 if not pats:
84 if not pats:
84 raise util.Abort(_('at least one file name or pattern required'))
85 raise util.Abort(_('at least one file name or pattern required'))
@@ -195,6 +196,10 b' def backout(ui, repo, node=None, rev=Non'
195 if not rev:
196 if not rev:
196 raise util.Abort(_("please specify a revision to backout"))
197 raise util.Abort(_("please specify a revision to backout"))
197
198
199 date = opts.get('date')
200 if date:
201 opts['date'] = util.parsedate(date)
202
198 cmdutil.bail_if_changed(repo)
203 cmdutil.bail_if_changed(repo)
199 node = repo.lookup(rev)
204 node = repo.lookup(rev)
200
205
@@ -225,6 +230,7 b' def backout(ui, repo, node=None, rev=Non'
225 revert_opts['date'] = None
230 revert_opts['date'] = None
226 revert_opts['all'] = True
231 revert_opts['all'] = True
227 revert_opts['rev'] = hex(parent)
232 revert_opts['rev'] = hex(parent)
233 revert_opts['no_backup'] = None
228 revert(ui, repo, **revert_opts)
234 revert(ui, repo, **revert_opts)
229 commit_opts = opts.copy()
235 commit_opts = opts.copy()
230 commit_opts['addremove'] = False
236 commit_opts['addremove'] = False
@@ -339,6 +345,8 b' def branch(ui, repo, label=None, **opts)'
339
345
340 Unless --force is specified, branch will not let you set a
346 Unless --force is specified, branch will not let you set a
341 branch name that shadows an existing branch.
347 branch name that shadows an existing branch.
348
349 Use the command 'hg update' to switch to an existing branch.
342 """
350 """
343
351
344 if label:
352 if label:
@@ -358,6 +366,8 b' def branches(ui, repo, active=False):'
358 inactive. If active is specified, only show active branches.
366 inactive. If active is specified, only show active branches.
359
367
360 A branch is considered active if it contains unmerged heads.
368 A branch is considered active if it contains unmerged heads.
369
370 Use the command 'hg update' to switch to an existing branch.
361 """
371 """
362 b = repo.branchtags()
372 b = repo.branchtags()
363 heads = dict.fromkeys(repo.heads(), 1)
373 heads = dict.fromkeys(repo.heads(), 1)
@@ -461,7 +471,10 b' def cat(ui, repo, file1, *pats, **opts):'
461 for src, abs, rel, exact in cmdutil.walk(repo, (file1,) + pats, opts,
471 for src, abs, rel, exact in cmdutil.walk(repo, (file1,) + pats, opts,
462 ctx.node()):
472 ctx.node()):
463 fp = cmdutil.make_file(repo, opts['output'], ctx.node(), pathname=abs)
473 fp = cmdutil.make_file(repo, opts['output'], ctx.node(), pathname=abs)
464 fp.write(ctx.filectx(abs).data())
474 data = ctx.filectx(abs).data()
475 if opts.get('decode'):
476 data = repo.wwritedata(abs, data)
477 fp.write(data)
465 err = 0
478 err = 0
466 return err
479 return err
467
480
@@ -809,40 +822,6 b' def debuginstall(ui):'
809 os.unlink(fa)
822 os.unlink(fa)
810 os.unlink(fd)
823 os.unlink(fd)
811
824
812 # merge helper
813 ui.status(_("Checking merge helper...\n"))
814 cmd = (os.environ.get("HGMERGE") or ui.config("ui", "merge")
815 or "hgmerge")
816 cmdpath = util.find_exe(cmd) or util.find_exe(cmd.split()[0])
817 if not cmdpath:
818 if cmd == 'hgmerge':
819 ui.write(_(" No merge helper set and can't find default"
820 " hgmerge script in PATH\n"))
821 ui.write(_(" (specify a merge helper in your .hgrc file)\n"))
822 else:
823 ui.write(_(" Can't find merge helper '%s' in PATH\n") % cmd)
824 ui.write(_(" (specify a merge helper in your .hgrc file)\n"))
825 problems += 1
826 else:
827 # actually attempt a patch here
828 fa = writetemp("1\n2\n3\n4\n")
829 fl = writetemp("1\n2\n3\ninsert\n4\n")
830 fr = writetemp("begin\n1\n2\n3\n4\n")
831 r = util.system('%s "%s" "%s" "%s"' % (cmd, fl, fa, fr))
832 if r:
833 ui.write(_(" Got unexpected merge error %d!\n") % r)
834 problems += 1
835 m = file(fl).read()
836 if m != "begin\n1\n2\n3\ninsert\n4\n":
837 ui.write(_(" Got unexpected merge results!\n"))
838 ui.write(_(" (your merge helper may have the"
839 " wrong argument order)\n"))
840 ui.write(_(" Result: %r\n") % m)
841 problems += 1
842 os.unlink(fa)
843 os.unlink(fl)
844 os.unlink(fr)
845
846 # editor
825 # editor
847 ui.status(_("Checking commit editor...\n"))
826 ui.status(_("Checking commit editor...\n"))
848 editor = ui.geteditor()
827 editor = ui.geteditor()
@@ -992,7 +971,7 b' def grep(ui, repo, pattern, *pats, **opt'
992 try:
971 try:
993 regexp = re.compile(pattern, reflags)
972 regexp = re.compile(pattern, reflags)
994 except Exception, inst:
973 except Exception, inst:
995 ui.warn(_("grep: invalid match pattern: %s!\n") % inst)
974 ui.warn(_("grep: invalid match pattern: %s\n") % inst)
996 return None
975 return None
997 sep, eol = ':', '\n'
976 sep, eol = ':', '\n'
998 if opts['print0']:
977 if opts['print0']:
@@ -1054,6 +1033,7 b' def grep(ui, repo, pattern, *pats, **opt'
1054
1033
1055 prev = {}
1034 prev = {}
1056 def display(fn, rev, states, prevstates):
1035 def display(fn, rev, states, prevstates):
1036 datefunc = ui.quiet and util.shortdate or util.datestr
1057 found = False
1037 found = False
1058 filerevmatches = {}
1038 filerevmatches = {}
1059 r = prev.get(fn, -1)
1039 r = prev.get(fn, -1)
@@ -1069,6 +1049,8 b' def grep(ui, repo, pattern, *pats, **opt'
1069 cols.append(change)
1049 cols.append(change)
1070 if opts['user']:
1050 if opts['user']:
1071 cols.append(ui.shortuser(get(r)[1]))
1051 cols.append(ui.shortuser(get(r)[1]))
1052 if opts.get('date'):
1053 cols.append(datefunc(get(r)[2]))
1072 if opts['files_with_matches']:
1054 if opts['files_with_matches']:
1073 c = (fn, r)
1055 c = (fn, r)
1074 if c in filerevmatches:
1056 if c in filerevmatches:
@@ -1462,6 +1444,10 b' def import_(ui, repo, patch1, *patches, '
1462 """
1444 """
1463 patches = (patch1,) + patches
1445 patches = (patch1,) + patches
1464
1446
1447 date = opts.get('date')
1448 if date:
1449 opts['date'] = util.parsedate(date)
1450
1465 if opts.get('exact') or not opts['force']:
1451 if opts.get('exact') or not opts['force']:
1466 cmdutil.bail_if_changed(repo)
1452 cmdutil.bail_if_changed(repo)
1467
1453
@@ -1536,6 +1522,9 b' def import_(ui, repo, patch1, *patches, '
1536 repo.rollback()
1522 repo.rollback()
1537 raise util.Abort(_('patch is damaged'
1523 raise util.Abort(_('patch is damaged'
1538 ' or loses information'))
1524 ' or loses information'))
1525 # Force a dirstate write so that the next transaction
1526 # backups an up-do-date file.
1527 repo.dirstate.write()
1539 finally:
1528 finally:
1540 os.unlink(tmpname)
1529 os.unlink(tmpname)
1541 finally:
1530 finally:
@@ -1739,6 +1728,8 b' def log(ui, repo, *pats, **opts):'
1739 if opts["date"]:
1728 if opts["date"]:
1740 df = util.matchdate(opts["date"])
1729 df = util.matchdate(opts["date"])
1741
1730
1731 only_branches = opts['only_branch']
1732
1742 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
1733 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
1743 for st, rev, fns in changeiter:
1734 for st, rev, fns in changeiter:
1744 if st == 'add':
1735 if st == 'add':
@@ -1750,6 +1741,11 b' def log(ui, repo, *pats, **opts):'
1750 if opts['only_merges'] and len(parents) != 2:
1741 if opts['only_merges'] and len(parents) != 2:
1751 continue
1742 continue
1752
1743
1744 if only_branches:
1745 revbranch = get(rev)[5]['branch']
1746 if revbranch not in only_branches:
1747 continue
1748
1753 if df:
1749 if df:
1754 changes = get(rev)
1750 changes = get(rev)
1755 if not df(changes[2][0]):
1751 if not df(changes[2][0]):
@@ -2223,16 +2219,16 b' def revert(ui, repo, *pats, **opts):'
2223 # but not other.
2219 # but not other.
2224
2220
2225 names = {}
2221 names = {}
2226 target_only = {}
2227
2222
2228 wlock = repo.wlock()
2223 wlock = repo.wlock()
2229 try:
2224 try:
2230 # walk dirstate.
2225 # walk dirstate.
2226 files = []
2231 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts,
2227 for src, abs, rel, exact in cmdutil.walk(repo, pats, opts,
2232 badmatch=mf.has_key):
2228 badmatch=mf.has_key):
2233 names[abs] = (rel, exact)
2229 names[abs] = (rel, exact)
2234 if src == 'b':
2230 if src != 'b':
2235 target_only[abs] = True
2231 files.append(abs)
2236
2232
2237 # walk target manifest.
2233 # walk target manifest.
2238
2234
@@ -2250,10 +2246,9 b' def revert(ui, repo, *pats, **opts):'
2250 if abs in names or src == 'b':
2246 if abs in names or src == 'b':
2251 continue
2247 continue
2252 names[abs] = (rel, exact)
2248 names[abs] = (rel, exact)
2253 target_only[abs] = True
2249
2254
2250 changes = repo.status(files=files, match=names.has_key)[:4]
2255 changes = repo.status(match=names.has_key)[:5]
2251 modified, added, removed, deleted = map(dict.fromkeys, changes)
2256 modified, added, removed, deleted, unknown = map(dict.fromkeys, changes)
2257
2252
2258 # if f is a rename, also revert the source
2253 # if f is a rename, also revert the source
2259 cwd = repo.getcwd()
2254 cwd = repo.getcwd()
@@ -2263,12 +2258,15 b' def revert(ui, repo, *pats, **opts):'
2263 removed[src] = None
2258 removed[src] = None
2264 names[src] = (repo.pathto(src, cwd), True)
2259 names[src] = (repo.pathto(src, cwd), True)
2265
2260
2261 def removeforget(abs):
2262 if repo.dirstate[abs] == 'a':
2263 return _('forgetting %s\n')
2264 return _('removing %s\n')
2265
2266 revert = ([], _('reverting %s\n'))
2266 revert = ([], _('reverting %s\n'))
2267 add = ([], _('adding %s\n'))
2267 add = ([], _('adding %s\n'))
2268 remove = ([], _('removing %s\n'))
2268 remove = ([], removeforget)
2269 forget = ([], _('forgetting %s\n'))
2270 undelete = ([], _('undeleting %s\n'))
2269 undelete = ([], _('undeleting %s\n'))
2271 update = {}
2272
2270
2273 disptable = (
2271 disptable = (
2274 # dispatch table:
2272 # dispatch table:
@@ -2278,11 +2276,9 b' def revert(ui, repo, *pats, **opts):'
2278 # make backup if in target manifest
2276 # make backup if in target manifest
2279 # make backup if not in target manifest
2277 # make backup if not in target manifest
2280 (modified, revert, remove, True, True),
2278 (modified, revert, remove, True, True),
2281 (added, revert, forget, True, False),
2279 (added, revert, remove, True, False),
2282 (removed, undelete, None, False, False),
2280 (removed, undelete, None, False, False),
2283 (deleted, revert, remove, False, False),
2281 (deleted, revert, remove, False, False),
2284 (unknown, add, None, True, False),
2285 (target_only, add, None, False, False),
2286 )
2282 )
2287
2283
2288 entries = names.items()
2284 entries = names.items()
@@ -2293,7 +2289,6 b' def revert(ui, repo, *pats, **opts):'
2293 target = repo.wjoin(abs)
2289 target = repo.wjoin(abs)
2294 def handle(xlist, dobackup):
2290 def handle(xlist, dobackup):
2295 xlist[0].append(abs)
2291 xlist[0].append(abs)
2296 update[abs] = 1
2297 if dobackup and not opts['no_backup'] and util.lexists(target):
2292 if dobackup and not opts['no_backup'] and util.lexists(target):
2298 bakname = "%s.orig" % rel
2293 bakname = "%s.orig" % rel
2299 ui.note(_('saving current version of %s as %s\n') %
2294 ui.note(_('saving current version of %s as %s\n') %
@@ -2301,7 +2296,10 b' def revert(ui, repo, *pats, **opts):'
2301 if not opts.get('dry_run'):
2296 if not opts.get('dry_run'):
2302 util.copyfile(target, bakname)
2297 util.copyfile(target, bakname)
2303 if ui.verbose or not exact:
2298 if ui.verbose or not exact:
2304 ui.status(xlist[1] % rel)
2299 msg = xlist[1]
2300 if not isinstance(msg, basestring):
2301 msg = msg(abs)
2302 ui.status(msg % rel)
2305 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2303 for table, hitlist, misslist, backuphit, backupmiss in disptable:
2306 if abs not in table: continue
2304 if abs not in table: continue
2307 # file has changed in dirstate
2305 # file has changed in dirstate
@@ -2309,10 +2307,14 b' def revert(ui, repo, *pats, **opts):'
2309 handle(hitlist, backuphit)
2307 handle(hitlist, backuphit)
2310 elif misslist is not None:
2308 elif misslist is not None:
2311 handle(misslist, backupmiss)
2309 handle(misslist, backupmiss)
2312 else:
2313 if exact: ui.warn(_('file not managed: %s\n') % rel)
2314 break
2310 break
2315 else:
2311 else:
2312 if abs not in repo.dirstate:
2313 if mfentry:
2314 handle(add, True)
2315 elif exact:
2316 ui.warn(_('file not managed: %s\n') % rel)
2317 continue
2316 # file has not changed in dirstate
2318 # file has not changed in dirstate
2317 if node == parent:
2319 if node == parent:
2318 if exact: ui.warn(_('no changes needed to %s\n') % rel)
2320 if exact: ui.warn(_('no changes needed to %s\n') % rel)
@@ -2325,22 +2327,43 b' def revert(ui, repo, *pats, **opts):'
2325 if mfentry:
2327 if mfentry:
2326 # if version of file is same in parent and target
2328 # if version of file is same in parent and target
2327 # manifests, do nothing
2329 # manifests, do nothing
2328 if pmf[abs] != mfentry:
2330 if (pmf[abs] != mfentry or
2331 pmf.flags(abs) != mf.flags(abs)):
2329 handle(revert, False)
2332 handle(revert, False)
2330 else:
2333 else:
2331 handle(remove, False)
2334 handle(remove, False)
2332
2335
2333 if not opts.get('dry_run'):
2336 if not opts.get('dry_run'):
2334 for f in forget[0]:
2337 def checkout(f):
2335 repo.dirstate.forget(f)
2338 fc = ctx[f]
2336 r = hg.revert(repo, node, update.has_key)
2339 repo.wwrite(f, fc.data(), fc.fileflags())
2340
2341 audit_path = util.path_auditor(repo.root)
2342 for f in remove[0]:
2343 if repo.dirstate[f] == 'a':
2344 repo.dirstate.forget(f)
2345 continue
2346 audit_path(f)
2347 try:
2348 util.unlink(repo.wjoin(f))
2349 except OSError:
2350 pass
2351 repo.dirstate.remove(f)
2352
2353 for f in revert[0]:
2354 checkout(f)
2355
2337 for f in add[0]:
2356 for f in add[0]:
2357 checkout(f)
2338 repo.dirstate.add(f)
2358 repo.dirstate.add(f)
2359
2360 normal = repo.dirstate.normallookup
2361 if node == parent and p2 == nullid:
2362 normal = repo.dirstate.normal
2339 for f in undelete[0]:
2363 for f in undelete[0]:
2340 repo.dirstate.normal(f)
2364 checkout(f)
2341 for f in remove[0]:
2365 normal(f)
2342 repo.dirstate.remove(f)
2366
2343 return r
2344 finally:
2367 finally:
2345 del wlock
2368 del wlock
2346
2369
@@ -2441,8 +2464,10 b' def status(ui, repo, *pats, **opts):'
2441 """show changed files in the working directory
2464 """show changed files in the working directory
2442
2465
2443 Show status of files in the repository. If names are given, only
2466 Show status of files in the repository. If names are given, only
2444 files that match are shown. Files that are clean or ignored, are
2467 files that match are shown. Files that are clean or ignored or
2445 not listed unless -c (clean), -i (ignored) or -A is given.
2468 source of a copy/move operation, are not listed unless -c (clean),
2469 -i (ignored), -C (copies) or -A is given. Unless options described
2470 with "show only ..." are given, the options -mardu are used.
2446
2471
2447 NOTE: status may appear to disagree with diff if permissions have
2472 NOTE: status may appear to disagree with diff if permissions have
2448 changed or a merge has occurred. The standard diff format does not
2473 changed or a merge has occurred. The standard diff format does not
@@ -2459,7 +2484,7 b' def status(ui, repo, *pats, **opts):'
2459 C = clean
2484 C = clean
2460 ! = deleted, but still tracked
2485 ! = deleted, but still tracked
2461 ? = not tracked
2486 ? = not tracked
2462 I = ignored (not shown by default)
2487 I = ignored
2463 = the previous added file was copied from here
2488 = the previous added file was copied from here
2464 """
2489 """
2465
2490
@@ -2727,8 +2752,8 b' table = {'
2727 [('r', 'rev', '', _('annotate the specified revision')),
2752 [('r', 'rev', '', _('annotate the specified revision')),
2728 ('f', 'follow', None, _('follow file copies and renames')),
2753 ('f', 'follow', None, _('follow file copies and renames')),
2729 ('a', 'text', None, _('treat all files as text')),
2754 ('a', 'text', None, _('treat all files as text')),
2730 ('u', 'user', None, _('list the author')),
2755 ('u', 'user', None, _('list the author (long with -v)')),
2731 ('d', 'date', None, _('list the date')),
2756 ('d', 'date', None, _('list the date (short with -q)')),
2732 ('n', 'number', None, _('list the revision number (default)')),
2757 ('n', 'number', None, _('list the revision number (default)')),
2733 ('c', 'changeset', None, _('list the changeset')),
2758 ('c', 'changeset', None, _('list the changeset')),
2734 ('l', 'line-number', None,
2759 ('l', 'line-number', None,
@@ -2783,6 +2808,7 b' table = {'
2783 (cat,
2808 (cat,
2784 [('o', 'output', '', _('print output to file with formatted name')),
2809 [('o', 'output', '', _('print output to file with formatted name')),
2785 ('r', 'rev', '', _('print the given revision')),
2810 ('r', 'rev', '', _('print the given revision')),
2811 ('', 'decode', None, _('apply any matching decode filter')),
2786 ] + walkopts,
2812 ] + walkopts,
2787 _('hg cat [OPTION]... FILE...')),
2813 _('hg cat [OPTION]... FILE...')),
2788 "^clone":
2814 "^clone":
@@ -2857,6 +2883,8 b' table = {'
2857 _('ignore changes in the amount of white space')),
2883 _('ignore changes in the amount of white space')),
2858 ('B', 'ignore-blank-lines', None,
2884 ('B', 'ignore-blank-lines', None,
2859 _('ignore changes whose lines are all blank')),
2885 _('ignore changes whose lines are all blank')),
2886 ('U', 'unified', 3,
2887 _('number of lines of context to show'))
2860 ] + walkopts,
2888 ] + walkopts,
2861 _('hg diff [OPTION]... [-r REV1 [-r REV2]] [FILE]...')),
2889 _('hg diff [OPTION]... [-r REV1 [-r REV2]] [FILE]...')),
2862 "^export":
2890 "^export":
@@ -2878,7 +2906,8 b' table = {'
2878 _('print only filenames and revs that match')),
2906 _('print only filenames and revs that match')),
2879 ('n', 'line-number', None, _('print matching line numbers')),
2907 ('n', 'line-number', None, _('print matching line numbers')),
2880 ('r', 'rev', [], _('search in given revision range')),
2908 ('r', 'rev', [], _('search in given revision range')),
2881 ('u', 'user', None, _('print user who committed change')),
2909 ('u', 'user', None, _('list the author (long with -v)')),
2910 ('d', 'date', None, _('list the date (short with -q)')),
2882 ] + walkopts,
2911 ] + walkopts,
2883 _('hg grep [OPTION]... PATTERN [FILE]...')),
2912 _('hg grep [OPTION]... PATTERN [FILE]...')),
2884 "heads":
2913 "heads":
@@ -2953,6 +2982,8 b' table = {'
2953 ('M', 'no-merges', None, _('do not show merges')),
2982 ('M', 'no-merges', None, _('do not show merges')),
2954 ('', 'style', '', _('display using template map file')),
2983 ('', 'style', '', _('display using template map file')),
2955 ('m', 'only-merges', None, _('show only merges')),
2984 ('m', 'only-merges', None, _('show only merges')),
2985 ('b', 'only-branch', [],
2986 _('show only changesets within the given named branch')),
2956 ('p', 'patch', None, _('show patch')),
2987 ('p', 'patch', None, _('show patch')),
2957 ('P', 'prune', [], _('do not display revision or any of its ancestors')),
2988 ('P', 'prune', [], _('do not display revision or any of its ancestors')),
2958 ('', 'template', '', _('display with template')),
2989 ('', 'template', '', _('display with template')),
@@ -197,7 +197,8 b' class dirstate(object):'
197
197
198 def _incpathcheck(self, f):
198 def _incpathcheck(self, f):
199 if '\r' in f or '\n' in f:
199 if '\r' in f or '\n' in f:
200 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames"))
200 raise util.Abort(_("'\\n' and '\\r' disallowed in filenames: %r")
201 % f)
201 # shadows
202 # shadows
202 if f in self._dirs:
203 if f in self._dirs:
203 raise util.Abort(_('directory %r already in dirstate') % f)
204 raise util.Abort(_('directory %r already in dirstate') % f)
@@ -286,7 +287,7 b' class dirstate(object):'
286 self._changepath(f, '?')
287 self._changepath(f, '?')
287 del self._map[f]
288 del self._map[f]
288 except KeyError:
289 except KeyError:
289 self._ui.warn(_("not in dirstate: %s!\n") % f)
290 self._ui.warn(_("not in dirstate: %s\n") % f)
290
291
291 def clear(self):
292 def clear(self):
292 self._map = {}
293 self._map = {}
@@ -369,6 +370,14 b' class dirstate(object):'
369 % (self.pathto(f), kind))
370 % (self.pathto(f), kind))
370 return False
371 return False
371
372
373 def _dirignore(self, f):
374 if self._ignore(f):
375 return True
376 for c in strutil.findall(f, '/'):
377 if self._ignore(f[:c]):
378 return True
379 return False
380
372 def walk(self, files=None, match=util.always, badmatch=None):
381 def walk(self, files=None, match=util.always, badmatch=None):
373 # filter out the stat
382 # filter out the stat
374 for src, f, st in self.statwalk(files, match, badmatch=badmatch):
383 for src, f, st in self.statwalk(files, match, badmatch=badmatch):
@@ -404,9 +413,11 b' class dirstate(object):'
404 return match(file_)
413 return match(file_)
405
414
406 ignore = self._ignore
415 ignore = self._ignore
416 dirignore = self._dirignore
407 if ignored:
417 if ignored:
408 imatch = match
418 imatch = match
409 ignore = util.never
419 ignore = util.never
420 dirignore = util.never
410
421
411 # self._root may end with a path separator when self._root == '/'
422 # self._root may end with a path separator when self._root == '/'
412 common_prefix_len = len(self._root)
423 common_prefix_len = len(self._root)
@@ -492,8 +503,9 b' class dirstate(object):'
492 yield 'b', ff, None
503 yield 'b', ff, None
493 continue
504 continue
494 if s_isdir(st.st_mode):
505 if s_isdir(st.st_mode):
495 for f, src, st in findfiles(f):
506 if not dirignore(nf):
496 yield src, f, st
507 for f, src, st in findfiles(f):
508 yield src, f, st
497 else:
509 else:
498 if nf in known:
510 if nf in known:
499 continue
511 continue
@@ -519,6 +531,7 b' class dirstate(object):'
519 lookup, modified, added, unknown, ignored = [], [], [], [], []
531 lookup, modified, added, unknown, ignored = [], [], [], [], []
520 removed, deleted, clean = [], [], []
532 removed, deleted, clean = [], [], []
521
533
534 files = files or []
522 _join = self._join
535 _join = self._join
523 lstat = os.lstat
536 lstat = os.lstat
524 cmap = self._copymap
537 cmap = self._copymap
@@ -536,8 +549,9 b' class dirstate(object):'
536 if fn in dmap:
549 if fn in dmap:
537 type_, mode, size, time, foo = dmap[fn]
550 type_, mode, size, time, foo = dmap[fn]
538 else:
551 else:
539 if list_ignored and self._ignore(fn):
552 if (list_ignored or fn in files) and self._dirignore(fn):
540 iadd(fn)
553 if list_ignored:
554 iadd(fn)
541 else:
555 else:
542 uadd(fn)
556 uadd(fn)
543 continue
557 continue
@@ -555,7 +569,7 b' class dirstate(object):'
555 nonexistent = False
569 nonexistent = False
556 # XXX: what to do with file no longer present in the fs
570 # XXX: what to do with file no longer present in the fs
557 # who are not removed in the dirstate ?
571 # who are not removed in the dirstate ?
558 if nonexistent and type_ in "nm":
572 if nonexistent and type_ in "nma":
559 dadd(fn)
573 dadd(fn)
560 continue
574 continue
561 # check the common case first
575 # check the common case first
@@ -340,9 +340,9 b' def _dispatch(ui, args):'
340 try:
340 try:
341 repo = hg.repository(ui, path=path)
341 repo = hg.repository(ui, path=path)
342 ui = repo.ui
342 ui = repo.ui
343 ui.setconfig("bundle", "mainreporoot", repo.root)
344 if not repo.local():
343 if not repo.local():
345 raise util.Abort(_("repository '%s' is not local") % path)
344 raise util.Abort(_("repository '%s' is not local") % path)
345 ui.setconfig("bundle", "mainreporoot", repo.root)
346 except hg.RepoError:
346 except hg.RepoError:
347 if cmd not in commands.optionalrepo.split():
347 if cmd not in commands.optionalrepo.split():
348 if not path:
348 if not path:
@@ -66,9 +66,6 b' HGMERGE::'
66 will be executed with three arguments: local file, remote file,
66 will be executed with three arguments: local file, remote file,
67 ancestor file.
67 ancestor file.
68
68
69 The default program is "hgmerge", which is a shell script provided
70 by Mercurial with some sensible defaults.
71
72 (deprecated, use .hgrc)
69 (deprecated, use .hgrc)
73
70
74 HGRCPATH::
71 HGRCPATH::
@@ -97,11 +94,11 b' VISUAL::'
97 This is the name of the editor to use when committing. See EDITOR.
94 This is the name of the editor to use when committing. See EDITOR.
98
95
99 EDITOR::
96 EDITOR::
100 Sometimes Mercurial needs to open a text file in an editor for a user
97 Sometimes Mercurial needs to open a text file in an editor
101 to modify, for example when writing commit messages or when using the
98 for a user to modify, for example when writing commit messages.
102 hgmerge script. The editor it uses is determined by looking at the
99 The editor it uses is determined by looking at the environment
103 environment variables HGEDITOR, VISUAL and EDITOR, in that order. The
100 variables HGEDITOR, VISUAL and EDITOR, in that order. The first
104 first non-empty one is chosen. If all of them are empty, the editor
101 non-empty one is chosen. If all of them are empty, the editor
105 defaults to 'vi'.
102 defaults to 'vi'.
106
103
107 PYTHONPATH::
104 PYTHONPATH::
@@ -105,14 +105,14 b' def clone(ui, source, dest=None, pull=Fa'
105 destination is local repository
105 destination is local repository
106 """
106 """
107
107
108 origsource = source
109 source, rev, checkout = parseurl(ui.expandpath(source), rev)
110
111 if isinstance(source, str):
108 if isinstance(source, str):
109 origsource = ui.expandpath(source)
110 source, rev, checkout = parseurl(origsource, rev)
112 src_repo = repository(ui, source)
111 src_repo = repository(ui, source)
113 else:
112 else:
114 src_repo = source
113 src_repo = source
115 source = src_repo.url()
114 origsource = source = src_repo.url()
115 checkout = None
116
116
117 if dest is None:
117 if dest is None:
118 dest = defaultdest(source)
118 dest = defaultdest(source)
@@ -101,6 +101,12 b' def paritygen(stripecount, offset=0):'
101 parity = 1 - parity
101 parity = 1 - parity
102 count = 0
102 count = 0
103
103
104 def countgen(start=0, step=1):
105 """count forever -- useful for line numbers"""
106 while True:
107 yield start
108 start += step
109
104 def get_contact(config):
110 def get_contact(config):
105 """Return repo contact information or empty string.
111 """Return repo contact information or empty string.
106
112
@@ -10,7 +10,8 b' import os, mimetypes, re'
10 from mercurial.node import *
10 from mercurial.node import *
11 from mercurial import mdiff, ui, hg, util, archival, patch, hook
11 from mercurial import mdiff, ui, hg, util, archival, patch, hook
12 from mercurial import revlog, templater, templatefilters
12 from mercurial import revlog, templater, templatefilters
13 from common import ErrorResponse, get_mtime, style_map, paritygen, get_contact
13 from common import get_mtime, style_map, paritygen, countgen, get_contact
14 from common import ErrorResponse
14 from common import HTTP_OK, HTTP_BAD_REQUEST, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
15 from common import HTTP_OK, HTTP_BAD_REQUEST, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
15 from request import wsgirequest
16 from request import wsgirequest
16 import webcommands, protocol
17 import webcommands, protocol
@@ -371,16 +372,26 b' class hgweb(object):'
371 file=f,
372 file=f,
372 filenode=hex(fn or nullid))
373 filenode=hex(fn or nullid))
373
374
375 blockcount = countgen()
374 def prettyprintlines(diff):
376 def prettyprintlines(diff):
375 for l in diff.splitlines(1):
377 blockno = blockcount.next()
378 for lineno, l in enumerate(diff.splitlines(1)):
379 if blockno == 0:
380 lineno = lineno + 1
381 else:
382 lineno = "%d.%d" % (blockno, lineno + 1)
376 if l.startswith('+'):
383 if l.startswith('+'):
377 yield tmpl("difflineplus", line=l)
384 ltype = "difflineplus"
378 elif l.startswith('-'):
385 elif l.startswith('-'):
379 yield tmpl("difflineminus", line=l)
386 ltype = "difflineminus"
380 elif l.startswith('@'):
387 elif l.startswith('@'):
381 yield tmpl("difflineat", line=l)
388 ltype = "difflineat"
382 else:
389 else:
383 yield tmpl("diffline", line=l)
390 ltype = "diffline"
391 yield tmpl(ltype,
392 line=l,
393 lineid="l%s" % lineno,
394 linenumber="% 8s" % lineno)
384
395
385 r = self.repo
396 r = self.repo
386 c1 = r.changectx(node1)
397 c1 = r.changectx(node1)
@@ -466,7 +477,7 b' class hgweb(object):'
466 def revgen():
477 def revgen():
467 for i in xrange(cl.count() - 1, 0, -100):
478 for i in xrange(cl.count() - 1, 0, -100):
468 l = []
479 l = []
469 for j in xrange(max(0, i - 100), i):
480 for j in xrange(max(0, i - 100), i + 1):
470 ctx = self.repo.changectx(j)
481 ctx = self.repo.changectx(j)
471 l.append(ctx)
482 l.append(ctx)
472 l.reverse()
483 l.reverse()
@@ -596,9 +607,10 b' class hgweb(object):'
596 text = '(binary:%s)' % mt
607 text = '(binary:%s)' % mt
597
608
598 def lines():
609 def lines():
599 for l, t in enumerate(text.splitlines(1)):
610 for lineno, t in enumerate(text.splitlines(1)):
600 yield {"line": t,
611 yield {"line": t,
601 "linenumber": "% 6d" % (l + 1),
612 "lineid": "l%d" % (lineno + 1),
613 "linenumber": "% 6d" % (lineno + 1),
602 "parity": parity.next()}
614 "parity": parity.next()}
603
615
604 return tmpl("filerevision",
616 return tmpl("filerevision",
@@ -623,7 +635,8 b' class hgweb(object):'
623
635
624 def annotate(**map):
636 def annotate(**map):
625 last = None
637 last = None
626 for f, l in fctx.annotate(follow=True):
638 lines = enumerate(fctx.annotate(follow=True, linenumber=True))
639 for lineno, ((f, targetline), l) in lines:
627 fnode = f.filenode()
640 fnode = f.filenode()
628 name = self.repo.ui.shortuser(f.user())
641 name = self.repo.ui.shortuser(f.user())
629
642
@@ -635,7 +648,10 b' class hgweb(object):'
635 "rev": f.rev(),
648 "rev": f.rev(),
636 "author": name,
649 "author": name,
637 "file": f.path(),
650 "file": f.path(),
638 "line": l}
651 "targetline": targetline,
652 "line": l,
653 "lineid": "l%d" % (lineno + 1),
654 "linenumber": "% 6d" % (lineno + 1)}
639
655
640 return tmpl("fileannotate",
656 return tmpl("fileannotate",
641 file=f,
657 file=f,
@@ -177,7 +177,7 b' class hgwebdir(object):'
177 if u.configbool("web", "hidden", untrusted=True):
177 if u.configbool("web", "hidden", untrusted=True):
178 continue
178 continue
179
179
180 parts = [req.env['PATH_INFO'].strip('/'), name]
180 parts = [req.env['PATH_INFO'].rstrip('/'), name]
181 if req.env['SCRIPT_NAME']:
181 if req.env['SCRIPT_NAME']:
182 parts.insert(0, req.env['SCRIPT_NAME'])
182 parts.insert(0, req.env['SCRIPT_NAME'])
183 url = ('/'.join(parts).replace("//", "/")) + '/'
183 url = ('/'.join(parts).replace("//", "/")) + '/'
@@ -85,8 +85,10 b' class wsgirequest(object):'
85 if type is not None:
85 if type is not None:
86 headers.append(('Content-Type', type))
86 headers.append(('Content-Type', type))
87 if filename:
87 if filename:
88 headers.append(('Content-Disposition', 'inline; filename=%s' %
88 filename = (filename.split('/')[-1]
89 filename))
89 .replace('\\', '\\\\').replace('"', '\\"'))
90 headers.append(('Content-Disposition',
91 'inline; filename="%s"' % filename))
90 if length:
92 if length:
91 headers.append(('Content-Length', str(length)))
93 headers.append(('Content-Length', str(length)))
92 self.header(headers)
94 self.header(headers)
@@ -103,10 +103,13 b' class httpconnection(keepalive.HTTPConne'
103 # must be able to send big bundle as stream.
103 # must be able to send big bundle as stream.
104 send = _gen_sendfile(keepalive.HTTPConnection)
104 send = _gen_sendfile(keepalive.HTTPConnection)
105
105
106 class basehttphandler(keepalive.HTTPHandler):
106 class httphandler(keepalive.HTTPHandler):
107 def http_open(self, req):
107 def http_open(self, req):
108 return self.do_open(httpconnection, req)
108 return self.do_open(httpconnection, req)
109
109
110 def __del__(self):
111 self.close_all()
112
110 has_https = hasattr(urllib2, 'HTTPSHandler')
113 has_https = hasattr(urllib2, 'HTTPSHandler')
111 if has_https:
114 if has_https:
112 class httpsconnection(httplib.HTTPSConnection):
115 class httpsconnection(httplib.HTTPSConnection):
@@ -114,12 +117,9 b' if has_https:'
114 # must be able to send big bundle as stream.
117 # must be able to send big bundle as stream.
115 send = _gen_sendfile(httplib.HTTPSConnection)
118 send = _gen_sendfile(httplib.HTTPSConnection)
116
119
117 class httphandler(basehttphandler, urllib2.HTTPSHandler):
120 class httpshandler(keepalive.KeepAliveHandler, urllib2.HTTPSHandler):
118 def https_open(self, req):
121 def https_open(self, req):
119 return self.do_open(httpsconnection, req)
122 return self.do_open(httpsconnection, req)
120 else:
121 class httphandler(basehttphandler):
122 pass
123
123
124 # In python < 2.5 AbstractDigestAuthHandler raises a ValueError if
124 # In python < 2.5 AbstractDigestAuthHandler raises a ValueError if
125 # it doesn't know about the auth type requested. This can happen if
125 # it doesn't know about the auth type requested. This can happen if
@@ -203,8 +203,9 b' class httprepository(remoterepository):'
203
203
204 proxyurl = ui.config("http_proxy", "host") or os.getenv('http_proxy')
204 proxyurl = ui.config("http_proxy", "host") or os.getenv('http_proxy')
205 # XXX proxyauthinfo = None
205 # XXX proxyauthinfo = None
206 self.handler = httphandler()
206 handlers = [httphandler()]
207 handlers = [self.handler]
207 if has_https:
208 handlers.append(httpshandler())
208
209
209 if proxyurl:
210 if proxyurl:
210 # proxy can be proper url or host[:port]
211 # proxy can be proper url or host[:port]
@@ -270,11 +271,6 b' class httprepository(remoterepository):'
270 opener.addheaders = [('User-agent', 'mercurial/proto-1.0')]
271 opener.addheaders = [('User-agent', 'mercurial/proto-1.0')]
271 urllib2.install_opener(opener)
272 urllib2.install_opener(opener)
272
273
273 def __del__(self):
274 if self.handler:
275 self.handler.close_all()
276 self.handler = None
277
278 def url(self):
274 def url(self):
279 return self.path
275 return self.path
280
276
@@ -175,7 +175,7 b' class ConnectionManager:'
175 else:
175 else:
176 return dict(self._hostmap)
176 return dict(self._hostmap)
177
177
178 class HTTPHandler(urllib2.HTTPHandler):
178 class KeepAliveHandler:
179 def __init__(self):
179 def __init__(self):
180 self._cm = ConnectionManager()
180 self._cm = ConnectionManager()
181
181
@@ -314,6 +314,9 b' class HTTPHandler(urllib2.HTTPHandler):'
314 except socket.error, err: # XXX what error?
314 except socket.error, err: # XXX what error?
315 raise urllib2.URLError(err)
315 raise urllib2.URLError(err)
316
316
317 class HTTPHandler(KeepAliveHandler, urllib2.HTTPHandler):
318 pass
319
317 class HTTPResponse(httplib.HTTPResponse):
320 class HTTPResponse(httplib.HTTPResponse):
318 # we need to subclass HTTPResponse in order to
321 # we need to subclass HTTPResponse in order to
319 # 1) add readline() and readlines() methods
322 # 1) add readline() and readlines() methods
@@ -68,8 +68,21 b' class localrepository(repo.repository):'
68 self.encodefn = lambda x: x
68 self.encodefn = lambda x: x
69 self.decodefn = lambda x: x
69 self.decodefn = lambda x: x
70 self.spath = self.path
70 self.spath = self.path
71 self.sopener = util.encodedopener(util.opener(self.spath),
71
72 self.encodefn)
72 try:
73 # files in .hg/ will be created using this mode
74 mode = os.stat(self.spath).st_mode
75 # avoid some useless chmods
76 if (0777 & ~util._umask) == (0777 & mode):
77 mode = None
78 except OSError:
79 mode = None
80
81 self._createmode = mode
82 self.opener.createmode = mode
83 sopener = util.opener(self.spath)
84 sopener.createmode = mode
85 self.sopener = util.encodedopener(sopener, self.encodefn)
73
86
74 self.ui = ui.ui(parentui=parentui)
87 self.ui = ui.ui(parentui=parentui)
75 try:
88 try:
@@ -81,6 +94,8 b' class localrepository(repo.repository):'
81 self.tagscache = None
94 self.tagscache = None
82 self._tagstypecache = None
95 self._tagstypecache = None
83 self.branchcache = None
96 self.branchcache = None
97 self._ubranchcache = None # UTF-8 version of branchcache
98 self._branchcachetip = None
84 self.nodetagscache = None
99 self.nodetagscache = None
85 self.filterpats = {}
100 self.filterpats = {}
86 self._datafilters = {}
101 self._datafilters = {}
@@ -120,6 +135,7 b' class localrepository(repo.repository):'
120 self.hook('pretag', throw=True, node=hex(node), tag=name, local=local)
135 self.hook('pretag', throw=True, node=hex(node), tag=name, local=local)
121
136
122 def writetag(fp, name, munge, prevtags):
137 def writetag(fp, name, munge, prevtags):
138 fp.seek(0, 2)
123 if prevtags and prevtags[-1] != '\n':
139 if prevtags and prevtags[-1] != '\n':
124 fp.write('\n')
140 fp.write('\n')
125 fp.write('%s %s\n' % (hex(node), munge and munge(name) or name))
141 fp.write('%s %s\n' % (hex(node), munge and munge(name) or name))
@@ -186,6 +202,7 b' class localrepository(repo.repository):'
186
202
187 date: date tuple to use if committing'''
203 date: date tuple to use if committing'''
188
204
205 date = util.parsedate(date)
189 for x in self.status()[:5]:
206 for x in self.status()[:5]:
190 if '.hgtags' in x:
207 if '.hgtags' in x:
191 raise util.Abort(_('working copy of .hgtags is changed '
208 raise util.Abort(_('working copy of .hgtags is changed '
@@ -330,9 +347,7 b' class localrepository(repo.repository):'
330 self.nodetagscache.setdefault(n, []).append(t)
347 self.nodetagscache.setdefault(n, []).append(t)
331 return self.nodetagscache.get(node, [])
348 return self.nodetagscache.get(node, [])
332
349
333 def _branchtags(self):
350 def _branchtags(self, partial, lrev):
334 partial, last, lrev = self._readbranchcache()
335
336 tiprev = self.changelog.count() - 1
351 tiprev = self.changelog.count() - 1
337 if lrev != tiprev:
352 if lrev != tiprev:
338 self._updatebranchcache(partial, lrev+1, tiprev+1)
353 self._updatebranchcache(partial, lrev+1, tiprev+1)
@@ -341,16 +356,29 b' class localrepository(repo.repository):'
341 return partial
356 return partial
342
357
343 def branchtags(self):
358 def branchtags(self):
344 if self.branchcache is not None:
359 tip = self.changelog.tip()
360 if self.branchcache is not None and self._branchcachetip == tip:
345 return self.branchcache
361 return self.branchcache
346
362
347 self.branchcache = {} # avoid recursion in changectx
363 oldtip = self._branchcachetip
348 partial = self._branchtags()
364 self._branchcachetip = tip
365 if self.branchcache is None:
366 self.branchcache = {} # avoid recursion in changectx
367 else:
368 self.branchcache.clear() # keep using the same dict
369 if oldtip is None or oldtip not in self.changelog.nodemap:
370 partial, last, lrev = self._readbranchcache()
371 else:
372 lrev = self.changelog.rev(oldtip)
373 partial = self._ubranchcache
374
375 self._branchtags(partial, lrev)
349
376
350 # the branch cache is stored on disk as UTF-8, but in the local
377 # the branch cache is stored on disk as UTF-8, but in the local
351 # charset internally
378 # charset internally
352 for k, v in partial.items():
379 for k, v in partial.items():
353 self.branchcache[util.tolocal(k)] = v
380 self.branchcache[util.tolocal(k)] = v
381 self._ubranchcache = partial
354 return self.branchcache
382 return self.branchcache
355
383
356 def _readbranchcache(self):
384 def _readbranchcache(self):
@@ -368,7 +396,7 b' class localrepository(repo.repository):'
368 if not (lrev < self.changelog.count() and
396 if not (lrev < self.changelog.count() and
369 self.changelog.node(lrev) == last): # sanity check
397 self.changelog.node(lrev) == last): # sanity check
370 # invalidate the cache
398 # invalidate the cache
371 raise ValueError('Invalid branch cache: unknown tip')
399 raise ValueError('invalidating branch cache (tip differs)')
372 for l in lines:
400 for l in lines:
373 if not l: continue
401 if not l: continue
374 node, label = l.split(" ", 1)
402 node, label = l.split(" ", 1)
@@ -487,9 +515,11 b' class localrepository(repo.repository):'
487 for pat, cmd in self.ui.configitems(filter):
515 for pat, cmd in self.ui.configitems(filter):
488 mf = util.matcher(self.root, "", [pat], [], [])[1]
516 mf = util.matcher(self.root, "", [pat], [], [])[1]
489 fn = None
517 fn = None
518 params = cmd
490 for name, filterfn in self._datafilters.iteritems():
519 for name, filterfn in self._datafilters.iteritems():
491 if cmd.startswith(name):
520 if cmd.startswith(name):
492 fn = filterfn
521 fn = filterfn
522 params = cmd[len(name):].lstrip()
493 break
523 break
494 if not fn:
524 if not fn:
495 fn = lambda s, c, **kwargs: util.filter(s, c)
525 fn = lambda s, c, **kwargs: util.filter(s, c)
@@ -497,7 +527,7 b' class localrepository(repo.repository):'
497 if not inspect.getargspec(fn)[2]:
527 if not inspect.getargspec(fn)[2]:
498 oldfn = fn
528 oldfn = fn
499 fn = lambda s, c, **kwargs: oldfn(s, c)
529 fn = lambda s, c, **kwargs: oldfn(s, c)
500 l.append((mf, fn, cmd))
530 l.append((mf, fn, params))
501 self.filterpats[filter] = l
531 self.filterpats[filter] = l
502
532
503 for mf, fn, cmd in self.filterpats[filter]:
533 for mf, fn, cmd in self.filterpats[filter]:
@@ -550,8 +580,9 b' class localrepository(repo.repository):'
550 (self.join("journal.dirstate"), self.join("undo.dirstate")),
580 (self.join("journal.dirstate"), self.join("undo.dirstate")),
551 (self.join("journal.branch"), self.join("undo.branch"))]
581 (self.join("journal.branch"), self.join("undo.branch"))]
552 tr = transaction.transaction(self.ui.warn, self.sopener,
582 tr = transaction.transaction(self.ui.warn, self.sopener,
553 self.sjoin("journal"),
583 self.sjoin("journal"),
554 aftertrans(renames))
584 aftertrans(renames),
585 self._createmode)
555 self._transref = weakref.ref(tr)
586 self._transref = weakref.ref(tr)
556 return tr
587 return tr
557
588
@@ -578,8 +609,13 b' class localrepository(repo.repository):'
578 self.ui.status(_("rolling back last transaction\n"))
609 self.ui.status(_("rolling back last transaction\n"))
579 transaction.rollback(self.sopener, self.sjoin("undo"))
610 transaction.rollback(self.sopener, self.sjoin("undo"))
580 util.rename(self.join("undo.dirstate"), self.join("dirstate"))
611 util.rename(self.join("undo.dirstate"), self.join("dirstate"))
581 branch = self.opener("undo.branch").read()
612 try:
582 self.dirstate.setbranch(branch)
613 branch = self.opener("undo.branch").read()
614 self.dirstate.setbranch(branch)
615 except IOError:
616 self.ui.warn(_("Named branch could not be reset, "
617 "current branch still is: %s\n")
618 % util.tolocal(self.dirstate.branch()))
583 self.invalidate()
619 self.invalidate()
584 self.dirstate.invalidate()
620 self.dirstate.invalidate()
585 else:
621 else:
@@ -594,6 +630,9 b' class localrepository(repo.repository):'
594 self.tagscache = None
630 self.tagscache = None
595 self._tagstypecache = None
631 self._tagstypecache = None
596 self.nodetagscache = None
632 self.nodetagscache = None
633 self.branchcache = None
634 self._ubranchcache = None
635 self._branchcachetip = None
597
636
598 def _lock(self, lockname, wait, releasefn, acquirefn, desc):
637 def _lock(self, lockname, wait, releasefn, acquirefn, desc):
599 try:
638 try:
@@ -860,8 +899,8 b' class localrepository(repo.repository):'
860 parent2=xp2)
899 parent2=xp2)
861 tr.close()
900 tr.close()
862
901
863 if self.branchcache and "branch" in extra:
902 if self.branchcache:
864 self.branchcache[util.tolocal(extra["branch"])] = n
903 self.branchtags()
865
904
866 if use_dirstate or update_dirstate:
905 if use_dirstate or update_dirstate:
867 self.dirstate.setparents(n)
906 self.dirstate.setparents(n)
@@ -1484,7 +1523,7 b' class localrepository(repo.repository):'
1484 self.ui.warn(_("abort: push creates new remote branches!\n"))
1523 self.ui.warn(_("abort: push creates new remote branches!\n"))
1485 self.ui.status(_("(did you forget to merge?"
1524 self.ui.status(_("(did you forget to merge?"
1486 " use push -f to force)\n"))
1525 " use push -f to force)\n"))
1487 return None, 1
1526 return None, 0
1488 elif inc:
1527 elif inc:
1489 self.ui.warn(_("note: unsynced remote changes!\n"))
1528 self.ui.warn(_("note: unsynced remote changes!\n"))
1490
1529
@@ -1981,6 +2020,9 b' class localrepository(repo.repository):'
1981 del tr
2020 del tr
1982
2021
1983 if changesets > 0:
2022 if changesets > 0:
2023 # forcefully update the on-disk branch cache
2024 self.ui.debug(_("updating the branch cache\n"))
2025 self.branchtags()
1984 self.hook("changegroup", node=hex(self.changelog.node(cor+1)),
2026 self.hook("changegroup", node=hex(self.changelog.node(cor+1)),
1985 source=srctype, url=url)
2027 source=srctype, url=url)
1986
2028
@@ -7,62 +7,7 b''
7
7
8 from node import *
8 from node import *
9 from i18n import _
9 from i18n import _
10 import errno, util, os, tempfile, context, heapq
10 import errno, util, os, heapq, filemerge
11
12 def filemerge(repo, fw, fd, fo, wctx, mctx):
13 """perform a 3-way merge in the working directory
14
15 fw = original filename in the working directory
16 fd = destination filename in the working directory
17 fo = filename in other parent
18 wctx, mctx = working and merge changecontexts
19 """
20
21 def temp(prefix, ctx):
22 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
23 (fd, name) = tempfile.mkstemp(prefix=pre)
24 data = repo.wwritedata(ctx.path(), ctx.data())
25 f = os.fdopen(fd, "wb")
26 f.write(data)
27 f.close()
28 return name
29
30 fcm = wctx.filectx(fw)
31 fcmdata = wctx.filectx(fd).data()
32 fco = mctx.filectx(fo)
33
34 if not fco.cmp(fcmdata): # files identical?
35 return None
36
37 fca = fcm.ancestor(fco)
38 if not fca:
39 fca = repo.filectx(fw, fileid=nullrev)
40 a = repo.wjoin(fd)
41 b = temp("base", fca)
42 c = temp("other", fco)
43
44 if fw != fo:
45 repo.ui.status(_("merging %s and %s\n") % (fw, fo))
46 else:
47 repo.ui.status(_("merging %s\n") % fw)
48
49 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
50
51 cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
52 or "hgmerge")
53 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
54 environ={'HG_FILE': fd,
55 'HG_MY_NODE': str(wctx.parents()[0]),
56 'HG_OTHER_NODE': str(mctx),
57 'HG_MY_ISLINK': fcm.islink(),
58 'HG_OTHER_ISLINK': fco.islink(),
59 'HG_BASE_ISLINK': fca.islink(),})
60 if r:
61 repo.ui.warn(_("merging %s failed!\n") % fd)
62
63 os.unlink(b)
64 os.unlink(c)
65 return r
66
11
67 def checkunknown(wctx, mctx):
12 def checkunknown(wctx, mctx):
68 "check for collisions between unknown files and files in mctx"
13 "check for collisions between unknown files and files in mctx"
@@ -514,7 +459,7 b' def applyupdates(repo, action, wctx, mct'
514 removed += 1
459 removed += 1
515 elif m == "m": # merge
460 elif m == "m": # merge
516 f2, fd, flags, move = a[2:]
461 f2, fd, flags, move = a[2:]
517 r = filemerge(repo, f, fd, f2, wctx, mctx)
462 r = filemerge.filemerge(repo, f, fd, f2, wctx, mctx)
518 if r > 0:
463 if r > 0:
519 unresolved += 1
464 unresolved += 1
520 else:
465 else:
@@ -1056,7 +1056,8 b' def diffopts(ui, opts={}, untrusted=Fals'
1056 showfunc=get('show_function', 'showfunc'),
1056 showfunc=get('show_function', 'showfunc'),
1057 ignorews=get('ignore_all_space', 'ignorews'),
1057 ignorews=get('ignore_all_space', 'ignorews'),
1058 ignorewsamount=get('ignore_space_change', 'ignorewsamount'),
1058 ignorewsamount=get('ignore_space_change', 'ignorewsamount'),
1059 ignoreblanklines=get('ignore_blank_lines', 'ignoreblanklines'))
1059 ignoreblanklines=get('ignore_blank_lines', 'ignoreblanklines'),
1060 context=get('unified'))
1060
1061
1061 def updatedir(ui, repo, patches):
1062 def updatedir(ui, repo, patches):
1062 '''Update dirstate after patch application according to metadata'''
1063 '''Update dirstate after patch application according to metadata'''
@@ -15,27 +15,20 b''
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
18
19 # mbp: "you know that thing where cvs gives you conflict markers?"
18 # mbp: "you know that thing where cvs gives you conflict markers?"
20 # s: "i hate that."
19 # s: "i hate that."
21
20
22 from mercurial import demandimport
21 from i18n import _
23 demandimport.enable()
22 import util, mdiff, fancyopts, sys, os
24
25 from mercurial import util, mdiff, fancyopts
26 from mercurial.i18n import _
27
28
23
29 class CantReprocessAndShowBase(Exception):
24 class CantReprocessAndShowBase(Exception):
30 pass
25 pass
31
26
32
33 def warn(message):
27 def warn(message):
34 sys.stdout.flush()
28 sys.stdout.flush()
35 sys.stderr.write(message)
29 sys.stderr.write(message)
36 sys.stderr.flush()
30 sys.stderr.flush()
37
31
38
39 def intersect(ra, rb):
32 def intersect(ra, rb):
40 """Given two ranges return the range where they intersect or None.
33 """Given two ranges return the range where they intersect or None.
41
34
@@ -58,7 +51,6 b' def intersect(ra, rb):'
58 else:
51 else:
59 return None
52 return None
60
53
61
62 def compare_range(a, astart, aend, b, bstart, bend):
54 def compare_range(a, astart, aend, b, bstart, bend):
63 """Compare a[astart:aend] == b[bstart:bend], without slicing.
55 """Compare a[astart:aend] == b[bstart:bend], without slicing.
64 """
56 """
@@ -70,9 +62,6 b' def compare_range(a, astart, aend, b, bs'
70 else:
62 else:
71 return True
63 return True
72
64
73
74
75
76 class Merge3Text(object):
65 class Merge3Text(object):
77 """3-way merge of texts.
66 """3-way merge of texts.
78
67
@@ -92,8 +81,6 b' class Merge3Text(object):'
92 self.a = a
81 self.a = a
93 self.b = b
82 self.b = b
94
83
95
96
97 def merge_lines(self,
84 def merge_lines(self,
98 name_a=None,
85 name_a=None,
99 name_b=None,
86 name_b=None,
@@ -150,10 +137,6 b' class Merge3Text(object):'
150 else:
137 else:
151 raise ValueError(what)
138 raise ValueError(what)
152
139
153
154
155
156
157 def merge_annotated(self):
140 def merge_annotated(self):
158 """Return merge with conflicts, showing origin of lines.
141 """Return merge with conflicts, showing origin of lines.
159
142
@@ -181,10 +164,6 b' class Merge3Text(object):'
181 else:
164 else:
182 raise ValueError(what)
165 raise ValueError(what)
183
166
184
185
186
187
188 def merge_groups(self):
167 def merge_groups(self):
189 """Yield sequence of line groups. Each one is a tuple:
168 """Yield sequence of line groups. Each one is a tuple:
190
169
@@ -219,7 +198,6 b' class Merge3Text(object):'
219 else:
198 else:
220 raise ValueError(what)
199 raise ValueError(what)
221
200
222
223 def merge_regions(self):
201 def merge_regions(self):
224 """Return sequences of matching and conflicting regions.
202 """Return sequences of matching and conflicting regions.
225
203
@@ -305,7 +283,6 b' class Merge3Text(object):'
305 ia = aend
283 ia = aend
306 ib = bend
284 ib = bend
307
285
308
309 def reprocess_merge_regions(self, merge_regions):
286 def reprocess_merge_regions(self, merge_regions):
310 """Where there are conflict regions, remove the agreed lines.
287 """Where there are conflict regions, remove the agreed lines.
311
288
@@ -337,13 +314,11 b' class Merge3Text(object):'
337 if reg is not None:
314 if reg is not None:
338 yield reg
315 yield reg
339
316
340
341 def mismatch_region(next_a, region_ia, next_b, region_ib):
317 def mismatch_region(next_a, region_ia, next_b, region_ib):
342 if next_a < region_ia or next_b < region_ib:
318 if next_a < region_ia or next_b < region_ib:
343 return 'conflict', None, None, next_a, region_ia, next_b, region_ib
319 return 'conflict', None, None, next_a, region_ia, next_b, region_ib
344 mismatch_region = staticmethod(mismatch_region)
320 mismatch_region = staticmethod(mismatch_region)
345
321
346
347 def find_sync_regions(self):
322 def find_sync_regions(self):
348 """Return a list of sync regions, where both descendents match the base.
323 """Return a list of sync regions, where both descendents match the base.
349
324
@@ -405,8 +380,6 b' class Merge3Text(object):'
405
380
406 return sl
381 return sl
407
382
408
409
410 def find_unconflicted(self):
383 def find_unconflicted(self):
411 """Return a list of ranges in base that are not conflicted."""
384 """Return a list of ranges in base that are not conflicted."""
412 am = mdiff.get_matching_blocks(self.basetext, self.atext)
385 am = mdiff.get_matching_blocks(self.basetext, self.atext)
@@ -432,23 +405,6 b' class Merge3Text(object):'
432
405
433 return unc
406 return unc
434
407
435
436 # bzr compatible interface, for the tests
437 class Merge3(Merge3Text):
438 """3-way merge of texts.
439
440 Given BASE, OTHER, THIS, tries to produce a combined text
441 incorporating the changes from both BASE->OTHER and BASE->THIS.
442 All three will typically be sequences of lines."""
443 def __init__(self, base, a, b):
444 basetext = '\n'.join([i.strip('\n') for i in base] + [''])
445 atext = '\n'.join([i.strip('\n') for i in a] + [''])
446 btext = '\n'.join([i.strip('\n') for i in b] + [''])
447 if util.binary(basetext) or util.binary(atext) or util.binary(btext):
448 raise util.Abort(_("don't know how to merge binary files"))
449 Merge3Text.__init__(self, basetext, atext, btext, base, a, b)
450
451
452 def simplemerge(local, base, other, **opts):
408 def simplemerge(local, base, other, **opts):
453 def readfile(filename):
409 def readfile(filename):
454 f = open(filename, "rb")
410 f = open(filename, "rb")
@@ -498,65 +454,3 b' def simplemerge(local, base, other, **op'
498 if not opts.get('quiet'):
454 if not opts.get('quiet'):
499 warn(_("warning: conflicts during merge.\n"))
455 warn(_("warning: conflicts during merge.\n"))
500 return 1
456 return 1
501
502 options = [('L', 'label', [], _('labels to use on conflict markers')),
503 ('a', 'text', None, _('treat all files as text')),
504 ('p', 'print', None,
505 _('print results instead of overwriting LOCAL')),
506 ('', 'no-minimal', None,
507 _('do not try to minimize conflict regions')),
508 ('h', 'help', None, _('display help and exit')),
509 ('q', 'quiet', None, _('suppress output'))]
510
511 usage = _('''simplemerge [OPTS] LOCAL BASE OTHER
512
513 Simple three-way file merge utility with a minimal feature set.
514
515 Apply to LOCAL the changes necessary to go from BASE to OTHER.
516
517 By default, LOCAL is overwritten with the results of this operation.
518 ''')
519
520 def showhelp():
521 sys.stdout.write(usage)
522 sys.stdout.write('\noptions:\n')
523
524 out_opts = []
525 for shortopt, longopt, default, desc in options:
526 out_opts.append(('%2s%s' % (shortopt and '-%s' % shortopt,
527 longopt and ' --%s' % longopt),
528 '%s' % desc))
529 opts_len = max([len(opt[0]) for opt in out_opts])
530 for first, second in out_opts:
531 sys.stdout.write(' %-*s %s\n' % (opts_len, first, second))
532
533 class ParseError(Exception):
534 """Exception raised on errors in parsing the command line."""
535
536 def main(argv):
537 try:
538 opts = {}
539 try:
540 args = fancyopts.fancyopts(argv[1:], options, opts)
541 except fancyopts.getopt.GetoptError, e:
542 raise ParseError(e)
543 if opts['help']:
544 showhelp()
545 return 0
546 if len(args) != 3:
547 raise ParseError(_('wrong number of arguments'))
548 return simplemerge(*args, **opts)
549 except ParseError, e:
550 sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
551 showhelp()
552 return 1
553 except util.Abort, e:
554 sys.stderr.write("abort: %s\n" % e)
555 return 255
556 except KeyboardInterrupt:
557 return 255
558
559 if __name__ == '__main__':
560 import sys
561 import os
562 sys.exit(main(sys.argv))
@@ -114,14 +114,25 b' class sshrepository(remoterepository):'
114 return self.pipei
114 return self.pipei
115
115
116 def call(self, cmd, **args):
116 def call(self, cmd, **args):
117 r = self.do_cmd(cmd, **args)
117 self.do_cmd(cmd, **args)
118 l = r.readline()
118 return self._recv()
119
120 def _recv(self):
121 l = self.pipei.readline()
119 self.readerr()
122 self.readerr()
120 try:
123 try:
121 l = int(l)
124 l = int(l)
122 except:
125 except:
123 self.raise_(util.UnexpectedOutput(_("unexpected response:"), l))
126 self.raise_(util.UnexpectedOutput(_("unexpected response:"), l))
124 return r.read(l)
127 return self.pipei.read(l)
128
129 def _send(self, data, flush=False):
130 self.pipeo.write("%d\n" % len(data))
131 if data:
132 self.pipeo.write(data)
133 if flush:
134 self.pipeo.flush()
135 self.readerr()
125
136
126 def lock(self):
137 def lock(self):
127 self.call("lock")
138 self.call("lock")
@@ -182,25 +193,22 b' class sshrepository(remoterepository):'
182
193
183 while 1:
194 while 1:
184 d = cg.read(4096)
195 d = cg.read(4096)
185 if not d: break
196 if not d:
186 self.pipeo.write(str(len(d)) + '\n')
197 break
187 self.pipeo.write(d)
198 self._send(d)
188 self.readerr()
189
199
190 self.pipeo.write('0\n')
200 self._send("", flush=True)
191 self.pipeo.flush()
192
201
193 self.readerr()
202 r = self._recv()
194 l = int(self.pipei.readline())
195 r = self.pipei.read(l)
196 if r:
203 if r:
197 # remote may send "unsynced changes"
204 # remote may send "unsynced changes"
198 self.raise_(repo.RepoError(_("push failed: %s") % r))
205 self.raise_(repo.RepoError(_("push failed: %s") % r))
199
206
200 self.readerr()
207 r = self._recv()
201 l = int(self.pipei.readline())
208 try:
202 r = self.pipei.read(l)
209 return int(r)
203 return int(r)
210 except:
211 self.raise_(util.UnexpectedOutput(_("unexpected response:"), r))
204
212
205 def addchangegroup(self, cg, source, url):
213 def addchangegroup(self, cg, source, url):
206 d = self.call("addchangegroup")
214 d = self.call("addchangegroup")
@@ -208,18 +216,21 b' class sshrepository(remoterepository):'
208 self.raise_(repo.RepoError(_("push refused: %s") % d))
216 self.raise_(repo.RepoError(_("push refused: %s") % d))
209 while 1:
217 while 1:
210 d = cg.read(4096)
218 d = cg.read(4096)
211 if not d: break
219 if not d:
220 break
212 self.pipeo.write(d)
221 self.pipeo.write(d)
213 self.readerr()
222 self.readerr()
214
223
215 self.pipeo.flush()
224 self.pipeo.flush()
216
225
217 self.readerr()
226 self.readerr()
218 l = int(self.pipei.readline())
227 r = self._recv()
219 r = self.pipei.read(l)
220 if not r:
228 if not r:
221 return 1
229 return 1
222 return int(r)
230 try:
231 return int(r)
232 except:
233 self.raise_(util.UnexpectedOutput(_("unexpected response:"), r))
223
234
224 def stream_out(self):
235 def stream_out(self):
225 return self.do_cmd('stream_out')
236 return self.do_cmd('stream_out')
@@ -9,14 +9,16 b''
9
9
10 from i18n import _
10 from i18n import _
11 import changelog, filelog, httprangereader
11 import changelog, filelog, httprangereader
12 import repo, localrepo, manifest, os, urllib, urllib2, util
12 import repo, localrepo, manifest, util
13 import urllib, urllib2, errno
13
14
14 class rangereader(httprangereader.httprangereader):
15 class rangereader(httprangereader.httprangereader):
15 def read(self, size=None):
16 def read(self, size=None):
16 try:
17 try:
17 return httprangereader.httprangereader.read(self, size)
18 return httprangereader.httprangereader.read(self, size)
18 except urllib2.HTTPError, inst:
19 except urllib2.HTTPError, inst:
19 raise IOError(None, inst)
20 num = inst.code == 404 and errno.ENOENT or None
21 raise IOError(num, inst)
20 except urllib2.URLError, inst:
22 except urllib2.URLError, inst:
21 raise IOError(None, inst.reason[1])
23 raise IOError(None, inst.reason[1])
22
24
@@ -35,11 +37,17 b' class statichttprepository(localrepo.loc'
35
37
36 self.path = path.rstrip('/') + "/.hg"
38 self.path = path.rstrip('/') + "/.hg"
37 self.opener = opener(self.path)
39 self.opener = opener(self.path)
40
38 # find requirements
41 # find requirements
39 try:
42 try:
40 requirements = self.opener("requires").read().splitlines()
43 requirements = self.opener("requires").read().splitlines()
41 except IOError:
44 except IOError, inst:
42 requirements = []
45 if inst.errno == errno.ENOENT:
46 msg = _("'%s' does not appear to be an hg repository") % path
47 raise repo.RepoError(msg)
48 else:
49 requirements = []
50
43 # check them
51 # check them
44 for r in requirements:
52 for r in requirements:
45 if r not in self.supported:
53 if r not in self.supported:
@@ -100,10 +100,6 b' def person(author):'
100 if f == -1: return util.shortuser(author)
100 if f == -1: return util.shortuser(author)
101 return author[:f].rstrip()
101 return author[:f].rstrip()
102
102
103 def shortdate(date):
104 '''turn (timestamp, tzoff) tuple into iso 8631 date.'''
105 return util.datestr(date, format='%Y-%m-%d', timezone=False)
106
107 def indent(text, prefix):
103 def indent(text, prefix):
108 '''indent each non-empty line of text after first with prefix.'''
104 '''indent each non-empty line of text after first with prefix.'''
109 lines = text.splitlines()
105 lines = text.splitlines()
@@ -145,7 +141,7 b' filters = {'
145 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"),
141 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S"),
146 "rfc3339date": lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S", True, "%+03d:%02d"),
142 "rfc3339date": lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S", True, "%+03d:%02d"),
147 "short": lambda x: x[:12],
143 "short": lambda x: x[:12],
148 "shortdate": shortdate,
144 "shortdate": util.shortdate,
149 "stringify": templater.stringify,
145 "stringify": templater.stringify,
150 "strip": lambda x: x.strip(),
146 "strip": lambda x: x.strip(),
151 "urlescape": lambda x: urllib.quote(x),
147 "urlescape": lambda x: urllib.quote(x),
@@ -15,7 +15,7 b' from i18n import _'
15 import os
15 import os
16
16
17 class transaction(object):
17 class transaction(object):
18 def __init__(self, report, opener, journal, after=None):
18 def __init__(self, report, opener, journal, after=None, createmode=None):
19 self.journal = None
19 self.journal = None
20
20
21 self.count = 1
21 self.count = 1
@@ -27,6 +27,8 b' class transaction(object):'
27 self.journal = journal
27 self.journal = journal
28
28
29 self.file = open(self.journal, "w")
29 self.file = open(self.journal, "w")
30 if createmode is not None:
31 os.chmod(self.journal, createmode & 0666)
30
32
31 def __del__(self):
33 def __del__(self):
32 if self.journal:
34 if self.journal:
@@ -335,7 +335,7 b' def pathto(root, n1, n2):'
335 a.pop()
335 a.pop()
336 b.pop()
336 b.pop()
337 b.reverse()
337 b.reverse()
338 return os.sep.join((['..'] * len(a)) + b)
338 return os.sep.join((['..'] * len(a)) + b) or '.'
339
339
340 def canonpath(root, cwd, myname):
340 def canonpath(root, cwd, myname):
341 """return the canonical path of myname, given cwd and root"""
341 """return the canonical path of myname, given cwd and root"""
@@ -459,6 +459,8 b' def _matcher(canonroot, cwd, names, inc,'
459 return
459 return
460 try:
460 try:
461 pat = '(?:%s)' % '|'.join([regex(k, p, tail) for (k, p) in pats])
461 pat = '(?:%s)' % '|'.join([regex(k, p, tail) for (k, p) in pats])
462 if len(pat) > 20000:
463 raise OverflowError()
462 return re.compile(pat).match
464 return re.compile(pat).match
463 except OverflowError:
465 except OverflowError:
464 # We're using a Python with a tiny regex engine and we
466 # We're using a Python with a tiny regex engine and we
@@ -895,6 +897,13 b' def splitpath(path):'
895 function if need.'''
897 function if need.'''
896 return path.split(os.sep)
898 return path.split(os.sep)
897
899
900 def gui():
901 '''Are we running in a GUI?'''
902 return os.name == "nt" or os.name == "mac" or os.environ.get("DISPLAY")
903
904 def lookup_reg(key, name=None, scope=None):
905 return None
906
898 # Platform specific variants
907 # Platform specific variants
899 if os.name == 'nt':
908 if os.name == 'nt':
900 import msvcrt
909 import msvcrt
@@ -1291,7 +1300,7 b' def encodedopener(openerfn, fn):'
1291 return openerfn(fn(path), *args, **kw)
1300 return openerfn(fn(path), *args, **kw)
1292 return o
1301 return o
1293
1302
1294 def mktempcopy(name, emptyok=False):
1303 def mktempcopy(name, emptyok=False, createmode=None):
1295 """Create a temporary file with the same contents from name
1304 """Create a temporary file with the same contents from name
1296
1305
1297 The permission bits are copied from the original file.
1306 The permission bits are copied from the original file.
@@ -1312,7 +1321,10 b' def mktempcopy(name, emptyok=False):'
1312 except OSError, inst:
1321 except OSError, inst:
1313 if inst.errno != errno.ENOENT:
1322 if inst.errno != errno.ENOENT:
1314 raise
1323 raise
1315 st_mode = 0666 & ~_umask
1324 st_mode = createmode
1325 if st_mode is None:
1326 st_mode = ~_umask
1327 st_mode &= 0666
1316 os.chmod(temp, st_mode)
1328 os.chmod(temp, st_mode)
1317 if emptyok:
1329 if emptyok:
1318 return temp
1330 return temp
@@ -1343,9 +1355,10 b' class atomictempfile(posixfile):'
1343 file. When rename is called, the copy is renamed to the original
1355 file. When rename is called, the copy is renamed to the original
1344 name, making the changes visible.
1356 name, making the changes visible.
1345 """
1357 """
1346 def __init__(self, name, mode):
1358 def __init__(self, name, mode, createmode):
1347 self.__name = name
1359 self.__name = name
1348 self.temp = mktempcopy(name, emptyok=('w' in mode))
1360 self.temp = mktempcopy(name, emptyok=('w' in mode),
1361 createmode=createmode)
1349 posixfile.__init__(self, self.temp, mode)
1362 posixfile.__init__(self, self.temp, mode)
1350
1363
1351 def rename(self):
1364 def rename(self):
@@ -1360,6 +1373,22 b' class atomictempfile(posixfile):'
1360 except: pass
1373 except: pass
1361 posixfile.close(self)
1374 posixfile.close(self)
1362
1375
1376 def makedirs(name, mode=None):
1377 """recursive directory creation with parent mode inheritance"""
1378 try:
1379 os.mkdir(name)
1380 if mode is not None:
1381 os.chmod(name, mode)
1382 return
1383 except OSError, err:
1384 if err.errno == errno.EEXIST:
1385 return
1386 if err.errno != errno.ENOENT:
1387 raise
1388 parent = os.path.abspath(os.path.dirname(name))
1389 makedirs(parent, mode)
1390 makedirs(name, mode)
1391
1363 class opener(object):
1392 class opener(object):
1364 """Open files relative to a base directory
1393 """Open files relative to a base directory
1365
1394
@@ -1372,6 +1401,7 b' class opener(object):'
1372 self.audit_path = path_auditor(base)
1401 self.audit_path = path_auditor(base)
1373 else:
1402 else:
1374 self.audit_path = always
1403 self.audit_path = always
1404 self.createmode = None
1375
1405
1376 def __getattr__(self, name):
1406 def __getattr__(self, name):
1377 if name == '_can_symlink':
1407 if name == '_can_symlink':
@@ -1379,6 +1409,11 b' class opener(object):'
1379 return self._can_symlink
1409 return self._can_symlink
1380 raise AttributeError(name)
1410 raise AttributeError(name)
1381
1411
1412 def _fixfilemode(self, name):
1413 if self.createmode is None:
1414 return
1415 os.chmod(name, self.createmode & 0666)
1416
1382 def __call__(self, path, mode="r", text=False, atomictemp=False):
1417 def __call__(self, path, mode="r", text=False, atomictemp=False):
1383 self.audit_path(path)
1418 self.audit_path(path)
1384 f = os.path.join(self.base, path)
1419 f = os.path.join(self.base, path)
@@ -1386,6 +1421,7 b' class opener(object):'
1386 if not text and "b" not in mode:
1421 if not text and "b" not in mode:
1387 mode += "b" # for that other OS
1422 mode += "b" # for that other OS
1388
1423
1424 nlink = -1
1389 if mode[0] != "r":
1425 if mode[0] != "r":
1390 try:
1426 try:
1391 nlink = nlinks(f)
1427 nlink = nlinks(f)
@@ -1393,12 +1429,15 b' class opener(object):'
1393 nlink = 0
1429 nlink = 0
1394 d = os.path.dirname(f)
1430 d = os.path.dirname(f)
1395 if not os.path.isdir(d):
1431 if not os.path.isdir(d):
1396 os.makedirs(d)
1432 makedirs(d, self.createmode)
1397 if atomictemp:
1433 if atomictemp:
1398 return atomictempfile(f, mode)
1434 return atomictempfile(f, mode, self.createmode)
1399 if nlink > 1:
1435 if nlink > 1:
1400 rename(mktempcopy(f), f)
1436 rename(mktempcopy(f), f)
1401 return posixfile(f, mode)
1437 fp = posixfile(f, mode)
1438 if nlink == 0:
1439 self._fixfilemode(f)
1440 return fp
1402
1441
1403 def symlink(self, src, dst):
1442 def symlink(self, src, dst):
1404 self.audit_path(dst)
1443 self.audit_path(dst)
@@ -1410,7 +1449,7 b' class opener(object):'
1410
1449
1411 dirname = os.path.dirname(linkname)
1450 dirname = os.path.dirname(linkname)
1412 if not os.path.exists(dirname):
1451 if not os.path.exists(dirname):
1413 os.makedirs(dirname)
1452 makedirs(dirname, self.createmode)
1414
1453
1415 if self._can_symlink:
1454 if self._can_symlink:
1416 try:
1455 try:
@@ -1422,6 +1461,7 b' class opener(object):'
1422 f = self(dst, "w")
1461 f = self(dst, "w")
1423 f.write(src)
1462 f.write(src)
1424 f.close()
1463 f.close()
1464 self._fixfilemode(dst)
1425
1465
1426 class chunkbuffer(object):
1466 class chunkbuffer(object):
1427 """Allow arbitrary sized chunks of data to be efficiently read from an
1467 """Allow arbitrary sized chunks of data to be efficiently read from an
@@ -1493,6 +1533,10 b" def datestr(date=None, format='%a %b %d "
1493 s += timezone_format % (-tz / 3600, ((-tz % 3600) / 60))
1533 s += timezone_format % (-tz / 3600, ((-tz % 3600) / 60))
1494 return s
1534 return s
1495
1535
1536 def shortdate(date=None):
1537 """turn (timestamp, tzoff) tuple into iso 8631 date."""
1538 return datestr(date, format='%Y-%m-%d', timezone=False)
1539
1496 def strdate(string, format, defaults=[]):
1540 def strdate(string, format, defaults=[]):
1497 """parse a localized time string and return a (unixtime, offset) tuple.
1541 """parse a localized time string and return a (unixtime, offset) tuple.
1498 if the string cannot be parsed, ValueError is raised."""
1542 if the string cannot be parsed, ValueError is raised."""
@@ -1528,17 +1572,21 b' def strdate(string, format, defaults=[])'
1528 unixtime = localunixtime + offset
1572 unixtime = localunixtime + offset
1529 return unixtime, offset
1573 return unixtime, offset
1530
1574
1531 def parsedate(string, formats=None, defaults=None):
1575 def parsedate(date, formats=None, defaults=None):
1532 """parse a localized time string and return a (unixtime, offset) tuple.
1576 """parse a localized date/time string and return a (unixtime, offset) tuple.
1577
1533 The date may be a "unixtime offset" string or in one of the specified
1578 The date may be a "unixtime offset" string or in one of the specified
1534 formats."""
1579 formats. If the date already is a (unixtime, offset) tuple, it is returned.
1535 if not string:
1580 """
1581 if not date:
1536 return 0, 0
1582 return 0, 0
1583 if type(date) is type((0, 0)) and len(date) == 2:
1584 return date
1537 if not formats:
1585 if not formats:
1538 formats = defaultdateformats
1586 formats = defaultdateformats
1539 string = string.strip()
1587 date = date.strip()
1540 try:
1588 try:
1541 when, offset = map(int, string.split(' '))
1589 when, offset = map(int, date.split(' '))
1542 except ValueError:
1590 except ValueError:
1543 # fill out defaults
1591 # fill out defaults
1544 if not defaults:
1592 if not defaults:
@@ -1555,13 +1603,13 b' def parsedate(string, formats=None, defa'
1555
1603
1556 for format in formats:
1604 for format in formats:
1557 try:
1605 try:
1558 when, offset = strdate(string, format, defaults)
1606 when, offset = strdate(date, format, defaults)
1559 except ValueError:
1607 except (ValueError, OverflowError):
1560 pass
1608 pass
1561 else:
1609 else:
1562 break
1610 break
1563 else:
1611 else:
1564 raise Abort(_('invalid date: %r ') % string)
1612 raise Abort(_('invalid date: %r ') % date)
1565 # validate explicit (probably user-specified) date and
1613 # validate explicit (probably user-specified) date and
1566 # time zone offset. values must fit in signed 32 bits for
1614 # time zone offset. values must fit in signed 32 bits for
1567 # current 32-bit linux runtimes. timezones go from UTC-12
1615 # current 32-bit linux runtimes. timezones go from UTC-12
@@ -1656,11 +1704,9 b' def walkrepos(path):'
1656 raise err
1704 raise err
1657
1705
1658 for root, dirs, files in os.walk(path, onerror=errhandler):
1706 for root, dirs, files in os.walk(path, onerror=errhandler):
1659 for d in dirs:
1707 if '.hg' in dirs:
1660 if d == '.hg':
1708 dirs[:] = [] # don't descend further
1661 yield root
1709 yield root # found a repository
1662 dirs[:] = []
1663 break
1664
1710
1665 _rcpath = None
1711 _rcpath = None
1666
1712
@@ -187,6 +187,37 b' def testpid(pid):'
187 return details[0] != winerror.ERROR_INVALID_PARAMETER
187 return details[0] != winerror.ERROR_INVALID_PARAMETER
188 return True
188 return True
189
189
190 def lookup_reg(key, valname=None, scope=None):
191 ''' Look up a key/value name in the Windows registry.
192
193 valname: value name. If unspecified, the default value for the key
194 is used.
195 scope: optionally specify scope for registry lookup, this can be
196 a sequence of scopes to look up in order. Default (CURRENT_USER,
197 LOCAL_MACHINE).
198 '''
199 try:
200 from _winreg import HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, \
201 QueryValueEx, OpenKey
202 except ImportError:
203 return None
204
205 def query_val(scope, key, valname):
206 try:
207 keyhandle = OpenKey(scope, key)
208 return QueryValueEx(keyhandle, valname)[0]
209 except EnvironmentError:
210 return None
211
212 if scope is None:
213 scope = (HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE)
214 elif not isinstance(scope, (list, tuple)):
215 scope = (scope,)
216 for s in scope:
217 val = query_val(s, key, valname)
218 if val is not None:
219 return val
220
190 def system_rcpath_win32():
221 def system_rcpath_win32():
191 '''return default os-specific hgrc search path'''
222 '''return default os-specific hgrc search path'''
192 proc = win32api.GetCurrentProcess()
223 proc = win32api.GetCurrentProcess()
@@ -40,11 +40,6 b' try:'
40 except ImportError:
40 except ImportError:
41 pass
41 pass
42
42
43 if os.name in ['nt']:
44 extra['scripts'] = ['hg']
45 else:
46 extra['scripts'] = ['hg', 'hgmerge']
47
48 # specify version string, otherwise 'hg identify' will be used:
43 # specify version string, otherwise 'hg identify' will be used:
49 version = ''
44 version = ''
50
45
@@ -77,6 +72,7 b" setup(name='mercurial',"
77 url='http://selenic.com/mercurial',
72 url='http://selenic.com/mercurial',
78 description='Scalable distributed SCM',
73 description='Scalable distributed SCM',
79 license='GNU GPL',
74 license='GNU GPL',
75 scripts=['hg'],
80 packages=['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert'],
76 packages=['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert'],
81 ext_modules=ext_modules,
77 ext_modules=ext_modules,
82 data_files=[(os.path.join('mercurial', root),
78 data_files=[(os.path.join('mercurial', root),
@@ -1,7 +1,7 b''
1 #motd#
1 #motd#
2 <div class="logo">
2 <div class="logo">
3 powered by<br/>
3 <a href="http://www.selenic.com/mercurial/">
4 <a href="http://www.selenic.com/mercurial/">mercurial</a>
4 <img src="#staticurl#hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
5 </div>
5 </div>
6
6
7 </body>
7 </body>
@@ -23,12 +23,12 b' filerevision = filerevision.tmpl'
23 fileannotate = fileannotate.tmpl
23 fileannotate = fileannotate.tmpl
24 filediff = filediff.tmpl
24 filediff = filediff.tmpl
25 filelog = filelog.tmpl
25 filelog = filelog.tmpl
26 fileline = '<div style="font-family:monospace" class="parity#parity#"><pre><span class="linenr"> #linenumber#</span> #line|escape#</pre></div>'
26 fileline = '<div style="font-family:monospace" class="parity#parity#"><pre><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</pre></div>'
27 annotateline = '<tr style="font-family:monospace" class="parity#parity#"><td class="linenr" style="text-align: right;"><a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#author|obfuscate#@#rev#</a></td><td><pre>#line|escape#</pre></td></tr>'
27 annotateline = '<tr style="font-family:monospace" class="parity#parity#"><td class="linenr" style="text-align: right;"><a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}#l{targetline}">#author|obfuscate#@#rev#</a></td><td><pre><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a></pre></td><td><pre>#line|escape#</pre></td></tr>'
28 difflineplus = '<span style="color:#008800;">#line|escape#</span>'
28 difflineplus = '<span style="color:#008800;"><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</span>'
29 difflineminus = '<span style="color:#cc0000;">#line|escape#</span>'
29 difflineminus = '<span style="color:#cc0000;"><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</span>'
30 difflineat = '<span style="color:#990099;">#line|escape#</span>'
30 difflineat = '<span style="color:#990099;"><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</span>'
31 diffline = '<span>#line|escape#</span>'
31 diffline = '<span><a class="linenr" href="##lineid#" id="#lineid#">#linenumber#</a> #line|escape#</span>'
32 changelogparent = '<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
32 changelogparent = '<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
33 changesetparent = '<tr><td>parent {rev}</td><td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>'
33 changesetparent = '<tr><td>parent {rev}</td><td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>'
34 filerevparent = '<tr><td>parent {rev}</td><td style="font-family:monospace"><a class="list" href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td></tr>'
34 filerevparent = '<tr><td>parent {rev}</td><td style="font-family:monospace"><a class="list" href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td></tr>'
@@ -22,13 +22,13 b' filerevision = filerevision.tmpl'
22 fileannotate = fileannotate.tmpl
22 fileannotate = fileannotate.tmpl
23 filediff = filediff.tmpl
23 filediff = filediff.tmpl
24 filelog = filelog.tmpl
24 filelog = filelog.tmpl
25 fileline = '<div class="parity#parity#"><span class="lineno">#linenumber#</span>#line|escape#</div>'
25 fileline = '<div class="parity#parity#"><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#</div>'
26 filelogentry = filelogentry.tmpl
26 filelogentry = filelogentry.tmpl
27 annotateline = '<tr class="parity#parity#"><td class="annotate"><a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}">#author|obfuscate#@#rev#</a></td><td><pre>#line|escape#</pre></td></tr>'
27 annotateline = '<tr class="parity#parity#"><td class="annotate"><a href="#url#annotate/#node|short#/#file|urlescape#{sessionvars%urlparameter}#l{targetline}">#author|obfuscate#@#rev#</a></td><td><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a></td><td><pre>#line|escape#</pre></td></tr>'
28 difflineplus = '<span class="plusline">#line|escape#</span>'
28 difflineplus = '<span class="plusline"><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#</span>'
29 difflineminus = '<span class="minusline">#line|escape#</span>'
29 difflineminus = '<span class="minusline"><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#</span>'
30 difflineat = '<span class="atline">#line|escape#</span>'
30 difflineat = '<span class="atline"><a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#</span>'
31 diffline = '#line|escape#'
31 diffline = '<a class="lineno" href="##lineid#" id="#lineid#">#linenumber#</a>#line|escape#'
32 changelogparent = '<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
32 changelogparent = '<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
33 changesetparent = '<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
33 changesetparent = '<tr><th class="parent">parent #rev#:</th><td class="parent"><a href="#url#rev/#node|short#{sessionvars%urlparameter}">#node|short#</a></td></tr>'
34 filerevparent = '<tr><td class="metatag">parent:</td><td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td></tr>'
34 filerevparent = '<tr><td class="metatag">parent:</td><td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a></td></tr>'
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
@@ -34,21 +34,8 b' a { text-decoration:none; }'
34 pre { margin: 0; }
34 pre { margin: 0; }
35
35
36 .logo {
36 .logo {
37 background-color: #333;
38 padding: 4pt;
39 margin: 8pt 0 8pt 8pt;
40 font-family: sans;
41 font-size: 60%;
42 color: white;
43 float: right;
37 float: right;
44 clear: right;
38 clear: right;
45 text-align: left;
46 }
47
48 .logo a {
49 font-weight: bold;
50 font-size: 150%;
51 color: #999;
52 }
39 }
53
40
54 /* Changelog/Filelog entries */
41 /* Changelog/Filelog entries */
@@ -218,7 +218,7 b' class StatementFindingAstVisitor(compile'
218 firstelse = self.getFirstLine(suite)
218 firstelse = self.getFirstLine(suite)
219 for l in range(lastprev+1, firstelse):
219 for l in range(lastprev+1, firstelse):
220 if l in self.suite_spots:
220 if l in self.suite_spots:
221 self.doSuite(None, suite, l in exclude=self.excluded)
221 self.doSuite(None, suite, exclude=l in self.excluded)
222 break
222 break
223 else:
223 else:
224 self.doSuite(None, suite)
224 self.doSuite(None, suite)
@@ -21,6 +21,9 b' def matchoutput(cmd, regexp, ignorestatu'
21 ret = fh.close()
21 ret = fh.close()
22 return (ignorestatus or ret is None) and r.search(s)
22 return (ignorestatus or ret is None) and r.search(s)
23
23
24 def has_baz():
25 return matchoutput('baz --version 2>&1', r'baz Bazaar version')
26
24 def has_cvs():
27 def has_cvs():
25 return matchoutput('cvs --version 2>&1', r'Concurrent Versions System')
28 return matchoutput('cvs --version 2>&1', r'Concurrent Versions System')
26
29
@@ -85,7 +88,27 b' def has_svn_bindings():'
85 def has_symlink():
88 def has_symlink():
86 return hasattr(os, "symlink")
89 return hasattr(os, "symlink")
87
90
91 def has_tla():
92 return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
93
94 def has_unix_permissions():
95 d = tempfile.mkdtemp(prefix=tempprefix, dir=".")
96 try:
97 fname = os.path.join(d, 'foo')
98 for umask in (077, 007, 022):
99 os.umask(umask)
100 f = open(fname, 'w')
101 f.close()
102 mode = os.stat(fname).st_mode
103 os.unlink(fname)
104 if mode & 0777 != ~umask & 0666:
105 return False
106 return True
107 finally:
108 os.rmdir(d)
109
88 checks = {
110 checks = {
111 "baz": (has_baz, "GNU Arch baz client"),
89 "cvs": (has_cvs, "cvs client"),
112 "cvs": (has_cvs, "cvs client"),
90 "cvsps": (has_cvsps, "cvsps utility"),
113 "cvsps": (has_cvsps, "cvsps utility"),
91 "darcs": (has_darcs, "darcs client"),
114 "darcs": (has_darcs, "darcs client"),
@@ -98,6 +121,8 b' checks = {'
98 "svn": (has_svn, "subversion client and admin tools"),
121 "svn": (has_svn, "subversion client and admin tools"),
99 "svn-bindings": (has_svn_bindings, "subversion python bindings"),
122 "svn-bindings": (has_svn_bindings, "subversion python bindings"),
100 "symlink": (has_symlink, "symbolic links"),
123 "symlink": (has_symlink, "symbolic links"),
124 "tla": (has_tla, "GNU Arch tla client"),
125 "unix-permissions": (has_unix_permissions, "unix-style permissions"),
101 }
126 }
102
127
103 def list_features():
128 def list_features():
@@ -420,9 +420,7 b' DAEMON_PIDS = None'
420 HGRCPATH = None
420 HGRCPATH = None
421
421
422 os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
422 os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
423 os.environ["HGMERGE"] = ('python "%s" -L my -L other'
423 os.environ["HGMERGE"] = "internal:merge"
424 % os.path.join(TESTDIR, os.path.pardir,
425 'contrib', 'simplemerge'))
426 os.environ["HGUSER"] = "test"
424 os.environ["HGUSER"] = "test"
427 os.environ["HGENCODING"] = "ascii"
425 os.environ["HGENCODING"] = "ascii"
428 os.environ["HGENCODINGMODE"] = "strict"
426 os.environ["HGENCODINGMODE"] = "strict"
@@ -28,6 +28,7 b' adding foo/Bar/file.txt revisions'
28 adding foo/file.txt revisions
28 adding foo/file.txt revisions
29 adding quux/file.py revisions
29 adding quux/file.py revisions
30 added 3 changesets with 3 changes to 3 files
30 added 3 changesets with 3 changes to 3 files
31 updating the branch cache
31 rolling back last transaction
32 rolling back last transaction
32 0:6675d58eff77
33 0:6675d58eff77
33
34
@@ -59,6 +60,7 b' calling hook pretxnchangegroup.acl: hgex'
59 acl: acl.allow not enabled
60 acl: acl.allow not enabled
60 acl: acl.deny not enabled
61 acl: acl.deny not enabled
61 acl: changes have source "push" - skipping
62 acl: changes have source "push" - skipping
63 updating the branch cache
62 rolling back last transaction
64 rolling back last transaction
63 0:6675d58eff77
65 0:6675d58eff77
64
66
@@ -94,6 +96,7 b' acl: acl.deny not enabled'
94 acl: allowing changeset ef1ea85a6374
96 acl: allowing changeset ef1ea85a6374
95 acl: allowing changeset f9cafe1212c8
97 acl: allowing changeset f9cafe1212c8
96 acl: allowing changeset 911600dab2ae
98 acl: allowing changeset 911600dab2ae
99 updating the branch cache
97 rolling back last transaction
100 rolling back last transaction
98 0:6675d58eff77
101 0:6675d58eff77
99
102
@@ -383,6 +386,7 b' acl: acl.deny enabled, 0 entries for use'
383 acl: allowing changeset ef1ea85a6374
386 acl: allowing changeset ef1ea85a6374
384 acl: allowing changeset f9cafe1212c8
387 acl: allowing changeset f9cafe1212c8
385 acl: allowing changeset 911600dab2ae
388 acl: allowing changeset 911600dab2ae
389 updating the branch cache
386 rolling back last transaction
390 rolling back last transaction
387 0:6675d58eff77
391 0:6675d58eff77
388
392
@@ -578,6 +582,7 b' acl: acl.deny enabled, 0 entries for use'
578 acl: allowing changeset ef1ea85a6374
582 acl: allowing changeset ef1ea85a6374
579 acl: allowing changeset f9cafe1212c8
583 acl: allowing changeset f9cafe1212c8
580 acl: allowing changeset 911600dab2ae
584 acl: allowing changeset 911600dab2ae
585 updating the branch cache
581 rolling back last transaction
586 rolling back last transaction
582 0:6675d58eff77
587 0:6675d58eff77
583
588
@@ -13,21 +13,26 b' A b'
13 % should fail
13 % should fail
14 a already tracked!
14 a already tracked!
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
16 merging a
16 warning: conflicts during merge.
17 warning: conflicts during merge.
17 merging a
18 merging a failed!
18 merging a failed!
19 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
19 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
20 There are unresolved merges, you can redo the full merge using:
20 There are unresolved merges, you can redo the full merge using:
21 hg update -C 2
21 hg update -C 2
22 hg merge 1
22 hg merge 1
23 M a
23 M a
24 ? a.orig
24 % should fail
25 % should fail
25 a already tracked!
26 a already tracked!
26 M a
27 M a
28 ? a.orig
27 % issue683
29 % issue683
28 R a
30 R a
31 ? a.orig
29 M a
32 M a
33 ? a.orig
30 c does not exist!
34 c does not exist!
31 d does not exist!
35 d does not exist!
32 M a
36 M a
33 A c
37 A c
38 ? a.orig
@@ -69,6 +69,8 b' if [ -f rev-0.tar ]; then'
69 echo 'rev-0.tar created'
69 echo 'rev-0.tar created'
70 fi
70 fi
71
71
72 hg archive -t bogus test.bogus
73
72 echo % server errors
74 echo % server errors
73 cat errors.log
75 cat errors.log
74
76
@@ -39,6 +39,7 b' test-TIP/bar'
39 test-TIP/baz/bletch
39 test-TIP/baz/bletch
40 test-TIP/foo
40 test-TIP/foo
41 rev-0.tar created
41 rev-0.tar created
42 abort: unknown archive type 'bogus'
42 % server errors
43 % server errors
43 % empty repo
44 % empty repo
44 abort: repository has no revisions
45 abort: repository has no revisions
@@ -1,108 +1,113 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 heads()
4 {
5 hg heads --template '#rev#: #desc|firstline|strip#\n' "$@"
6 }
7
3 hg init a
8 hg init a
4 cd a
9 cd a
5 echo 'root' >root
10 echo 'root' >root
6 hg add root
11 hg add root
7 hg commit -d '0 0' -u test -m "Adding root node"
12 hg commit -m "Adding root node"
8 hg heads
13 heads
9 echo '-------'
14 echo '-------'
10 hg heads .
15 heads .
11
16
12 echo '======='
17 echo '======='
13 echo 'a' >a
18 echo 'a' >a
14 hg add a
19 hg add a
15 hg branch a
20 hg branch a
16 hg commit -d '1 0' -u test -m "Adding a branch"
21 hg commit -m "Adding a branch"
17 hg heads
22 heads
18 echo '-------'
23 echo '-------'
19 hg heads .
24 heads .
20
25
21 echo '======='
26 echo '======='
22 hg update -C 0
27 hg update -C 0
23 echo 'b' >b
28 echo 'b' >b
24 hg add b
29 hg add b
25 hg branch b
30 hg branch b
26 hg commit -d '2 0' -u test -m "Adding b branch"
31 hg commit -m "Adding b branch"
27 hg heads
32 heads
28 echo '-------'
33 echo '-------'
29 hg heads .
34 heads .
30
35
31 echo '======='
36 echo '======='
32 echo 'bh1' >bh1
37 echo 'bh1' >bh1
33 hg add bh1
38 hg add bh1
34 hg commit -d '3 0' -u test -m "Adding b branch head 1"
39 hg commit -m "Adding b branch head 1"
35 hg heads
40 heads
36 echo '-------'
41 echo '-------'
37 hg heads .
42 heads .
38
43
39 echo '======='
44 echo '======='
40 hg update -C 2
45 hg update -C 2
41 echo 'bh2' >bh2
46 echo 'bh2' >bh2
42 hg add bh2
47 hg add bh2
43 hg commit -d '4 0' -u test -m "Adding b branch head 2"
48 hg commit -m "Adding b branch head 2"
44 hg heads
49 heads
45 echo '-------'
50 echo '-------'
46 hg heads .
51 heads .
47
52
48 echo '======='
53 echo '======='
49 hg update -C 2
54 hg update -C 2
50 echo 'bh3' >bh3
55 echo 'bh3' >bh3
51 hg add bh3
56 hg add bh3
52 hg commit -d '5 0' -u test -m "Adding b branch head 3"
57 hg commit -m "Adding b branch head 3"
53 hg heads
58 heads
54 echo '-------'
59 echo '-------'
55 hg heads .
60 heads .
56
61
57 echo '======='
62 echo '======='
58 hg merge 4
63 hg merge 4
59 hg commit -d '6 0' -u test -m "Merging b branch head 2 and b branch head 3"
64 hg commit -m "Merging b branch head 2 and b branch head 3"
60 hg heads
65 heads
61 echo '-------'
66 echo '-------'
62 hg heads .
67 heads .
63
68
64 echo '======='
69 echo '======='
65 echo 'c' >c
70 echo 'c' >c
66 hg add c
71 hg add c
67 hg branch c
72 hg branch c
68 hg commit -d '7 0' -u test -m "Adding c branch"
73 hg commit -m "Adding c branch"
69 hg heads
74 heads
70 echo '-------'
75 echo '-------'
71 hg heads .
76 heads .
72
77
73 echo '======='
78 echo '======='
74 hg heads -r 3 .
79 heads -r 3 .
75 echo $?
80 echo $?
76 echo '-------'
81 echo '-------'
77 hg heads -r 2 .
82 heads -r 2 .
78 echo $?
83 echo $?
79 echo '-------'
84 echo '-------'
80 hg update -C 4
85 hg update -C 4
81 echo $?
86 echo $?
82 echo '-------'
87 echo '-------'
83 hg heads -r 3 .
88 heads -r 3 .
84 echo $?
89 echo $?
85 echo '-------'
90 echo '-------'
86 hg heads -r 2 .
91 heads -r 2 .
87 echo $?
92 echo $?
88 echo '-------'
93 echo '-------'
89 hg heads -r 7 .
94 heads -r 7 .
90 echo $?
95 echo $?
91
96
92 echo '======='
97 echo '======='
93 for i in 0 1 2 3 4 5 6 7; do
98 for i in 0 1 2 3 4 5 6 7; do
94 hg update -C "$i"
99 hg update -C "$i"
95 hg heads
100 heads
96 echo '-------'
101 echo '-------'
97 hg heads .
102 heads .
98 echo '-------'
103 echo '-------'
99 done
104 done
100
105
101 echo '======='
106 echo '======='
102 for i in a b c z; do
107 for i in a b c z; do
103 hg heads "$i"
108 heads "$i"
104 echo '-------'
109 echo '-------'
105 done
110 done
106
111
107 echo '======='
112 echo '======='
108 hg heads 0 1 2 3 4 5 6 7
113 heads 0 1 2 3 4 5 6 7
This diff has been collapsed as it changes many lines, (619 lines changed) Show them Hide them
@@ -1,608 +1,151 b''
1 changeset: 0:19709c5a4e75
1 0: Adding root node
2 tag: tip
3 user: test
4 date: Thu Jan 01 00:00:00 1970 +0000
5 summary: Adding root node
6
7 -------
2 -------
8 changeset: 0:19709c5a4e75
3 0: Adding root node
9 tag: tip
10 user: test
11 date: Thu Jan 01 00:00:00 1970 +0000
12 summary: Adding root node
13
14 =======
4 =======
15 marked working directory as branch a
5 marked working directory as branch a
16 changeset: 1:dd6b440dd85a
6 1: Adding a branch
17 branch: a
18 tag: tip
19 user: test
20 date: Thu Jan 01 00:00:01 1970 +0000
21 summary: Adding a branch
22
23 -------
7 -------
24 changeset: 1:dd6b440dd85a
8 1: Adding a branch
25 branch: a
26 tag: tip
27 user: test
28 date: Thu Jan 01 00:00:01 1970 +0000
29 summary: Adding a branch
30
31 =======
9 =======
32 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
10 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
33 marked working directory as branch b
11 marked working directory as branch b
34 changeset: 2:ac22033332d1
12 2: Adding b branch
35 branch: b
13 1: Adding a branch
36 tag: tip
37 parent: 0:19709c5a4e75
38 user: test
39 date: Thu Jan 01 00:00:02 1970 +0000
40 summary: Adding b branch
41
42 changeset: 1:dd6b440dd85a
43 branch: a
44 user: test
45 date: Thu Jan 01 00:00:01 1970 +0000
46 summary: Adding a branch
47
48 -------
14 -------
49 changeset: 2:ac22033332d1
15 2: Adding b branch
50 branch: b
51 tag: tip
52 parent: 0:19709c5a4e75
53 user: test
54 date: Thu Jan 01 00:00:02 1970 +0000
55 summary: Adding b branch
56
57 =======
16 =======
58 changeset: 3:aee39cd168d0
17 3: Adding b branch head 1
59 branch: b
18 1: Adding a branch
60 tag: tip
61 user: test
62 date: Thu Jan 01 00:00:03 1970 +0000
63 summary: Adding b branch head 1
64
65 changeset: 1:dd6b440dd85a
66 branch: a
67 user: test
68 date: Thu Jan 01 00:00:01 1970 +0000
69 summary: Adding a branch
70
71 -------
19 -------
72 changeset: 3:aee39cd168d0
20 3: Adding b branch head 1
73 branch: b
74 tag: tip
75 user: test
76 date: Thu Jan 01 00:00:03 1970 +0000
77 summary: Adding b branch head 1
78
79 =======
21 =======
80 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
22 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
81 changeset: 4:22df7444f7c1
23 4: Adding b branch head 2
82 branch: b
24 3: Adding b branch head 1
83 tag: tip
25 1: Adding a branch
84 parent: 2:ac22033332d1
85 user: test
86 date: Thu Jan 01 00:00:04 1970 +0000
87 summary: Adding b branch head 2
88
89 changeset: 3:aee39cd168d0
90 branch: b
91 user: test
92 date: Thu Jan 01 00:00:03 1970 +0000
93 summary: Adding b branch head 1
94
95 changeset: 1:dd6b440dd85a
96 branch: a
97 user: test
98 date: Thu Jan 01 00:00:01 1970 +0000
99 summary: Adding a branch
100
101 -------
26 -------
102 changeset: 4:22df7444f7c1
27 4: Adding b branch head 2
103 branch: b
28 3: Adding b branch head 1
104 tag: tip
105 parent: 2:ac22033332d1
106 user: test
107 date: Thu Jan 01 00:00:04 1970 +0000
108 summary: Adding b branch head 2
109
110 changeset: 3:aee39cd168d0
111 branch: b
112 user: test
113 date: Thu Jan 01 00:00:03 1970 +0000
114 summary: Adding b branch head 1
115
116 =======
29 =======
117 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
30 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
118 changeset: 5:0d57af4f9583
31 5: Adding b branch head 3
119 branch: b
32 4: Adding b branch head 2
120 tag: tip
33 3: Adding b branch head 1
121 parent: 2:ac22033332d1
34 1: Adding a branch
122 user: test
123 date: Thu Jan 01 00:00:05 1970 +0000
124 summary: Adding b branch head 3
125
126 changeset: 4:22df7444f7c1
127 branch: b
128 parent: 2:ac22033332d1
129 user: test
130 date: Thu Jan 01 00:00:04 1970 +0000
131 summary: Adding b branch head 2
132
133 changeset: 3:aee39cd168d0
134 branch: b
135 user: test
136 date: Thu Jan 01 00:00:03 1970 +0000
137 summary: Adding b branch head 1
138
139 changeset: 1:dd6b440dd85a
140 branch: a
141 user: test
142 date: Thu Jan 01 00:00:01 1970 +0000
143 summary: Adding a branch
144
145 -------
35 -------
146 changeset: 5:0d57af4f9583
36 5: Adding b branch head 3
147 branch: b
37 4: Adding b branch head 2
148 tag: tip
38 3: Adding b branch head 1
149 parent: 2:ac22033332d1
150 user: test
151 date: Thu Jan 01 00:00:05 1970 +0000
152 summary: Adding b branch head 3
153
154 changeset: 4:22df7444f7c1
155 branch: b
156 parent: 2:ac22033332d1
157 user: test
158 date: Thu Jan 01 00:00:04 1970 +0000
159 summary: Adding b branch head 2
160
161 changeset: 3:aee39cd168d0
162 branch: b
163 user: test
164 date: Thu Jan 01 00:00:03 1970 +0000
165 summary: Adding b branch head 1
166
167 =======
39 =======
168 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
40 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
169 (branch merge, don't forget to commit)
41 (branch merge, don't forget to commit)
170 changeset: 6:00432327d822
42 6: Merging b branch head 2 and b branch head 3
171 branch: b
43 3: Adding b branch head 1
172 tag: tip
44 1: Adding a branch
173 parent: 5:0d57af4f9583
174 parent: 4:22df7444f7c1
175 user: test
176 date: Thu Jan 01 00:00:06 1970 +0000
177 summary: Merging b branch head 2 and b branch head 3
178
179 changeset: 3:aee39cd168d0
180 branch: b
181 user: test
182 date: Thu Jan 01 00:00:03 1970 +0000
183 summary: Adding b branch head 1
184
185 changeset: 1:dd6b440dd85a
186 branch: a
187 user: test
188 date: Thu Jan 01 00:00:01 1970 +0000
189 summary: Adding a branch
190
191 -------
45 -------
192 changeset: 6:00432327d822
46 6: Merging b branch head 2 and b branch head 3
193 branch: b
47 3: Adding b branch head 1
194 tag: tip
195 parent: 5:0d57af4f9583
196 parent: 4:22df7444f7c1
197 user: test
198 date: Thu Jan 01 00:00:06 1970 +0000
199 summary: Merging b branch head 2 and b branch head 3
200
201 changeset: 3:aee39cd168d0
202 branch: b
203 user: test
204 date: Thu Jan 01 00:00:03 1970 +0000
205 summary: Adding b branch head 1
206
207 =======
48 =======
208 marked working directory as branch c
49 marked working directory as branch c
209 changeset: 7:9fb091bb9835
50 7: Adding c branch
210 branch: c
51 3: Adding b branch head 1
211 tag: tip
52 1: Adding a branch
212 user: test
213 date: Thu Jan 01 00:00:07 1970 +0000
214 summary: Adding c branch
215
216 changeset: 3:aee39cd168d0
217 branch: b
218 user: test
219 date: Thu Jan 01 00:00:03 1970 +0000
220 summary: Adding b branch head 1
221
222 changeset: 1:dd6b440dd85a
223 branch: a
224 user: test
225 date: Thu Jan 01 00:00:01 1970 +0000
226 summary: Adding a branch
227
228 -------
53 -------
229 changeset: 7:9fb091bb9835
54 7: Adding c branch
230 branch: c
231 tag: tip
232 user: test
233 date: Thu Jan 01 00:00:07 1970 +0000
234 summary: Adding c branch
235
236 =======
55 =======
237 no changes on branch c containing . are reachable from 3
56 no changes on branch c containing . are reachable from 3
238 1
57 1
239 -------
58 -------
240 changeset: 7:9fb091bb9835
59 7: Adding c branch
241 branch: c
242 tag: tip
243 user: test
244 date: Thu Jan 01 00:00:07 1970 +0000
245 summary: Adding c branch
246
247 0
60 0
248 -------
61 -------
249 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
62 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
250 0
63 0
251 -------
64 -------
252 changeset: 3:aee39cd168d0
65 3: Adding b branch head 1
253 branch: b
254 user: test
255 date: Thu Jan 01 00:00:03 1970 +0000
256 summary: Adding b branch head 1
257
258 0
66 0
259 -------
67 -------
260 changeset: 3:aee39cd168d0
68 3: Adding b branch head 1
261 branch: b
69 6: Merging b branch head 2 and b branch head 3
262 user: test
263 date: Thu Jan 01 00:00:03 1970 +0000
264 summary: Adding b branch head 1
265
266 changeset: 6:00432327d822
267 branch: b
268 parent: 5:0d57af4f9583
269 parent: 4:22df7444f7c1
270 user: test
271 date: Thu Jan 01 00:00:06 1970 +0000
272 summary: Merging b branch head 2 and b branch head 3
273
274 0
70 0
275 -------
71 -------
276 no changes on branch b containing . are reachable from 7
72 no changes on branch b containing . are reachable from 7
277 1
73 1
278 =======
74 =======
279 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
75 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
280 changeset: 7:9fb091bb9835
76 7: Adding c branch
281 branch: c
77 3: Adding b branch head 1
282 tag: tip
78 1: Adding a branch
283 user: test
284 date: Thu Jan 01 00:00:07 1970 +0000
285 summary: Adding c branch
286
287 changeset: 3:aee39cd168d0
288 branch: b
289 user: test
290 date: Thu Jan 01 00:00:03 1970 +0000
291 summary: Adding b branch head 1
292
293 changeset: 1:dd6b440dd85a
294 branch: a
295 user: test
296 date: Thu Jan 01 00:00:01 1970 +0000
297 summary: Adding a branch
298
299 -------
79 -------
300 changeset: 0:19709c5a4e75
80 0: Adding root node
301 user: test
302 date: Thu Jan 01 00:00:00 1970 +0000
303 summary: Adding root node
304
305 -------
81 -------
306 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
82 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
307 changeset: 7:9fb091bb9835
83 7: Adding c branch
308 branch: c
84 3: Adding b branch head 1
309 tag: tip
85 1: Adding a branch
310 user: test
311 date: Thu Jan 01 00:00:07 1970 +0000
312 summary: Adding c branch
313
314 changeset: 3:aee39cd168d0
315 branch: b
316 user: test
317 date: Thu Jan 01 00:00:03 1970 +0000
318 summary: Adding b branch head 1
319
320 changeset: 1:dd6b440dd85a
321 branch: a
322 user: test
323 date: Thu Jan 01 00:00:01 1970 +0000
324 summary: Adding a branch
325
326 -------
86 -------
327 changeset: 1:dd6b440dd85a
87 1: Adding a branch
328 branch: a
329 user: test
330 date: Thu Jan 01 00:00:01 1970 +0000
331 summary: Adding a branch
332
333 -------
88 -------
334 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
89 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
335 changeset: 7:9fb091bb9835
90 7: Adding c branch
336 branch: c
91 3: Adding b branch head 1
337 tag: tip
92 1: Adding a branch
338 user: test
339 date: Thu Jan 01 00:00:07 1970 +0000
340 summary: Adding c branch
341
342 changeset: 3:aee39cd168d0
343 branch: b
344 user: test
345 date: Thu Jan 01 00:00:03 1970 +0000
346 summary: Adding b branch head 1
347
348 changeset: 1:dd6b440dd85a
349 branch: a
350 user: test
351 date: Thu Jan 01 00:00:01 1970 +0000
352 summary: Adding a branch
353
354 -------
93 -------
355 changeset: 6:00432327d822
94 6: Merging b branch head 2 and b branch head 3
356 branch: b
95 3: Adding b branch head 1
357 parent: 5:0d57af4f9583
358 parent: 4:22df7444f7c1
359 user: test
360 date: Thu Jan 01 00:00:06 1970 +0000
361 summary: Merging b branch head 2 and b branch head 3
362
363 changeset: 3:aee39cd168d0
364 branch: b
365 user: test
366 date: Thu Jan 01 00:00:03 1970 +0000
367 summary: Adding b branch head 1
368
369 -------
96 -------
370 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
97 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
371 changeset: 7:9fb091bb9835
98 7: Adding c branch
372 branch: c
99 3: Adding b branch head 1
373 tag: tip
100 1: Adding a branch
374 user: test
375 date: Thu Jan 01 00:00:07 1970 +0000
376 summary: Adding c branch
377
378 changeset: 3:aee39cd168d0
379 branch: b
380 user: test
381 date: Thu Jan 01 00:00:03 1970 +0000
382 summary: Adding b branch head 1
383
384 changeset: 1:dd6b440dd85a
385 branch: a
386 user: test
387 date: Thu Jan 01 00:00:01 1970 +0000
388 summary: Adding a branch
389
390 -------
101 -------
391 changeset: 6:00432327d822
102 6: Merging b branch head 2 and b branch head 3
392 branch: b
103 3: Adding b branch head 1
393 parent: 5:0d57af4f9583
394 parent: 4:22df7444f7c1
395 user: test
396 date: Thu Jan 01 00:00:06 1970 +0000
397 summary: Merging b branch head 2 and b branch head 3
398
399 changeset: 3:aee39cd168d0
400 branch: b
401 user: test
402 date: Thu Jan 01 00:00:03 1970 +0000
403 summary: Adding b branch head 1
404
405 -------
104 -------
406 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
105 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
407 changeset: 7:9fb091bb9835
106 7: Adding c branch
408 branch: c
107 3: Adding b branch head 1
409 tag: tip
108 1: Adding a branch
410 user: test
411 date: Thu Jan 01 00:00:07 1970 +0000
412 summary: Adding c branch
413
414 changeset: 3:aee39cd168d0
415 branch: b
416 user: test
417 date: Thu Jan 01 00:00:03 1970 +0000
418 summary: Adding b branch head 1
419
420 changeset: 1:dd6b440dd85a
421 branch: a
422 user: test
423 date: Thu Jan 01 00:00:01 1970 +0000
424 summary: Adding a branch
425
426 -------
109 -------
427 changeset: 6:00432327d822
110 6: Merging b branch head 2 and b branch head 3
428 branch: b
111 3: Adding b branch head 1
429 parent: 5:0d57af4f9583
430 parent: 4:22df7444f7c1
431 user: test
432 date: Thu Jan 01 00:00:06 1970 +0000
433 summary: Merging b branch head 2 and b branch head 3
434
435 changeset: 3:aee39cd168d0
436 branch: b
437 user: test
438 date: Thu Jan 01 00:00:03 1970 +0000
439 summary: Adding b branch head 1
440
441 -------
112 -------
442 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
113 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
443 changeset: 7:9fb091bb9835
114 7: Adding c branch
444 branch: c
115 3: Adding b branch head 1
445 tag: tip
116 1: Adding a branch
446 user: test
447 date: Thu Jan 01 00:00:07 1970 +0000
448 summary: Adding c branch
449
450 changeset: 3:aee39cd168d0
451 branch: b
452 user: test
453 date: Thu Jan 01 00:00:03 1970 +0000
454 summary: Adding b branch head 1
455
456 changeset: 1:dd6b440dd85a
457 branch: a
458 user: test
459 date: Thu Jan 01 00:00:01 1970 +0000
460 summary: Adding a branch
461
462 -------
117 -------
463 changeset: 6:00432327d822
118 6: Merging b branch head 2 and b branch head 3
464 branch: b
119 3: Adding b branch head 1
465 parent: 5:0d57af4f9583
466 parent: 4:22df7444f7c1
467 user: test
468 date: Thu Jan 01 00:00:06 1970 +0000
469 summary: Merging b branch head 2 and b branch head 3
470
471 changeset: 3:aee39cd168d0
472 branch: b
473 user: test
474 date: Thu Jan 01 00:00:03 1970 +0000
475 summary: Adding b branch head 1
476
477 -------
120 -------
478 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
121 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
479 changeset: 7:9fb091bb9835
122 7: Adding c branch
480 branch: c
123 3: Adding b branch head 1
481 tag: tip
124 1: Adding a branch
482 user: test
483 date: Thu Jan 01 00:00:07 1970 +0000
484 summary: Adding c branch
485
486 changeset: 3:aee39cd168d0
487 branch: b
488 user: test
489 date: Thu Jan 01 00:00:03 1970 +0000
490 summary: Adding b branch head 1
491
492 changeset: 1:dd6b440dd85a
493 branch: a
494 user: test
495 date: Thu Jan 01 00:00:01 1970 +0000
496 summary: Adding a branch
497
498 -------
125 -------
499 changeset: 6:00432327d822
126 6: Merging b branch head 2 and b branch head 3
500 branch: b
127 3: Adding b branch head 1
501 parent: 5:0d57af4f9583
502 parent: 4:22df7444f7c1
503 user: test
504 date: Thu Jan 01 00:00:06 1970 +0000
505 summary: Merging b branch head 2 and b branch head 3
506
507 changeset: 3:aee39cd168d0
508 branch: b
509 user: test
510 date: Thu Jan 01 00:00:03 1970 +0000
511 summary: Adding b branch head 1
512
513 -------
128 -------
514 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
129 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
515 changeset: 7:9fb091bb9835
130 7: Adding c branch
516 branch: c
131 3: Adding b branch head 1
517 tag: tip
132 1: Adding a branch
518 user: test
519 date: Thu Jan 01 00:00:07 1970 +0000
520 summary: Adding c branch
521
522 changeset: 3:aee39cd168d0
523 branch: b
524 user: test
525 date: Thu Jan 01 00:00:03 1970 +0000
526 summary: Adding b branch head 1
527
528 changeset: 1:dd6b440dd85a
529 branch: a
530 user: test
531 date: Thu Jan 01 00:00:01 1970 +0000
532 summary: Adding a branch
533
534 -------
133 -------
535 changeset: 7:9fb091bb9835
134 7: Adding c branch
536 branch: c
537 tag: tip
538 user: test
539 date: Thu Jan 01 00:00:07 1970 +0000
540 summary: Adding c branch
541
542 -------
135 -------
543 =======
136 =======
544 changeset: 1:dd6b440dd85a
137 1: Adding a branch
545 branch: a
546 user: test
547 date: Thu Jan 01 00:00:01 1970 +0000
548 summary: Adding a branch
549
550 -------
138 -------
551 changeset: 6:00432327d822
139 6: Merging b branch head 2 and b branch head 3
552 branch: b
140 3: Adding b branch head 1
553 parent: 5:0d57af4f9583
554 parent: 4:22df7444f7c1
555 user: test
556 date: Thu Jan 01 00:00:06 1970 +0000
557 summary: Merging b branch head 2 and b branch head 3
558
559 changeset: 3:aee39cd168d0
560 branch: b
561 user: test
562 date: Thu Jan 01 00:00:03 1970 +0000
563 summary: Adding b branch head 1
564
565 -------
141 -------
566 changeset: 7:9fb091bb9835
142 7: Adding c branch
567 branch: c
568 tag: tip
569 user: test
570 date: Thu Jan 01 00:00:07 1970 +0000
571 summary: Adding c branch
572
573 -------
143 -------
574 abort: unknown revision 'z'!
144 abort: unknown revision 'z'!
575 -------
145 -------
576 =======
146 =======
577 changeset: 0:19709c5a4e75
147 0: Adding root node
578 user: test
148 1: Adding a branch
579 date: Thu Jan 01 00:00:00 1970 +0000
149 6: Merging b branch head 2 and b branch head 3
580 summary: Adding root node
150 3: Adding b branch head 1
581
151 7: Adding c branch
582 changeset: 1:dd6b440dd85a
583 branch: a
584 user: test
585 date: Thu Jan 01 00:00:01 1970 +0000
586 summary: Adding a branch
587
588 changeset: 6:00432327d822
589 branch: b
590 parent: 5:0d57af4f9583
591 parent: 4:22df7444f7c1
592 user: test
593 date: Thu Jan 01 00:00:06 1970 +0000
594 summary: Merging b branch head 2 and b branch head 3
595
596 changeset: 3:aee39cd168d0
597 branch: b
598 user: test
599 date: Thu Jan 01 00:00:03 1970 +0000
600 summary: Adding b branch head 1
601
602 changeset: 7:9fb091bb9835
603 branch: c
604 tag: tip
605 user: test
606 date: Thu Jan 01 00:00:07 1970 +0000
607 summary: Adding c branch
608
@@ -34,3 +34,9 b' hg commit -d \'5 0\' -u test -m "Adding c '
34 hg branches
34 hg branches
35 echo '-------'
35 echo '-------'
36 hg branches -a
36 hg branches -a
37
38 echo "--- Branch a"
39 hg log -b a
40
41 echo "---- Branch b"
42 hg log -b b
@@ -10,3 +10,31 b' default 0:19709c5'
10 -------
10 -------
11 c 5:5ca481e59b8c
11 c 5:5ca481e59b8c
12 a 1:dd6b440dd85a
12 a 1:dd6b440dd85a
13 --- Branch a
14 changeset: 1:dd6b440dd85a
15 branch: a
16 user: test
17 date: Thu Jan 01 00:00:01 1970 +0000
18 summary: Adding a branch
19
20 ---- Branch b
21 changeset: 4:22df7444f7c1
22 branch: b
23 parent: 2:ac22033332d1
24 user: test
25 date: Thu Jan 01 00:00:04 1970 +0000
26 summary: Adding b branch head 2
27
28 changeset: 3:aee39cd168d0
29 branch: b
30 user: test
31 date: Thu Jan 01 00:00:03 1970 +0000
32 summary: Adding b branch head 1
33
34 changeset: 2:ac22033332d1
35 branch: b
36 parent: 0:19709c5a4e75
37 user: test
38 date: Thu Jan 01 00:00:02 1970 +0000
39 summary: Adding b branch
40
@@ -70,7 +70,14 b" echo 'changegroup = python ../printenv.p"
70 #doesn't work (yet ?)
70 #doesn't work (yet ?)
71 #hg -R bundle://../full.hg verify
71 #hg -R bundle://../full.hg verify
72 hg pull bundle://../full.hg
72 hg pull bundle://../full.hg
73 echo "====== Rollback empty"
74 hg rollback
73 cd ..
75 cd ..
76 echo "====== Log -R bundle:empty+full.hg"
77 hg -R bundle:empty+full.hg log --template="{rev} "
78 echo ""
79 echo "====== Pull full.hg into empty again (using -R; with hook)"
80 hg -R empty pull full.hg
74
81
75 echo "====== Create partial clones"
82 echo "====== Create partial clones"
76 rm -r empty
83 rm -r empty
@@ -124,6 +124,19 b' adding manifests'
124 adding file changes
124 adding file changes
125 added 9 changesets with 7 changes to 4 files (+1 heads)
125 added 9 changesets with 7 changes to 4 files (+1 heads)
126 (run 'hg heads' to see heads, 'hg merge' to merge)
126 (run 'hg heads' to see heads, 'hg merge' to merge)
127 ====== Rollback empty
128 rolling back last transaction
129 ====== Log -R bundle:empty+full.hg
130 8 7 6 5 4 3 2 1 0
131 ====== Pull full.hg into empty again (using -R; with hook)
132 changegroup hook: HG_NODE=5649c9d34dd87d0ecb5fd39672128376e83b22e1 HG_SOURCE=pull HG_URL=bundle:empty+full.hg
133 pulling from full.hg
134 requesting all changes
135 adding changesets
136 adding manifests
137 adding file changes
138 added 9 changesets with 7 changes to 4 files (+1 heads)
139 (run 'hg heads' to see heads, 'hg merge' to merge)
127 ====== Create partial clones
140 ====== Create partial clones
128 requesting all changes
141 requesting all changes
129 adding changesets
142 adding changesets
@@ -8,6 +8,7 b' echo 0 > b'
8 hg ci -A -m m -d "1000000 0"
8 hg ci -A -m m -d "1000000 0"
9 hg rm a
9 hg rm a
10 hg cat a
10 hg cat a
11 hg cat --decode a # more tests in test-encode
11 sleep 1 # make sure mtime is changed
12 sleep 1 # make sure mtime is changed
12 echo 1 > b
13 echo 1 > b
13 hg ci -m m -d "1000000 0"
14 hg ci -m m -d "1000000 0"
@@ -3,5 +3,6 b' adding b'
3 0
3 0
4 0
4 0
5 0
5 0
6 0
6 a: No such file in rev 03f6b0774996
7 a: No such file in rev 03f6b0774996
7 1
8 1
@@ -32,4 +32,8 b' cd ../..'
32 hg clone file://a e
32 hg clone file://a e
33 grep 'file:' e/.hg/hgrc
33 grep 'file:' e/.hg/hgrc
34
34
35 # check that path aliases are expanded
36 hg clone -q -U --config 'paths.foobar=a#0' foobar f
37 hg -R f showconfig paths.default | sed -e 's,.*/,,'
38
35 exit 0
39 exit 0
@@ -15,3 +15,4 b' destination directory: a'
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
16 a
16 a
17 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
17 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
18 a#0
@@ -1,10 +1,5 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 cleanpath()
4 {
5 sed -e "s:/.*\(/test/.*\):...\1:"
6 }
7
8 echo % commit date test
3 echo % commit date test
9 hg init test
4 hg init test
10 cd test
5 cd test
@@ -19,11 +14,12 b" hg commit -d 'foo bar' -m commit-5"
19 hg commit -d ' 1 4444' -m commit-6
14 hg commit -d ' 1 4444' -m commit-6
20 hg commit -d '111111111111 0' -m commit-7
15 hg commit -d '111111111111 0' -m commit-7
21
16
22 echo % partial commit test
17 echo % commit added file that has been deleted
23 echo bar > bar
18 echo bar > bar
24 hg add bar
19 hg add bar
25 rm bar
20 rm bar
26 hg commit -d "1000000 0" -m commit-8 2>&1 | cleanpath
21 hg commit -d "1000000 0" -m commit-8
22 hg commit -d "1000000 0" -m commit-8-2 bar
27
23
28 hg -q revert -a --no-backup
24 hg -q revert -a --no-backup
29
25
@@ -34,22 +30,22 b" hg -v commit -d '0 0' -m commit-9 dir"
34
30
35 echo > dir.file
31 echo > dir.file
36 hg add
32 hg add
37 hg commit -d '0 0' -m commit-10 dir dir.file 2>&1 | cleanpath
33 hg commit -d '0 0' -m commit-10 dir dir.file
38
34
39 echo >> dir/file
35 echo >> dir/file
40 mkdir bleh
36 mkdir bleh
41 mkdir dir2
37 mkdir dir2
42 cd bleh
38 cd bleh
43 hg commit -d '0 0' -m commit-11 . 2>&1 | cleanpath
39 hg commit -d '0 0' -m commit-11 .
44 hg commit -d '0 0' -m commit-12 ../dir ../dir2 2>&1 | cleanpath
40 hg commit -d '0 0' -m commit-12 ../dir ../dir2
45 hg -v commit -d '0 0' -m commit-13 ../dir
41 hg -v commit -d '0 0' -m commit-13 ../dir
46 cd ..
42 cd ..
47
43
48 hg commit -d '0 0' -m commit-14 does-not-exist 2>&1 | cleanpath
44 hg commit -d '0 0' -m commit-14 does-not-exist
49 ln -s foo baz
45 ln -s foo baz
50 hg commit -d '0 0' -m commit-15 baz 2>&1 | cleanpath
46 hg commit -d '0 0' -m commit-15 baz
51 touch quux
47 touch quux
52 hg commit -d '0 0' -m commit-16 quux 2>&1 | cleanpath
48 hg commit -d '0 0' -m commit-16 quux
53 echo >> dir/file
49 echo >> dir/file
54 hg -v commit -d '0 0' -m commit-17 dir/file
50 hg -v commit -d '0 0' -m commit-17 dir/file
55 cd ..
51 cd ..
@@ -2,30 +2,24 b''
2 transaction abort!
2 transaction abort!
3 rollback completed
3 rollback completed
4 abort: empty commit message
4 abort: empty commit message
5 transaction abort!
6 rollback completed
7 abort: impossible time zone offset: 4444444
5 abort: impossible time zone offset: 4444444
8 transaction abort!
9 rollback completed
10 abort: invalid date: '1\t15.1'
6 abort: invalid date: '1\t15.1'
11 transaction abort!
12 rollback completed
13 abort: invalid date: 'foo bar'
7 abort: invalid date: 'foo bar'
8 abort: date exceeds 32 bits: 111111111111
9 % commit added file that has been deleted
14 nothing changed
10 nothing changed
15 % partial commit test
11 abort: file bar not found!
16 trouble committing bar!
17 abort: No such file or directory: .../test/bar
18 adding dir/file
12 adding dir/file
19 dir/file
13 dir/file
20 adding dir.file
14 adding dir.file
21 abort: no match under directory .../test/dir!
15 abort: no match under directory dir!
22 abort: no match under directory .../test/bleh!
16 abort: no match under directory .!
23 abort: no match under directory .../test/dir2!
17 abort: no match under directory ../dir2!
24 dir/file
18 dir/file
25 does-not-exist: No such file or directory
19 does-not-exist: No such file or directory
26 abort: file .../test/does-not-exist not found!
20 abort: file does-not-exist not found!
27 abort: file .../test/baz not tracked!
21 abort: file baz not tracked!
28 abort: file .../test/quux not tracked!
22 abort: file quux not tracked!
29 dir/file
23 dir/file
30 % partial subdir commit test
24 % partial subdir commit test
31 adding bar/bar
25 adding bar/bar
@@ -1,15 +1,16 b''
1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 merging a
2 warning: conflicts during merge.
3 warning: conflicts during merge.
3 merging a
4 merging a failed!
4 merging a failed!
5 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
5 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
6 There are unresolved merges, you can redo the full merge using:
6 There are unresolved merges, you can redo the full merge using:
7 hg update -C 2
7 hg update -C 2
8 hg merge 1
8 hg merge 1
9 e7fe8eb3e180+0d24b7662d3e+ tip
9 e7fe8eb3e180+0d24b7662d3e+ tip
10 <<<<<<< my
10 <<<<<<< local
11 something else
11 something else
12 =======
12 =======
13 something
13 something
14 >>>>>>> other
14 >>>>>>> other
15 M a
15 M a
16 ? a.orig
@@ -16,11 +16,11 b' 1 files updated, 0 files merged, 0 files'
16 (branch merge, don't forget to commit)
16 (branch merge, don't forget to commit)
17 marked working directory as branch branch3
17 marked working directory as branch branch3
18 % incremental conversion
18 % incremental conversion
19 2 c1
19 2 c2
20 pulling from branch0 into branch1
20 pulling from branch0 into branch2
21 2 changesets found
21 2 changesets found
22 1 c2
22 1 c1
23 pulling from branch0 into branch2
23 pulling from branch0 into branch1
24 2 changesets found
24 2 changesets found
25 0 c3
25 0 c3
26 pulling from branch2 into branch3
26 pulling from branch2 into branch3
@@ -260,8 +260,8 b' 1 files updated, 0 files merged, 2 files'
260 adding right-1
260 adding right-1
261 adding right-2
261 adding right-2
262 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
262 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
263 merging b
263 warning: conflicts during merge.
264 warning: conflicts during merge.
264 merging b
265 merging b failed!
265 merging b failed!
266 2 files updated, 0 files merged, 0 files removed, 1 files unresolved
266 2 files updated, 0 files merged, 0 files removed, 1 files unresolved
267 There are unresolved merges, you can redo the full merge using:
267 There are unresolved merges, you can redo the full merge using:
@@ -8,6 +8,7 b' Convert a foreign SCM repository to a Me'
8 - Darcs
8 - Darcs
9 - git
9 - git
10 - Subversion
10 - Subversion
11 - GNU Arch
11
12
12 Accepted destination formats:
13 Accepted destination formats:
13 - Mercurial
14 - Mercurial
@@ -14,11 +14,15 b' resolving manifests'
14 a: remote moved to b -> m
14 a: remote moved to b -> m
15 copying a to b
15 copying a to b
16 copying a to c
16 copying a to c
17 picked tool 'internal:merge' for a (binary False symlink False)
17 merging a and b
18 merging a and b
18 my a@fb3948d97f07+ other b@40da226db0f0 ancestor a@583c7b748052
19 my a@fb3948d97f07+ other b@40da226db0f0 ancestor a@583c7b748052
20 premerge successful
19 removing a
21 removing a
22 picked tool 'internal:merge' for a (binary False symlink False)
20 merging a and c
23 merging a and c
21 my a@fb3948d97f07+ other c@40da226db0f0 ancestor a@583c7b748052
24 my a@fb3948d97f07+ other c@40da226db0f0 ancestor a@583c7b748052
25 premerge successful
22 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
26 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
23 (branch merge, don't forget to commit)
27 (branch merge, don't forget to commit)
24 -- b --
28 -- b --
@@ -21,6 +21,7 b' options:'
21
21
22 -o --output print output to file with formatted name
22 -o --output print output to file with formatted name
23 -r --rev print the given revision
23 -r --rev print the given revision
24 --decode apply any matching decode filter
24 -I --include include names matching the given patterns
25 -I --include include names matching the given patterns
25 -X --exclude exclude names matching the given patterns
26 -X --exclude exclude names matching the given patterns
26
27
@@ -10,10 +10,14 b' resolving manifests'
10 foo: versions differ -> m
10 foo: versions differ -> m
11 foo: remote copied to bar -> m
11 foo: remote copied to bar -> m
12 copying foo to bar
12 copying foo to bar
13 picked tool 'internal:merge' for foo (binary False symlink False)
13 merging foo and bar
14 merging foo and bar
14 my foo@2092631ce82b+ other bar@7731dad1c2b9 ancestor foo@310fd17130da
15 my foo@2092631ce82b+ other bar@7731dad1c2b9 ancestor foo@310fd17130da
16 premerge successful
17 picked tool 'internal:merge' for foo (binary False symlink False)
15 merging foo
18 merging foo
16 my foo@2092631ce82b+ other foo@7731dad1c2b9 ancestor foo@310fd17130da
19 my foo@2092631ce82b+ other foo@7731dad1c2b9 ancestor foo@310fd17130da
20 premerge successful
17 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
21 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
18 (branch merge, don't forget to commit)
22 (branch merge, don't forget to commit)
19 -- foo --
23 -- foo --
@@ -32,3 +32,11 b' hg co'
32
32
33 echo %% uncompress our new working dir copy
33 echo %% uncompress our new working dir copy
34 gunzip < a.gz
34 gunzip < a.gz
35
36 echo %% check hg cat operation
37 hg cat a.gz
38 hg cat --decode a.gz | gunzip
39 mkdir subdir
40 cd subdir
41 hg -R .. cat ../a.gz
42 hg -R .. cat --decode ../a.gz | gunzip
@@ -7,3 +7,8 b' this is a test'
7 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
7 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
8 %% uncompress our new working dir copy
8 %% uncompress our new working dir copy
9 this is a test
9 this is a test
10 %% check hg cat operation
11 this is a test
12 this is a test
13 this is a test
14 this is a test
@@ -1,5 +1,5 b''
1 % pattern error
1 % pattern error
2 grep: invalid match pattern: nothing to repeat!
2 grep: invalid match pattern: nothing to repeat
3 % simple
3 % simple
4 port:4:export
4 port:4:export
5 port:4:vaportight
5 port:4:vaportight
@@ -205,6 +205,7 b' options:'
205 -w --ignore-all-space ignore white space when comparing lines
205 -w --ignore-all-space ignore white space when comparing lines
206 -b --ignore-space-change ignore changes in the amount of white space
206 -b --ignore-space-change ignore changes in the amount of white space
207 -B --ignore-blank-lines ignore changes whose lines are all blank
207 -B --ignore-blank-lines ignore changes whose lines are all blank
208 -U --unified number of lines of context to show (default: 3)
208 -I --include include names matching the given patterns
209 -I --include include names matching the given patterns
209 -X --exclude exclude names matching the given patterns
210 -X --exclude exclude names matching the given patterns
210
211
@@ -216,8 +217,10 b' aliases: st'
216 show changed files in the working directory
217 show changed files in the working directory
217
218
218 Show status of files in the repository. If names are given, only
219 Show status of files in the repository. If names are given, only
219 files that match are shown. Files that are clean or ignored, are
220 files that match are shown. Files that are clean or ignored or
220 not listed unless -c (clean), -i (ignored) or -A is given.
221 source of a copy/move operation, are not listed unless -c (clean),
222 -i (ignored), -C (copies) or -A is given. Unless options described
223 with "show only ..." are given, the options -mardu are used.
221
224
222 NOTE: status may appear to disagree with diff if permissions have
225 NOTE: status may appear to disagree with diff if permissions have
223 changed or a merge has occurred. The standard diff format does not
226 changed or a merge has occurred. The standard diff format does not
@@ -234,7 +237,7 b' show changed files in the working direct'
234 C = clean
237 C = clean
235 ! = deleted, but still tracked
238 ! = deleted, but still tracked
236 ? = not tracked
239 ? = not tracked
237 I = ignored (not shown by default)
240 I = ignored
238 = the previous added file was copied from here
241 = the previous added file was copied from here
239
242
240 options:
243 options:
1 NO CONTENT: modified file, binary diff hidden
NO CONTENT: modified file, binary diff hidden
@@ -43,8 +43,8 b' Not Found'
43
43
44
44
45 <div class="logo">
45 <div class="logo">
46 powered by<br/>
46 <a href="http://www.selenic.com/mercurial/">
47 <a href="http://www.selenic.com/mercurial/">mercurial</a>
47 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
48 </div>
48 </div>
49
49
50 </body>
50 </body>
@@ -125,6 +125,18 b' python mkmsg2.py | hg --cwd b import -'
125 hg --cwd b tip --template '{desc}\n'
125 hg --cwd b tip --template '{desc}\n'
126 rm -r b
126 rm -r b
127
127
128 # We weren't backing up the correct dirstate file when importing many patches
129 # (issue963)
130 echo '% import patch1 patch2; rollback'
131 echo line 3 >> a/a
132 hg --cwd a ci -m'third change'
133 hg --cwd a export -o '../patch%R' 1 2
134 hg clone -qr0 a b
135 hg --cwd b parents --template 'parent: #rev#\n'
136 hg --cwd b import ../patch1 ../patch2
137 hg --cwd b rollback
138 hg --cwd b parents --template 'parent: #rev#\n'
139 rm -r b
128
140
129 # bug non regression test
141 # bug non regression test
130 # importing a patch in a subdirectory failed at the commit stage
142 # importing a patch in a subdirectory failed at the commit stage
@@ -152,6 +152,12 b' email patch'
152
152
153 next line
153 next line
154 ---
154 ---
155 % import patch1 patch2; rollback
156 parent: 0
157 applying ../patch1
158 applying ../patch2
159 rolling back last transaction
160 parent: 1
155 % hg import in a subdirectory
161 % hg import in a subdirectory
156 requesting all changes
162 requesting all changes
157 adding changesets
163 adding changesets
@@ -2,7 +2,6 b' Checking encoding (ascii)...'
2 Checking extensions...
2 Checking extensions...
3 Checking templates...
3 Checking templates...
4 Checking patch...
4 Checking patch...
5 Checking merge helper...
6 Checking commit editor...
5 Checking commit editor...
7 Checking username...
6 Checking username...
8 No problems detected
7 No problems detected
@@ -1,13 +1,13 b''
1 adding he llo
1 adding he llo
2 abort: '\n' and '\r' disallowed in filenames
2 abort: '\n' and '\r' disallowed in filenames: 'he\rllo'
3 adding he llo
3 adding he llo
4 abort: '\n' and '\r' disallowed in filenames
4 abort: '\n' and '\r' disallowed in filenames: 'he\rllo'
5 adding hell
5 adding hell
6 o
6 o
7 abort: '\n' and '\r' disallowed in filenames
7 abort: '\n' and '\r' disallowed in filenames: 'hell\no'
8 adding hell
8 adding hell
9 o
9 o
10 abort: '\n' and '\r' disallowed in filenames
10 abort: '\n' and '\r' disallowed in filenames: 'hell\no'
11 f he llo he llo
11 f he llo he llo
12 f hell
12 f hell
13 o hell
13 o hell
@@ -28,8 +28,10 b' resolving manifests'
28 1a -> 1 *
28 1a -> 1 *
29 checking for directory renames
29 checking for directory renames
30 1a: local moved to 1 -> m
30 1a: local moved to 1 -> m
31 picked tool 'internal:merge' for 1a (binary False symlink False)
31 merging 1a and 1
32 merging 1a and 1
32 my 1a@ac7575e3c052+ other 1@746e9549ea96 ancestor 1@81f4b099af3d
33 my 1a@ac7575e3c052+ other 1@746e9549ea96 ancestor 1@81f4b099af3d
34 premerge successful
33 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
35 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
34 (branch merge, don't forget to commit)
36 (branch merge, don't forget to commit)
35 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
37 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -44,8 +46,10 b' resolving manifests'
44 checking for directory renames
46 checking for directory renames
45 1: remote moved to 1a -> m
47 1: remote moved to 1a -> m
46 copying 1 to 1a
48 copying 1 to 1a
49 picked tool 'internal:merge' for 1 (binary False symlink False)
47 merging 1 and 1a
50 merging 1 and 1a
48 my 1@746e9549ea96+ other 1a@ac7575e3c052 ancestor 1@81f4b099af3d
51 my 1@746e9549ea96+ other 1a@ac7575e3c052 ancestor 1@81f4b099af3d
52 premerge successful
49 removing 1
53 removing 1
50 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
54 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
51 (branch merge, don't forget to commit)
55 (branch merge, don't forget to commit)
@@ -4,6 +4,7 b' cat <<EOF >> $HGRCPATH'
4 [extensions]
4 [extensions]
5 hgext.keyword =
5 hgext.keyword =
6 hgext.mq =
6 hgext.mq =
7 hgext.notify =
7 [keyword]
8 [keyword]
8 * =
9 * =
9 b = ignore
10 b = ignore
@@ -24,19 +25,31 b' hg --quiet kwdemo --default \\'
24
25
25 hg --quiet kwdemo "Branch = {branches}"
26 hg --quiet kwdemo "Branch = {branches}"
26
27
27 hg init Test
28 hg init Test-bndl
28 cd Test
29 cd Test-bndl
29
30
30 echo % kwshrink should exit silently in empty/invalid repo
31 echo % kwshrink should exit silently in empty/invalid repo
31 hg kwshrink
32 hg kwshrink
32
33
34 # Symlinks cannot be created on Windows. The bundle was made with:
35 #
36 # hg init t
37 # cd t
38 # echo a > a
39 # ln -s a sym
40 # hg add sym
41 # hg ci -m addsym -u mercurial
42 # hg bundle --base null ../test-keyword.hg
43 #
44 hg pull -u "$TESTDIR/test-keyword.hg" \
45 | sed 's/pulling from.*test-keyword.hg/pulling from test-keyword.hg/'
46
33 echo 'expand $Id$' > a
47 echo 'expand $Id$' > a
34 echo 'do not process $Id:' >> a
48 echo 'do not process $Id:' >> a
35 echo 'xxx $' >> a
49 echo 'xxx $' >> a
36 echo 'ignore $Id$' > b
50 echo 'ignore $Id$' > b
37 ln -s a sym
38 echo % cat
51 echo % cat
39 cat sym a b
52 cat a b
40
53
41 echo % addremove
54 echo % addremove
42 hg addremove
55 hg addremove
@@ -56,7 +69,7 b' hg status'
56 echo % identify
69 echo % identify
57 hg --quiet identify
70 hg --quiet identify
58 echo % cat
71 echo % cat
59 cat sym a b
72 cat a b
60 echo % hg cat
73 echo % hg cat
61 hg cat sym a b
74 hg cat sym a b
62
75
@@ -69,6 +82,33 b" sed -e '/\\[hooks\\]/,$ d' $HGRCPATH > $HG"
69 mv $HGRCPATH.nohook $HGRCPATH
82 mv $HGRCPATH.nohook $HGRCPATH
70 rm hooktest
83 rm hooktest
71
84
85 echo % bundle
86 hg bundle --base null ../kw.hg
87
88 cd ..
89 hg init Test
90 cd Test
91
92 echo % notify on pull to check whether keywords stay as is in email
93 echo % ie. if patch.diff wrapper acts as it should
94
95 cat <<EOF >> $HGRCPATH
96 [hooks]
97 incoming.notify = python:hgext.notify.hook
98 [notify]
99 sources = pull
100 diffstat = False
101 [reposubs]
102 * = Test
103 EOF
104
105 echo % pull from bundle
106 hg pull -u ../kw.hg 2>&1 | sed -e '/^Date:/,/^diffs (/ d'
107
108 echo % remove notify config
109 sed -e '/\[hooks\]/,$ d' $HGRCPATH > $HGRCPATH.nonotify
110 mv $HGRCPATH.nonotify $HGRCPATH
111
72 echo % touch
112 echo % touch
73 touch a b
113 touch a b
74 echo % status
114 echo % status
@@ -78,7 +118,7 b' rm sym a b'
78 echo % update
118 echo % update
79 hg update
119 hg update
80 echo % cat
120 echo % cat
81 cat sym a b
121 cat a b
82
122
83 echo % check whether expansion is filewise
123 echo % check whether expansion is filewise
84 echo '$Id$' > c
124 echo '$Id$' > c
@@ -90,8 +130,12 b' hg -v kwexpand'
90 echo % compare changenodes in a c
130 echo % compare changenodes in a c
91 cat a c
131 cat a c
92
132
133 echo % qinit -c
134 hg qinit -c
93 echo % qimport
135 echo % qimport
94 hg qimport -r tip -n mqtest.diff
136 hg qimport -r tip -n mqtest.diff
137 echo % qcommit
138 hg qcommit -mqtest
95 echo % keywords should not be expanded in patch
139 echo % keywords should not be expanded in patch
96 cat .hg/patches/mqtest.diff
140 cat .hg/patches/mqtest.diff
97 echo % qpop
141 echo % qpop
@@ -123,7 +167,7 b' echo % kwfiles'
123 hg kwfiles
167 hg kwfiles
124
168
125 echo % diff --rev
169 echo % diff --rev
126 hg diff --rev 0 | grep -v 'b/c'
170 hg diff --rev 1 | grep -v 'b/c'
127
171
128 echo % rollback
172 echo % rollback
129 hg rollback
173 hg rollback
@@ -143,7 +187,7 b' Xinfo = {author}: {desc}'
143 EOF
187 EOF
144
188
145 echo % cat
189 echo % cat
146 cat sym a b
190 cat a b
147 echo % hg cat
191 echo % hg cat
148 hg cat sym a b
192 hg cat sym a b
149
193
@@ -166,7 +210,7 b' echo % status'
166 hg status
210 hg status
167
211
168 echo % cat
212 echo % cat
169 cat sym a b
213 cat a b
170 echo % hg cat
214 echo % hg cat
171 hg cat sym a b
215 hg cat sym a b
172 echo
216 echo
@@ -187,7 +231,7 b' cat a'
187
231
188 echo % clone to test incoming
232 echo % clone to test incoming
189 cd ..
233 cd ..
190 hg clone -r0 Test Test-a
234 hg clone -r1 Test Test-a
191 cd Test-a
235 cd Test-a
192 cat <<EOF >> .hg/hgrc
236 cat <<EOF >> .hg/hgrc
193 [paths]
237 [paths]
@@ -208,7 +252,7 b' cd ../Test'
208 echo % import
252 echo % import
209 hg import ../rejecttest.diff
253 hg import ../rejecttest.diff
210 echo % cat
254 echo % cat
211 cat sym a b
255 cat a b
212 echo
256 echo
213 echo % rollback
257 echo % rollback
214 hg rollback
258 hg rollback
@@ -234,20 +278,20 b' cat a'
234 cd ..
278 cd ..
235
279
236 echo % kwexpand nonexistent
280 echo % kwexpand nonexistent
237 hg kwexpand nonexistent
281 hg kwexpand nonexistent 2>&1 | sed 's/nonexistent:.*/nonexistent:/'
238
282
239 echo % switch off expansion
283 echo % switch off expansion
240 echo % kwshrink with unknown file u
284 echo % kwshrink with unknown file u
241 cp a u
285 cp a u
242 hg --verbose kwshrink
286 hg --verbose kwshrink
243 echo % cat
287 echo % cat
244 cat sym a b
288 cat a b
245 echo % hg cat
289 echo % hg cat
246 hg cat sym a b
290 hg cat sym a b
247 echo
291 echo
248 rm $HGRCPATH
292 rm $HGRCPATH
249 echo % cat
293 echo % cat
250 cat sym a b
294 cat a b
251 echo % hg cat
295 echo % hg cat
252 hg cat sym a b
296 hg cat sym a b
253 echo
297 echo
@@ -84,69 +84,95 b' demo.txt ='
84 Branch = {branches}
84 Branch = {branches}
85 $Branch: demobranch $
85 $Branch: demobranch $
86 % kwshrink should exit silently in empty/invalid repo
86 % kwshrink should exit silently in empty/invalid repo
87 pulling from test-keyword.hg
88 requesting all changes
89 adding changesets
90 adding manifests
91 adding file changes
92 added 1 changesets with 1 changes to 1 files
93 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
87 % cat
94 % cat
88 expand $Id$
95 expand $Id$
89 do not process $Id:
96 do not process $Id:
90 xxx $
97 xxx $
91 expand $Id$
92 do not process $Id:
93 xxx $
94 ignore $Id$
98 ignore $Id$
95 % addremove
99 % addremove
96 adding a
100 adding a
97 adding b
101 adding b
98 adding sym
99 % status
102 % status
100 A a
103 A a
101 A b
104 A b
102 A sym
103 % default keyword expansion including commit hook
105 % default keyword expansion including commit hook
104 % interrupted commit should not change state or run commit hook
106 % interrupted commit should not change state or run commit hook
105 a
107 a
106 b
108 b
107 sym
108 transaction abort!
109 transaction abort!
109 rollback completed
110 rollback completed
110 abort: empty commit message
111 abort: empty commit message
111 % status
112 % status
112 A a
113 A a
113 A b
114 A b
114 A sym
115 % commit
115 % commit
116 a
116 a
117 b
117 b
118 sym
119 overwriting a expanding keywords
118 overwriting a expanding keywords
120 running hook commit.test: cp a hooktest
119 running hook commit.test: cp a hooktest
121 % status
120 % status
122 ? hooktest
121 ? hooktest
123 % identify
122 % identify
124 f782df5f9602
123 ef63ca68695b
125 % cat
124 % cat
126 expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
125 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
127 do not process $Id:
128 xxx $
129 expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
130 do not process $Id:
126 do not process $Id:
131 xxx $
127 xxx $
132 ignore $Id$
128 ignore $Id$
133 % hg cat
129 % hg cat
134 expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
130 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
135 do not process $Id:
131 do not process $Id:
136 xxx $
132 xxx $
137 ignore $Id$
133 ignore $Id$
138 a
134 a
139 % diff a hooktest
135 % diff a hooktest
140 % removing commit hook from config
136 % removing commit hook from config
137 % bundle
138 2 changesets found
139 % notify on pull to check whether keywords stay as is in email
140 % ie. if patch.diff wrapper acts as it should
141 % pull from bundle
142 pulling from ../kw.hg
143 requesting all changes
144 adding changesets
145 adding manifests
146 adding file changes
147 added 2 changesets with 3 changes to 3 files
148
149 diff -r 000000000000 -r a2392c293916 sym
150 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
151 +++ b/sym Sat Feb 09 20:25:47 2008 +0100
152 @@ -0,0 +1,1 @@
153 +a
154 \ No newline at end of file
155
156 diff -r a2392c293916 -r ef63ca68695b a
157 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
158 +++ b/a Thu Jan 01 00:00:00 1970 +0000
159 @@ -0,0 +1,3 @@
160 +expand $Id$
161 +do not process $Id:
162 +xxx $
163 diff -r a2392c293916 -r ef63ca68695b b
164 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
165 +++ b/b Thu Jan 01 00:00:00 1970 +0000
166 @@ -0,0 +1,1 @@
167 +ignore $Id$
168 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
169 % remove notify config
141 % touch
170 % touch
142 % status
171 % status
143 % update
172 % update
144 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
173 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
145 % cat
174 % cat
146 expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
175 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
147 do not process $Id:
148 xxx $
149 expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
150 do not process $Id:
176 do not process $Id:
151 xxx $
177 xxx $
152 ignore $Id$
178 ignore $Id$
@@ -157,21 +183,23 b' adding c'
157 overwriting a expanding keywords
183 overwriting a expanding keywords
158 overwriting c expanding keywords
184 overwriting c expanding keywords
159 % compare changenodes in a c
185 % compare changenodes in a c
160 expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
186 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
161 do not process $Id:
187 do not process $Id:
162 xxx $
188 xxx $
163 $Id: c,v ba4426d1938e 1970/01/01 00:00:01 user $
189 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
164 tests for different changenodes
190 tests for different changenodes
191 % qinit -c
165 % qimport
192 % qimport
193 % qcommit
166 % keywords should not be expanded in patch
194 % keywords should not be expanded in patch
167 # HG changeset patch
195 # HG changeset patch
168 # User User Name <user@example.com>
196 # User User Name <user@example.com>
169 # Date 1 0
197 # Date 1 0
170 # Node ID ba4426d1938ec9673e03ab274d88c44e24618f7f
198 # Node ID 40a904bbbe4cd4ab0a1f28411e35db26341a40ad
171 # Parent f782df5f9602483b4e51c31a12315f353bba380c
199 # Parent ef63ca68695bc9495032c6fda1350c71e6d256e9
172 cndiff
200 cndiff
173
201
174 diff -r f782df5f9602 -r ba4426d1938e c
202 diff -r ef63ca68695b -r 40a904bbbe4c c
175 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
203 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
176 +++ b/c Thu Jan 01 00:00:01 1970 +0000
204 +++ b/c Thu Jan 01 00:00:01 1970 +0000
177 @@ -0,0 +1,2 @@
205 @@ -0,0 +1,2 @@
@@ -183,7 +211,7 b' Patch queue now empty'
183 applying mqtest.diff
211 applying mqtest.diff
184 Now at: mqtest.diff
212 Now at: mqtest.diff
185 % cat
213 % cat
186 $Id: c,v ba4426d1938e 1970/01/01 00:00:01 user $
214 $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
187 tests for different changenodes
215 tests for different changenodes
188 % qpop and move on
216 % qpop and move on
189 Patch queue now empty
217 Patch queue now empty
@@ -196,10 +224,10 b' c'
196 c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
224 c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
197 overwriting c expanding keywords
225 overwriting c expanding keywords
198 % cat a c
226 % cat a c
199 expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
227 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
200 do not process $Id:
228 do not process $Id:
201 xxx $
229 xxx $
202 expand $Id: c,v 0ba462c0f077 1970/01/01 00:00:01 user $
230 expand $Id: c,v e22d299ac0c2 1970/01/01 00:00:01 user $
203 do not process $Id:
231 do not process $Id:
204 xxx $
232 xxx $
205 % touch copied c after 1 second
233 % touch copied c after 1 second
@@ -208,7 +236,7 b' xxx $'
208 a
236 a
209 c
237 c
210 % diff --rev
238 % diff --rev
211 diff -r f782df5f9602 c
239 diff -r ef63ca68695b c
212 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
240 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
213 @@ -0,0 +1,3 @@
241 @@ -0,0 +1,3 @@
214 +expand $Id$
242 +expand $Id$
@@ -232,15 +260,12 b' demo.txt ='
232 Xinfo = {author}: {desc}
260 Xinfo = {author}: {desc}
233 $Xinfo: test: hg keyword config and expansion example $
261 $Xinfo: test: hg keyword config and expansion example $
234 % cat
262 % cat
235 expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
263 expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
236 do not process $Id:
237 xxx $
238 expand $Id: a,v f782df5f9602 1970/01/01 00:00:00 user $
239 do not process $Id:
264 do not process $Id:
240 xxx $
265 xxx $
241 ignore $Id$
266 ignore $Id$
242 % hg cat
267 % hg cat
243 expand $Id: a f782df5f9602 Thu, 01 Jan 1970 00:00:00 +0000 user $
268 expand $Id: a ef63ca68695b Thu, 01 Jan 1970 00:00:00 +0000 user $
244 do not process $Id:
269 do not process $Id:
245 xxx $
270 xxx $
246 ignore $Id$
271 ignore $Id$
@@ -257,17 +282,13 b' a'
257 overwriting a expanding keywords
282 overwriting a expanding keywords
258 % status
283 % status
259 % cat
284 % cat
260 expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $
285 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
261 do not process $Id:
262 xxx $
263 $Xinfo: User Name <user@example.com>: firstline $
264 expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $
265 do not process $Id:
286 do not process $Id:
266 xxx $
287 xxx $
267 $Xinfo: User Name <user@example.com>: firstline $
288 $Xinfo: User Name <user@example.com>: firstline $
268 ignore $Id$
289 ignore $Id$
269 % hg cat
290 % hg cat
270 expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $
291 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
271 do not process $Id:
292 do not process $Id:
272 xxx $
293 xxx $
273 $Xinfo: User Name <user@example.com>: firstline $
294 $Xinfo: User Name <user@example.com>: firstline $
@@ -281,7 +302,7 b' rolling back last transaction'
281 R a
302 R a
282 % revert a
303 % revert a
283 % cat a
304 % cat a
284 expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $
305 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
285 do not process $Id:
306 do not process $Id:
286 xxx $
307 xxx $
287 $Xinfo: User Name <user@example.com>: firstline $
308 $Xinfo: User Name <user@example.com>: firstline $
@@ -290,12 +311,12 b' requesting all changes'
290 adding changesets
311 adding changesets
291 adding manifests
312 adding manifests
292 adding file changes
313 adding file changes
293 added 1 changesets with 3 changes to 3 files
314 added 2 changesets with 3 changes to 3 files
294 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
315 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
295 % incoming
316 % incoming
296 comparing with test-keyword/Test
317 comparing with test-keyword/Test
297 searching for changes
318 searching for changes
298 changeset: 1:0729690beff6
319 changeset: 2:bb948857c743
299 tag: tip
320 tag: tip
300 user: User Name <user@example.com>
321 user: User Name <user@example.com>
301 date: Thu Jan 01 00:00:02 1970 +0000
322 date: Thu Jan 01 00:00:02 1970 +0000
@@ -308,11 +329,7 b' overwriting a expanding keywords'
308 % import
329 % import
309 applying ../rejecttest.diff
330 applying ../rejecttest.diff
310 % cat
331 % cat
311 expand $Id: a 82983f13f138 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
332 expand $Id: a 4e0994474d25 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
312 do not process $Id: rejecttest
313 xxx $
314 $Xinfo: User Name <user@example.com>: rejects? $
315 expand $Id: a 82983f13f138 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
316 do not process $Id: rejecttest
333 do not process $Id: rejecttest
317 xxx $
334 xxx $
318 $Xinfo: User Name <user@example.com>: rejects? $
335 $Xinfo: User Name <user@example.com>: rejects? $
@@ -332,7 +349,7 b' x/a'
332 x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e
349 x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e
333 overwriting x/a expanding keywords
350 overwriting x/a expanding keywords
334 % cat a
351 % cat a
335 expand $Id: x/a f27c134d2d9b Thu, 01 Jan 1970 00:00:03 +0000 user $
352 expand $Id: x/a cfa68229c116 Thu, 01 Jan 1970 00:00:03 +0000 user $
336 do not process $Id:
353 do not process $Id:
337 xxx $
354 xxx $
338 $Xinfo: User Name <user@example.com>: xa $
355 $Xinfo: User Name <user@example.com>: xa $
@@ -344,7 +361,7 b' do not process $Id:'
344 xxx $
361 xxx $
345 $Xinfo$
362 $Xinfo$
346 % kwexpand nonexistent
363 % kwexpand nonexistent
347 nonexistent: No such file or directory
364 nonexistent:
348 % switch off expansion
365 % switch off expansion
349 % kwshrink with unknown file u
366 % kwshrink with unknown file u
350 overwriting a shrinking keywords
367 overwriting a shrinking keywords
@@ -354,13 +371,9 b' expand $Id$'
354 do not process $Id:
371 do not process $Id:
355 xxx $
372 xxx $
356 $Xinfo$
373 $Xinfo$
357 expand $Id$
358 do not process $Id:
359 xxx $
360 $Xinfo$
361 ignore $Id$
374 ignore $Id$
362 % hg cat
375 % hg cat
363 expand $Id: a 0729690beff6 Thu, 01 Jan 1970 00:00:02 +0000 user $
376 expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
364 do not process $Id:
377 do not process $Id:
365 xxx $
378 xxx $
366 $Xinfo: User Name <user@example.com>: firstline $
379 $Xinfo: User Name <user@example.com>: firstline $
@@ -371,10 +384,6 b' expand $Id$'
371 do not process $Id:
384 do not process $Id:
372 xxx $
385 xxx $
373 $Xinfo$
386 $Xinfo$
374 expand $Id$
375 do not process $Id:
376 xxx $
377 $Xinfo$
378 ignore $Id$
387 ignore $Id$
379 % hg cat
388 % hg cat
380 expand $Id$
389 expand $Id$
@@ -25,8 +25,10 b' resolving manifests'
25 ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 7d3b554bfdf1
25 ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 7d3b554bfdf1
26 searching for copies back to rev 1
26 searching for copies back to rev 1
27 bar: versions differ -> m
27 bar: versions differ -> m
28 picked tool 'internal:merge' for bar (binary False symlink False)
28 merging bar
29 merging bar
29 my bar@2d2f9a22c82b+ other bar@7d3b554bfdf1 ancestor bar@0a3ab4856510
30 my bar@2d2f9a22c82b+ other bar@7d3b554bfdf1 ancestor bar@0a3ab4856510
31 premerge successful
30 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
32 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
31 (branch merge, don't forget to commit)
33 (branch merge, don't forget to commit)
32 % contents of bar should be line1 line2
34 % contents of bar should be line1 line2
@@ -71,8 +73,10 b' resolving manifests'
71 ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 96ab80c60897
73 ancestor 0a3ab4856510 local 2d2f9a22c82b+ remote 96ab80c60897
72 searching for copies back to rev 1
74 searching for copies back to rev 1
73 bar: versions differ -> m
75 bar: versions differ -> m
76 picked tool 'internal:merge' for bar (binary False symlink False)
74 merging bar
77 merging bar
75 my bar@2d2f9a22c82b+ other bar@96ab80c60897 ancestor bar@0a3ab4856510
78 my bar@2d2f9a22c82b+ other bar@96ab80c60897 ancestor bar@0a3ab4856510
79 premerge successful
76 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
80 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
77 (branch merge, don't forget to commit)
81 (branch merge, don't forget to commit)
78 % contents of bar should be line1 line2
82 % contents of bar should be line1 line2
@@ -18,27 +18,28 b' M zzz1_merge_ok'
18 M zzz2_merge_bad
18 M zzz2_merge_bad
19 # local merge with bad merge tool
19 # local merge with bad merge tool
20 merging zzz1_merge_ok
20 merging zzz1_merge_ok
21 merging zzz1_merge_ok failed!
22 merging zzz2_merge_bad
21 merging zzz2_merge_bad
23 merging zzz2_merge_bad failed!
22 merging zzz2_merge_bad failed!
24 3 files updated, 0 files merged, 2 files removed, 2 files unresolved
23 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
25 There are unresolved merges with locally modified files.
24 There are unresolved merges with locally modified files.
26 You can redo the full merge using:
25 You can finish the partial merge using:
27 hg update 0
26 hg update 0
28 hg update 1
27 hg update 1
29 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
28 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
30 --- a/zzz1_merge_ok
29 --- a/zzz1_merge_ok
31 +++ b/zzz1_merge_ok
30 +++ b/zzz1_merge_ok
31 +new first line
32 +new last line
32 +new last line
33 --- a/zzz2_merge_bad
33 --- a/zzz2_merge_bad
34 +++ b/zzz2_merge_bad
34 +++ b/zzz2_merge_bad
35 +another last line
35 +another last line
36 M zzz1_merge_ok
36 M zzz1_merge_ok
37 M zzz2_merge_bad
37 M zzz2_merge_bad
38 ? zzz2_merge_bad.orig
38 # local merge with conflicts
39 # local merge with conflicts
39 warning: conflicts during merge.
40 merging zzz1_merge_ok
40 merging zzz1_merge_ok
41 merging zzz2_merge_bad
41 merging zzz2_merge_bad
42 warning: conflicts during merge.
42 merging zzz2_merge_bad failed!
43 merging zzz2_merge_bad failed!
43 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
44 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
44 There are unresolved merges with locally modified files.
45 There are unresolved merges with locally modified files.
@@ -57,6 +58,7 b' 2 files updated, 0 files merged, 3 files'
57 +new last line
58 +new last line
58 M zzz1_merge_ok
59 M zzz1_merge_ok
59 M zzz2_merge_bad
60 M zzz2_merge_bad
61 ? zzz2_merge_bad.orig
60 # local merge without conflicts
62 # local merge without conflicts
61 merging zzz1_merge_ok
63 merging zzz1_merge_ok
62 4 files updated, 1 files merged, 2 files removed, 0 files unresolved
64 4 files updated, 1 files merged, 2 files removed, 0 files unresolved
@@ -9,8 +9,8 b' 9eca13a34789'
9 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
9 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
10 f248da0d4c3e tip
10 f248da0d4c3e tip
11 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
11 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
12 merging file1
12 warning: conflicts during merge.
13 warning: conflicts during merge.
13 merging file1
14 merging file1 failed!
14 merging file1 failed!
15 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
15 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
16 There are unresolved merges with locally modified files.
16 There are unresolved merges with locally modified files.
@@ -23,15 +23,19 b' diff -r f248da0d4c3e file1'
23 @@ -1,3 +1,7 @@
23 @@ -1,3 +1,7 @@
24 added file1
24 added file1
25 another line of text
25 another line of text
26 +<<<<<<< my
26 +<<<<<<< local
27 +changed file1 different
27 +changed file1 different
28 +=======
28 +=======
29 changed file1
29 changed file1
30 +>>>>>>> other
30 +>>>>>>> other
31 M file1
31 M file1
32 ? file1.orig
32 f248da0d4c3e+ tip
33 f248da0d4c3e+ tip
33 reverting file1
34 reverting file1
35 ? file1.orig
34 f248da0d4c3e tip
36 f248da0d4c3e tip
37 ? file1.orig
35 f248da0d4c3e tip
38 f248da0d4c3e tip
36 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
39 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
40 ? file1.orig
37 f248da0d4c3e tip
41 f248da0d4c3e tip
@@ -6,8 +6,8 b' adding manifests'
6 adding file changes
6 adding file changes
7 added 1 changesets with 1 changes to 1 files (+1 heads)
7 added 1 changesets with 1 changes to 1 files (+1 heads)
8 (run 'hg heads' to see heads, 'hg merge' to merge)
8 (run 'hg heads' to see heads, 'hg merge' to merge)
9 merging test.txt
9 warning: conflicts during merge.
10 warning: conflicts during merge.
10 merging test.txt
11 merging test.txt failed!
11 merging test.txt failed!
12 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
12 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
13 There are unresolved merges, you can redo the full merge using:
13 There are unresolved merges, you can redo the full merge using:
@@ -20,21 +20,22 b' adding manifests'
20 adding file changes
20 adding file changes
21 added 1 changesets with 1 changes to 1 files (+1 heads)
21 added 1 changesets with 1 changes to 1 files (+1 heads)
22 (run 'hg heads' to see heads, 'hg merge' to merge)
22 (run 'hg heads' to see heads, 'hg merge' to merge)
23 warning: conflicts during merge.
24 resolving manifests
23 resolving manifests
25 overwrite None partial False
24 overwrite None partial False
26 ancestor faaea63e63a9 local 451c744aabcc+ remote a070d41e8360
25 ancestor faaea63e63a9 local 451c744aabcc+ remote a070d41e8360
27 searching for copies back to rev 1
26 searching for copies back to rev 1
28 test.txt: versions differ -> m
27 test.txt: versions differ -> m
28 picked tool 'internal:merge' for test.txt (binary False symlink False)
29 merging test.txt
29 merging test.txt
30 my test.txt@451c744aabcc+ other test.txt@a070d41e8360 ancestor test.txt@faaea63e63a9
30 my test.txt@451c744aabcc+ other test.txt@a070d41e8360 ancestor test.txt@faaea63e63a9
31 warning: conflicts during merge.
31 merging test.txt failed!
32 merging test.txt failed!
32 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
33 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
33 There are unresolved merges, you can redo the full merge using:
34 There are unresolved merges, you can redo the full merge using:
34 hg update -C 3
35 hg update -C 3
35 hg merge 4
36 hg merge 4
36 one
37 one
37 <<<<<<< my
38 <<<<<<< local
38 two-point-five
39 two-point-five
39 =======
40 =======
40 two-point-one
41 two-point-one
@@ -5,8 +5,7 b' adding quux2'
5 merging bar
5 merging bar
6 merging bar failed!
6 merging bar failed!
7 merging foo and baz
7 merging foo and baz
8 merging baz failed!
8 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
9 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
10 There are unresolved merges, you can redo the full merge using:
9 There are unresolved merges, you can redo the full merge using:
11 hg update -C 2
10 hg update -C 2
12 hg merge 1
11 hg merge 1
@@ -14,8 +13,7 b' 3 files updated, 0 files merged, 1 files'
14 merging bar
13 merging bar
15 merging bar failed!
14 merging bar failed!
16 merging baz and foo
15 merging baz and foo
17 merging baz failed!
16 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
18 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
19 There are unresolved merges, you can redo the full merge using:
17 There are unresolved merges, you can redo the full merge using:
20 hg update -C 1
18 hg update -C 1
21 hg merge 2
19 hg merge 2
@@ -42,6 +42,12 b' echo % qinit -c'
42 hg --cwd c qinit -c
42 hg --cwd c qinit -c
43 hg -R c/.hg/patches st
43 hg -R c/.hg/patches st
44
44
45 echo % qnew should refuse bad patch names
46 hg -R c qnew series
47 hg -R c qnew status
48 hg -R c qnew guards
49 hg -R c qnew .hgignore
50
45 echo % qnew implies add
51 echo % qnew implies add
46
52
47 hg -R c qnew test.patch
53 hg -R c qnew test.patch
@@ -297,6 +303,13 b' hg st'
297 echo % mq tags
303 echo % mq tags
298 hg log --template '{rev} {tags}\n' -r qparent:qtip
304 hg log --template '{rev} {tags}\n' -r qparent:qtip
299
305
306 echo % bad node in status
307 hg qpop
308 hg strip -qn tip
309 hg tip 2>&1 | sed -e 's/unknown node .*/unknown node/'
310 hg branches 2>&1 | sed -e 's/unknown node .*/unknown node/'
311 hg qpop
312
300 cat >>$HGRCPATH <<EOF
313 cat >>$HGRCPATH <<EOF
301 [diff]
314 [diff]
302 git = True
315 git = True
@@ -59,12 +59,19 b' adding b/z'
59 % qinit -c
59 % qinit -c
60 A .hgignore
60 A .hgignore
61 A series
61 A series
62 % qnew should refuse bad patch names
63 abort: "series" cannot be used as the name of a patch
64 abort: "status" cannot be used as the name of a patch
65 abort: "guards" cannot be used as the name of a patch
66 abort: ".hgignore" cannot be used as the name of a patch
62 % qnew implies add
67 % qnew implies add
63 A .hgignore
68 A .hgignore
64 A series
69 A series
65 A test.patch
70 A test.patch
66 % qinit; qinit -c
71 % qinit; qinit -c
67 .hgignore:
72 .hgignore:
73 ^\.hg
74 ^\.mq
68 syntax: glob
75 syntax: glob
69 status
76 status
70 guards
77 guards
@@ -281,6 +288,18 b' Errors during apply, please fix and refr'
281 0 qparent
288 0 qparent
282 1 qbase foo
289 1 qbase foo
283 2 qtip bar tip
290 2 qtip bar tip
291 % bad node in status
292 Now at: foo
293 changeset: 0:cb9a9f314b8b
294 mq status file refers to unknown node
295 tag: tip
296 user: test
297 date: Thu Jan 01 00:00:00 1970 +0000
298 summary: a
299
300 mq status file refers to unknown node
301 default 0:cb9a9f314b8b
302 abort: working directory revision is not qtip
284 new file
303 new file
285
304
286 diff --git a/new b/new
305 diff --git a/new b/new
@@ -41,6 +41,15 b' echo corrupted > .hg/branch.cache'
41 hg log -qr foo
41 hg log -qr foo
42 cat .hg/branch.cache
42 cat .hg/branch.cache
43
43
44 echo % push should update the branch cache
45 hg init ../target
46 echo % pushing just rev 0
47 hg push -qr 0 ../target
48 cat ../target/.hg/branch.cache
49 echo % pushing everything
50 hg push -qf ../target
51 cat ../target/.hg/branch.cache
52
44 echo % update with no arguments: tipmost revision of the current branch
53 echo % update with no arguments: tipmost revision of the current branch
45 hg up -q -C 0
54 hg up -q -C 0
46 hg up -q
55 hg up -q
@@ -63,7 +63,7 b' user: test'
63 date: Mon Jan 12 13:46:40 1970 +0000
63 date: Mon Jan 12 13:46:40 1970 +0000
64 summary: modify a branch
64 summary: modify a branch
65
65
66 Invalid branch cache: unknown tip
66 invalidating branch cache (tip differs)
67 changeset: 4:4909a3732169c0c20011c4f4b8fdff4e3d89b23f
67 changeset: 4:4909a3732169c0c20011c4f4b8fdff4e3d89b23f
68 branch: foo
68 branch: foo
69 tag: tip
69 tag: tip
@@ -83,6 +83,15 b' 4909a3732169c0c20011c4f4b8fdff4e3d89b23f'
83 bf1bc2f45e834c75404d0ddab57d53beab56e2f8 default
83 bf1bc2f45e834c75404d0ddab57d53beab56e2f8 default
84 4909a3732169c0c20011c4f4b8fdff4e3d89b23f foo
84 4909a3732169c0c20011c4f4b8fdff4e3d89b23f foo
85 67ec16bde7f1575d523313b9bca000f6a6f12dca bar
85 67ec16bde7f1575d523313b9bca000f6a6f12dca bar
86 % push should update the branch cache
87 % pushing just rev 0
88 be8523e69bf892e25817fc97187516b3c0804ae4 0
89 be8523e69bf892e25817fc97187516b3c0804ae4 default
90 % pushing everything
91 4909a3732169c0c20011c4f4b8fdff4e3d89b23f 4
92 bf1bc2f45e834c75404d0ddab57d53beab56e2f8 default
93 4909a3732169c0c20011c4f4b8fdff4e3d89b23f foo
94 67ec16bde7f1575d523313b9bca000f6a6f12dca bar
86 % update with no arguments: tipmost revision of the current branch
95 % update with no arguments: tipmost revision of the current branch
87 bf1bc2f45e83
96 bf1bc2f45e83
88 4909a3732169 (foo) tip
97 4909a3732169 (foo) tip
@@ -3,14 +3,8 b' changeset 3:107ce1ee2b43 backs out chang'
3 merging with changeset 2:e6c3abc120e7
3 merging with changeset 2:e6c3abc120e7
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
5 (branch merge, don't forget to commit)
5 (branch merge, don't forget to commit)
6 transaction abort!
7 rollback completed
8 abort: invalid date: 'should fail'
6 abort: invalid date: 'should fail'
9 transaction abort!
10 rollback completed
11 abort: date exceeds 32 bits: 100000000000000000
7 abort: date exceeds 32 bits: 100000000000000000
12 transaction abort!
13 rollback completed
14 abort: impossible time zone offset: 1400000
8 abort: impossible time zone offset: 1400000
15 Sun Jan 15 13:30:00 2006 +0500
9 Sun Jan 15 13:30:00 2006 +0500
16 Sun Jan 15 13:30:00 2006 -0800
10 Sun Jan 15 13:30:00 2006 -0800
@@ -33,7 +33,7 b' pushing to ../c'
33 searching for changes
33 searching for changes
34 abort: push creates new remote branches!
34 abort: push creates new remote branches!
35 (did you forget to merge? use push -f to force)
35 (did you forget to merge? use push -f to force)
36 0
36 1
37 pushing to ../c
37 pushing to ../c
38 searching for changes
38 searching for changes
39 no changes found
39 no changes found
@@ -42,12 +42,12 b' pushing to ../c'
42 searching for changes
42 searching for changes
43 abort: push creates new remote branches!
43 abort: push creates new remote branches!
44 (did you forget to merge? use push -f to force)
44 (did you forget to merge? use push -f to force)
45 0
45 1
46 pushing to ../c
46 pushing to ../c
47 searching for changes
47 searching for changes
48 abort: push creates new remote branches!
48 abort: push creates new remote branches!
49 (did you forget to merge? use push -f to force)
49 (did you forget to merge? use push -f to force)
50 0
50 1
51 pushing to ../c
51 pushing to ../c
52 searching for changes
52 searching for changes
53 adding changesets
53 adding changesets
@@ -19,8 +19,10 b' resolving manifests'
19 a: remote moved to b -> m
19 a: remote moved to b -> m
20 b2: remote created -> g
20 b2: remote created -> g
21 copying a to b
21 copying a to b
22 picked tool 'internal:merge' for a (binary False symlink False)
22 merging a and b
23 merging a and b
23 my a@f26ec4fc3fa3+ other b@8e765a822af2 ancestor a@af1939970a1c
24 my a@f26ec4fc3fa3+ other b@8e765a822af2 ancestor a@af1939970a1c
25 premerge successful
24 removing a
26 removing a
25 warning: detected divergent renames of a2 to:
27 warning: detected divergent renames of a2 to:
26 c2
28 c2
@@ -13,8 +13,11 b' resolving manifests'
13 rev: versions differ -> m
13 rev: versions differ -> m
14 a: remote copied to b -> m
14 a: remote copied to b -> m
15 copying a to b
15 copying a to b
16 picked tool 'python ../merge' for a (binary False symlink False)
16 merging a and b
17 merging a and b
17 my a@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
18 my a@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
19 premerge successful
20 picked tool 'python ../merge' for rev (binary False symlink False)
18 merging rev
21 merging rev
19 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
22 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
20 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
23 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -41,8 +44,11 b' resolving manifests'
41 b: local copied to a -> m
44 b: local copied to a -> m
42 rev: versions differ -> m
45 rev: versions differ -> m
43 getting a
46 getting a
47 picked tool 'python ../merge' for b (binary False symlink False)
44 merging b and a
48 merging b and a
45 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
49 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
50 premerge successful
51 picked tool 'python ../merge' for rev (binary False symlink False)
46 merging rev
52 merging rev
47 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
53 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
48 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
54 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -68,9 +74,12 b' resolving manifests'
68 rev: versions differ -> m
74 rev: versions differ -> m
69 a: remote moved to b -> m
75 a: remote moved to b -> m
70 copying a to b
76 copying a to b
77 picked tool 'python ../merge' for a (binary False symlink False)
71 merging a and b
78 merging a and b
72 my a@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
79 my a@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
80 premerge successful
73 removing a
81 removing a
82 picked tool 'python ../merge' for rev (binary False symlink False)
74 merging rev
83 merging rev
75 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
84 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
76 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
85 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -94,8 +103,11 b' resolving manifests'
94 checking for directory renames
103 checking for directory renames
95 b: local moved to a -> m
104 b: local moved to a -> m
96 rev: versions differ -> m
105 rev: versions differ -> m
106 picked tool 'python ../merge' for b (binary False symlink False)
97 merging b and a
107 merging b and a
98 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
108 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
109 premerge successful
110 picked tool 'python ../merge' for rev (binary False symlink False)
99 merging rev
111 merging rev
100 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
112 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
101 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
113 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -120,6 +132,7 b' resolving manifests'
120 rev: versions differ -> m
132 rev: versions differ -> m
121 b: remote created -> g
133 b: remote created -> g
122 getting b
134 getting b
135 picked tool 'python ../merge' for rev (binary False symlink False)
123 merging rev
136 merging rev
124 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
137 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
125 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
138 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -142,6 +155,7 b' resolving manifests'
142 b -> a
155 b -> a
143 checking for directory renames
156 checking for directory renames
144 rev: versions differ -> m
157 rev: versions differ -> m
158 picked tool 'python ../merge' for rev (binary False symlink False)
145 merging rev
159 merging rev
146 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
160 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
147 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
161 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -168,6 +182,7 b' resolving manifests'
168 b: remote created -> g
182 b: remote created -> g
169 removing a
183 removing a
170 getting b
184 getting b
185 picked tool 'python ../merge' for rev (binary False symlink False)
171 merging rev
186 merging rev
172 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
187 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
173 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
188 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
@@ -189,6 +204,7 b' resolving manifests'
189 b -> a
204 b -> a
190 checking for directory renames
205 checking for directory renames
191 rev: versions differ -> m
206 rev: versions differ -> m
207 picked tool 'python ../merge' for rev (binary False symlink False)
192 merging rev
208 merging rev
193 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
209 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
194 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
210 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -206,8 +222,10 b' resolving manifests'
206 searching for copies back to rev 1
222 searching for copies back to rev 1
207 b: versions differ -> m
223 b: versions differ -> m
208 rev: versions differ -> m
224 rev: versions differ -> m
225 picked tool 'python ../merge' for b (binary False symlink False)
209 merging b
226 merging b
210 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
227 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
228 picked tool 'python ../merge' for rev (binary False symlink False)
211 merging rev
229 merging rev
212 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
230 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
213 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
231 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -238,6 +256,7 b' warning: detected divergent renames of a'
238 b
256 b
239 c
257 c
240 getting c
258 getting c
259 picked tool 'python ../merge' for rev (binary False symlink False)
241 merging rev
260 merging rev
242 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
261 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
243 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
262 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -256,8 +275,10 b' resolving manifests'
256 searching for copies back to rev 1
275 searching for copies back to rev 1
257 b: versions differ -> m
276 b: versions differ -> m
258 rev: versions differ -> m
277 rev: versions differ -> m
278 picked tool 'python ../merge' for b (binary False symlink False)
259 merging b
279 merging b
260 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
280 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
281 picked tool 'python ../merge' for rev (binary False symlink False)
261 merging rev
282 merging rev
262 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
283 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
263 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
284 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -278,8 +299,10 b' resolving manifests'
278 b: versions differ -> m
299 b: versions differ -> m
279 rev: versions differ -> m
300 rev: versions differ -> m
280 removing a
301 removing a
302 picked tool 'python ../merge' for b (binary False symlink False)
281 merging b
303 merging b
282 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
304 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
305 picked tool 'python ../merge' for rev (binary False symlink False)
283 merging rev
306 merging rev
284 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
307 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
285 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
308 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
@@ -299,8 +322,10 b' resolving manifests'
299 b: versions differ -> m
322 b: versions differ -> m
300 rev: versions differ -> m
323 rev: versions differ -> m
301 getting a
324 getting a
325 picked tool 'python ../merge' for b (binary False symlink False)
302 merging b
326 merging b
303 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
327 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
328 picked tool 'python ../merge' for rev (binary False symlink False)
304 merging rev
329 merging rev
305 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
330 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
306 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
331 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -321,8 +346,10 b' resolving manifests'
321 b: versions differ -> m
346 b: versions differ -> m
322 rev: versions differ -> m
347 rev: versions differ -> m
323 removing a
348 removing a
349 picked tool 'python ../merge' for b (binary False symlink False)
324 merging b
350 merging b
325 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
351 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
352 picked tool 'python ../merge' for rev (binary False symlink False)
326 merging rev
353 merging rev
327 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
354 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
328 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
355 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
@@ -342,8 +369,10 b' resolving manifests'
342 b: versions differ -> m
369 b: versions differ -> m
343 rev: versions differ -> m
370 rev: versions differ -> m
344 getting a
371 getting a
372 picked tool 'python ../merge' for b (binary False symlink False)
345 merging b
373 merging b
346 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
374 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
375 picked tool 'python ../merge' for rev (binary False symlink False)
347 merging rev
376 merging rev
348 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
377 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
349 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
378 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -362,8 +391,10 b' resolving manifests'
362 searching for copies back to rev 1
391 searching for copies back to rev 1
363 b: versions differ -> m
392 b: versions differ -> m
364 rev: versions differ -> m
393 rev: versions differ -> m
394 picked tool 'python ../merge' for b (binary False symlink False)
365 merging b
395 merging b
366 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
396 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
397 picked tool 'python ../merge' for rev (binary False symlink False)
367 merging rev
398 merging rev
368 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
399 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
369 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
400 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -384,8 +415,10 b' resolving manifests'
384 rev: versions differ -> m
415 rev: versions differ -> m
385 a: prompt recreating -> g
416 a: prompt recreating -> g
386 getting a
417 getting a
418 picked tool 'python ../merge' for b (binary False symlink False)
387 merging b
419 merging b
388 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
420 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
421 picked tool 'python ../merge' for rev (binary False symlink False)
389 merging rev
422 merging rev
390 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
423 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
391 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
424 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -404,8 +437,10 b' resolving manifests'
404 searching for copies back to rev 1
437 searching for copies back to rev 1
405 b: versions differ -> m
438 b: versions differ -> m
406 rev: versions differ -> m
439 rev: versions differ -> m
440 picked tool 'python ../merge' for b (binary False symlink False)
407 merging b
441 merging b
408 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
442 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
443 picked tool 'python ../merge' for rev (binary False symlink False)
409 merging rev
444 merging rev
410 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
445 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
411 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
446 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -430,9 +465,11 b' resolving manifests'
430 rev: versions differ -> m
465 rev: versions differ -> m
431 a: remote moved to b -> m
466 a: remote moved to b -> m
432 copying a to b
467 copying a to b
468 picked tool 'python ../merge' for a (binary False symlink False)
433 merging a and b
469 merging a and b
434 my a@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
470 my a@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
435 removing a
471 removing a
472 picked tool 'python ../merge' for rev (binary False symlink False)
436 merging rev
473 merging rev
437 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
474 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
438 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
475 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -456,8 +493,10 b' resolving manifests'
456 checking for directory renames
493 checking for directory renames
457 b: local moved to a -> m
494 b: local moved to a -> m
458 rev: versions differ -> m
495 rev: versions differ -> m
496 picked tool 'python ../merge' for b (binary False symlink False)
459 merging b and a
497 merging b and a
460 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
498 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
499 picked tool 'python ../merge' for rev (binary False symlink False)
461 merging rev
500 merging rev
462 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
501 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
463 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
502 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -484,9 +523,12 b' resolving manifests'
484 b: local moved to a -> m
523 b: local moved to a -> m
485 rev: versions differ -> m
524 rev: versions differ -> m
486 c: remote created -> g
525 c: remote created -> g
526 picked tool 'python ../merge' for b (binary False symlink False)
487 merging b and a
527 merging b and a
488 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
528 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
529 premerge successful
489 getting c
530 getting c
531 picked tool 'python ../merge' for rev (binary False symlink False)
490 merging rev
532 merging rev
491 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
533 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
492 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
534 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -1,6 +1,7 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 hg init
3 hg init repo
4 cd repo
4 echo 123 > a
5 echo 123 > a
5 echo 123 > c
6 echo 123 > c
6 echo 123 > e
7 echo 123 > e
@@ -27,7 +28,16 b' hg status'
27 hg revert --no-backup c
28 hg revert --no-backup c
28 echo %% should show unknown: b
29 echo %% should show unknown: b
29 hg status
30 hg status
30 echo %% should show a b c e
31 hg add b
32 echo %% should show b added
33 hg status b
34 rm b
35 echo %% should show b deleted
36 hg status b
37 hg revert -v b
38 echo %% should not find b
39 hg status b
40 echo %% should show a c e
31 ls
41 ls
32 echo %% should verbosely save backup to e.orig
42 echo %% should verbosely save backup to e.orig
33 echo z > e
43 echo z > e
@@ -40,19 +50,26 b' hg revert q'
40 rm q
50 rm q
41 echo %% should say file not found
51 echo %% should say file not found
42 hg revert notfound
52 hg revert notfound
53 touch d
54 hg add d
43 hg rm a
55 hg rm a
44 hg commit -m "second" -d "1000000 0"
56 hg commit -m "second" -d "1000000 0"
45 echo z > z
57 echo z > z
46 hg add z
58 hg add z
47 hg st
59 hg st
48 echo %% should add a, forget z
60 echo %% should add a, remove d, forget z
49 hg revert --all -r0
61 hg revert --all -r0
50 echo %% should forget a
62 echo %% should forget a, undelete d
51 hg revert --all -rtip
63 hg revert --all -rtip
52 rm a *.orig
64 rm a *.orig
53 echo %% should silently add a
65 echo %% should silently add a
54 hg revert -r0 a
66 hg revert -r0 a
55 hg st a
67 hg st a
68 hg rm d
69 hg st d
70 echo %% should silently keep d removed
71 hg revert -r0 d
72 hg st d
56
73
57 hg update -C
74 hg update -C
58 chmod +x c
75 chmod +x c
@@ -68,6 +85,8 b' hg revert --all'
68 echo %% should print executable
85 echo %% should print executable
69 test -x c && echo executable
86 test -x c && echo executable
70
87
88 cd ..
89
71 echo %% issue 241
90 echo %% issue 241
72 hg init a
91 hg init a
73 cd a
92 cd a
@@ -100,3 +119,33 b' hg mv a newa'
100 hg revert newa
119 hg revert newa
101 hg st a newa
120 hg st a newa
102
121
122 cd ..
123
124 hg init ignored
125 cd ignored
126 echo '^ignored$' > .hgignore
127 echo '^ignoreddir$' >> .hgignore
128 echo '^removed$' >> .hgignore
129
130 mkdir ignoreddir
131 touch ignoreddir/file
132 touch ignoreddir/removed
133 touch ignored
134 touch removed
135 echo '%% 4 ignored files (we will add/commit everything)'
136 hg st -A -X .hgignore
137 hg ci -qAm 'add files' ignored ignoreddir/file ignoreddir/removed removed
138
139 echo >> ignored
140 echo >> ignoreddir/file
141 hg rm removed ignoreddir/removed
142 echo '%% should revert ignored* and undelete *removed'
143 hg revert -a --no-backup
144 hg st -mardi
145
146 hg up -qC
147 echo >> ignored
148 hg rm removed
149 echo %% should silently revert the named files
150 hg revert --no-backup ignored removed
151 hg st -mardi
@@ -18,16 +18,20 b' M c'
18 ? b
18 ? b
19 %% should show unknown: b
19 %% should show unknown: b
20 ? b
20 ? b
21 %% should show a b c e
21 %% should show b added
22 A b
23 %% should show b deleted
24 ! b
25 forgetting b
26 %% should not find b
27 b: No such file or directory
28 %% should show a c e
22 a
29 a
23 b
24 c
30 c
25 e
31 e
26 %% should verbosely save backup to e.orig
32 %% should verbosely save backup to e.orig
27 saving current version of e as e.orig
33 saving current version of e as e.orig
28 reverting e
34 reverting e
29 resolving manifests
30 getting e
31 %% should say no changes needed
35 %% should say no changes needed
32 no changes needed to a
36 no changes needed to a
33 %% should say file not managed
37 %% should say file not managed
@@ -35,16 +39,20 b' file not managed: q'
35 %% should say file not found
39 %% should say file not found
36 notfound: No such file in rev 095eacd0c0d7
40 notfound: No such file in rev 095eacd0c0d7
37 A z
41 A z
38 ? b
39 ? e.orig
42 ? e.orig
40 %% should add a, forget z
43 %% should add a, remove d, forget z
41 adding a
44 adding a
45 removing d
42 forgetting z
46 forgetting z
43 %% should forget a
47 %% should forget a, undelete d
44 forgetting a
48 forgetting a
49 undeleting d
45 %% should silently add a
50 %% should silently add a
46 A a
51 A a
47 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
52 R d
53 %% should silently keep d removed
54 R d
55 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
48 reverting c
56 reverting c
49 %% should print non-executable
57 %% should print non-executable
50 non-executable
58 non-executable
@@ -65,3 +73,14 b' forgetting newdir/newfile'
65 reverting b/b
73 reverting b/b
66 % reverting a rename target should revert the source
74 % reverting a rename target should revert the source
67 ? newa
75 ? newa
76 %% 4 ignored files (we will add/commit everything)
77 I ignored
78 I ignoreddir/file
79 I ignoreddir/removed
80 I removed
81 %% should revert ignored* and undelete *removed
82 reverting ignored
83 reverting ignoreddir/file
84 undeleting ignoreddir/removed
85 undeleting removed
86 %% should silently revert the named files
@@ -14,8 +14,15 b' hg verify'
14 hg parents
14 hg parents
15 hg status
15 hg status
16
16
17 # Test issue 902
17 echo % Test issue 902
18 hg commit -m "test"
18 hg commit -m "test"
19 hg branch test
19 hg branch test
20 hg rollback
20 hg rollback
21 hg branch
21 hg branch
22
23 echo % Test rollback of hg before issue 902 was fixed
24 hg commit -m "test"
25 hg branch test
26 rm .hg/undo.branch
27 hg rollback
28 hg branch
@@ -16,6 +16,12 b' crosschecking files in changesets and ma'
16 checking files
16 checking files
17 0 files, 0 changesets, 0 total revisions
17 0 files, 0 changesets, 0 total revisions
18 A a
18 A a
19 % Test issue 902
19 marked working directory as branch test
20 marked working directory as branch test
20 rolling back last transaction
21 rolling back last transaction
21 default
22 default
23 % Test rollback of hg before issue 902 was fixed
24 marked working directory as branch test
25 rolling back last transaction
26 Named branch could not be reset, current branch still is: test
27 test
@@ -16,24 +16,28 b' fi'
16 echo % With -v
16 echo % With -v
17 hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -v | sed -e 's,:[0-9][0-9]*/,/,'
17 hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -v | sed -e 's,:[0-9][0-9]*/,/,'
18 cat hg.pid >> "$DAEMON_PIDS"
18 cat hg.pid >> "$DAEMON_PIDS"
19 sleep 1
19 kill `cat hg.pid`
20 kill `cat hg.pid`
20 sleep 1
21 sleep 1
21
22
22 echo % With --prefix foo
23 echo % With --prefix foo
23 hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -v --prefix foo | sed -e 's,:[0-9][0-9]*/,/,'
24 hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -v --prefix foo | sed -e 's,:[0-9][0-9]*/,/,'
24 cat hg.pid >> "$DAEMON_PIDS"
25 cat hg.pid >> "$DAEMON_PIDS"
26 sleep 1
25 kill `cat hg.pid`
27 kill `cat hg.pid`
26 sleep 1
28 sleep 1
27
29
28 echo % With --prefix /foo
30 echo % With --prefix /foo
29 hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -v --prefix /foo | sed -e 's,:[0-9][0-9]*/,/,'
31 hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -v --prefix /foo | sed -e 's,:[0-9][0-9]*/,/,'
30 cat hg.pid >> "$DAEMON_PIDS"
32 cat hg.pid >> "$DAEMON_PIDS"
33 sleep 1
31 kill `cat hg.pid`
34 kill `cat hg.pid`
32 sleep 1
35 sleep 1
33
36
34 echo % With --prefix foo/
37 echo % With --prefix foo/
35 hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -v --prefix foo/ | sed -e 's,:[0-9][0-9]*/,/,'
38 hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -v --prefix foo/ | sed -e 's,:[0-9][0-9]*/,/,'
36 cat hg.pid >> "$DAEMON_PIDS"
39 cat hg.pid >> "$DAEMON_PIDS"
40 sleep 1
37 kill `cat hg.pid`
41 kill `cat hg.pid`
38 sleep 1
42 sleep 1
39
43
@@ -2,15 +2,11 b''
2 access log created - .hg/hgrc respected
2 access log created - .hg/hgrc respected
3 % With -v
3 % With -v
4 listening at http://localhost/
4 listening at http://localhost/
5 killed!
6 % With --prefix foo
5 % With --prefix foo
7 listening at http://localhost/foo/
6 listening at http://localhost/foo/
8 killed!
9 % With --prefix /foo
7 % With --prefix /foo
10 listening at http://localhost/foo/
8 listening at http://localhost/foo/
11 killed!
12 % With --prefix foo/
9 % With --prefix foo/
13 listening at http://localhost/foo/
10 listening at http://localhost/foo/
14 killed!
15 % With --prefix /foo/
11 % With --prefix /foo/
16 listening at http://localhost/foo/
12 listening at http://localhost/foo/
@@ -19,14 +19,24 b' import unittest'
19 from unittest import TestCase
19 from unittest import TestCase
20 import imp
20 import imp
21 import shutil
21 import shutil
22 from mercurial import util
22 from mercurial import util, simplemerge
23
24 # bzr compatible interface, for the tests
25 class Merge3(simplemerge.Merge3Text):
26 """3-way merge of texts.
23
27
24 # copy simplemerge to the cwd to avoid creating a .pyc file in the source tree
28 Given BASE, OTHER, THIS, tries to produce a combined text
25 shutil.copyfile(os.path.join(os.environ['TESTDIR'], os.path.pardir,
29 incorporating the changes from both BASE->OTHER and BASE->THIS.
26 'contrib', 'simplemerge'),
30 All three will typically be sequences of lines."""
27 'simplemerge.py')
31 def __init__(self, base, a, b):
28 simplemerge = imp.load_source('simplemerge', 'simplemerge.py')
32 basetext = '\n'.join([i.strip('\n') for i in base] + [''])
29 Merge3 = simplemerge.Merge3
33 atext = '\n'.join([i.strip('\n') for i in a] + [''])
34 btext = '\n'.join([i.strip('\n') for i in b] + [''])
35 if util.binary(basetext) or util.binary(atext) or util.binary(btext):
36 raise util.Abort("don't know how to merge binary files")
37 simplemerge.Merge3Text.__init__(self, basetext, atext, btext,
38 base, a, b)
39
30 CantReprocessAndShowBase = simplemerge.CantReprocessAndShowBase
40 CantReprocessAndShowBase = simplemerge.CantReprocessAndShowBase
31
41
32 def split_lines(t):
42 def split_lines(t):
@@ -27,6 +27,11 b' r = os.system(sys.argv[2])'
27 sys.exit(bool(r))
27 sys.exit(bool(r))
28 EOF
28 EOF
29
29
30 cat <<EOF > badhook
31 import sys
32 sys.stdout.write("KABOOM")
33 EOF
34
30 echo "# creating 'remote'"
35 echo "# creating 'remote'"
31 hg init remote
36 hg init remote
32 cd remote
37 cd remote
@@ -91,13 +96,16 b' hg cat -r tip foo'
91
96
92 echo z > z
97 echo z > z
93 hg ci -A -m z -d '1000001 0' z
98 hg ci -A -m z -d '1000001 0' z
99 # a bad, evil hook that prints to stdout
100 echo 'changegroup.stdout = python ../badhook' >> .hg/hgrc
94
101
95 cd ../local
102 cd ../local
96 echo r > r
103 echo r > r
97 hg ci -A -m z -d '1000002 0' r
104 hg ci -A -m z -d '1000002 0' r
98
105
99 echo "# push should succeed"
106 echo "# push should succeed even though it has an unexpected response"
100 hg push
107 hg push
108 hg -R ../remote heads
101
109
102 cd ..
110 cd ..
103 cat dummylog
111 cat dummylog
@@ -70,7 +70,7 b' crosschecking files in changesets and ma'
70 checking files
70 checking files
71 2 files, 2 changesets, 3 total revisions
71 2 files, 2 changesets, 3 total revisions
72 bleah
72 bleah
73 # push should succeed
73 # push should succeed even though it has an unexpected response
74 pushing to ssh://user@dummy/remote
74 pushing to ssh://user@dummy/remote
75 searching for changes
75 searching for changes
76 note: unsynced remote changes!
76 note: unsynced remote changes!
@@ -78,6 +78,21 b' remote: adding changesets'
78 remote: adding manifests
78 remote: adding manifests
79 remote: adding file changes
79 remote: adding file changes
80 remote: added 1 changesets with 1 changes to 1 files
80 remote: added 1 changesets with 1 changes to 1 files
81 abort: unexpected response:
82 'KABOOM1\n'
83 changeset: 3:ac7448082955
84 tag: tip
85 parent: 1:572896fe480d
86 user: test
87 date: Mon Jan 12 13:46:42 1970 +0000
88 summary: z
89
90 changeset: 2:187c6caa0d1e
91 parent: 0:e34318c26897
92 user: test
93 date: Mon Jan 12 13:46:41 1970 +0000
94 summary: z
95
81 Got arguments 1:user@dummy 2:hg -R nonexistent serve --stdio
96 Got arguments 1:user@dummy 2:hg -R nonexistent serve --stdio
82 Got arguments 1:user@dummy 2:hg -R remote serve --stdio
97 Got arguments 1:user@dummy 2:hg -R remote serve --stdio
83 Got arguments 1:user@dummy 2:hg -R remote serve --stdio
98 Got arguments 1:user@dummy 2:hg -R remote serve --stdio
@@ -63,4 +63,19 b' hg verify'
63 cat a
63 cat a
64 hg paths | sed -e 's,:[0-9][0-9]*/,/,'
64 hg paths | sed -e 's,:[0-9][0-9]*/,/,'
65
65
66 echo '% test with empty repo (issue965)'
67 cd ..
68 hg init remotempty
69
70 http_proxy= hg clone static-http://localhost:$HGPORT/remotempty local3 | sed -e 's,:[0-9][0-9]*/,/,'
71
72 cd local3
73 hg verify
74 hg paths | sed -e 's,:[0-9][0-9]*/,/,'
75
76 echo '% test with non-repo'
77 cd ..
78 mkdir notarepo
79 http_proxy= hg clone static-http://localhost:$HGPORT/notarepo local3 2>&1 | sed -e 's,:[0-9][0-9]*/,/,'
80
66 kill $!
81 kill $!
@@ -42,3 +42,14 b' checking files'
42 1 files, 1 changesets, 1 total revisions
42 1 files, 1 changesets, 1 total revisions
43 a
43 a
44 default = static-http://localhost/
44 default = static-http://localhost/
45 % test with empty repo (issue965)
46 no changes found
47 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
48 checking changesets
49 checking manifests
50 crosschecking files in changesets and manifests
51 checking files
52 0 files, 0 changesets, 0 total revisions
53 default = static-http://localhost/remotempty
54 % test with non-repo
55 abort: 'http://localhost/notarepo' does not appear to be an hg repository!
@@ -21,7 +21,7 b' cd ..'
21 hg init repo2
21 hg init repo2
22 cd repo2
22 cd repo2
23 touch modified removed deleted ignored
23 touch modified removed deleted ignored
24 echo "ignored" > .hgignore
24 echo "^ignored$" > .hgignore
25 hg ci -A -m 'initial checkin' -d "1000000 0"
25 hg ci -A -m 'initial checkin' -d "1000000 0"
26 sleep 1 # make sure mtime is changed
26 sleep 1 # make sure mtime is changed
27 touch modified added unknown ignored
27 touch modified added unknown ignored
@@ -37,3 +37,10 b' echo "hg status -C:"'
37 hg status -C
37 hg status -C
38 echo "hg status -A:"
38 echo "hg status -A:"
39 hg status -A
39 hg status -A
40 echo "^ignoreddir$" > .hgignore
41 mkdir ignoreddir
42 touch ignoreddir/file
43 echo "hg status ignoreddir/file:"
44 hg status ignoreddir/file
45 echo "hg status -i ignoreddir/file:"
46 hg status -i ignoreddir/file
@@ -99,7 +99,6 b' never-existed: No such file or directory'
99 A added
99 A added
100 R removed
100 R removed
101 ! deleted
101 ! deleted
102 ? ignored
103 ? unknown
102 ? unknown
104 hg status -C:
103 hg status -C:
105 A added
104 A added
@@ -118,3 +117,6 b' R removed'
118 I ignored
117 I ignored
119 C .hgignore
118 C .hgignore
120 C modified
119 C modified
120 hg status ignoreddir/file:
121 hg status -i ignoreddir/file:
122 I ignoreddir/file
@@ -22,6 +22,7 b' resolving manifests'
22 b
22 b
23 a: versions differ -> m
23 a: versions differ -> m
24 b: remote created -> g
24 b: remote created -> g
25 picked tool 'true' for a (binary False symlink False)
25 merging a
26 merging a
26 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
27 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
27 getting b
28 getting b
@@ -58,6 +59,7 b' resolving manifests'
58 b
59 b
59 a: versions differ -> m
60 a: versions differ -> m
60 b: remote created -> g
61 b: remote created -> g
62 picked tool 'true' for a (binary False symlink False)
61 merging a
63 merging a
62 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
64 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
63 getting b
65 getting b
@@ -109,8 +111,10 b' resolving manifests'
109 searching for copies back to rev 1
111 searching for copies back to rev 1
110 a: versions differ -> m
112 a: versions differ -> m
111 b: versions differ -> m
113 b: versions differ -> m
114 picked tool 'true' for a (binary False symlink False)
112 merging a
115 merging a
113 my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
116 my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
117 picked tool 'true' for b (binary False symlink False)
114 merging b
118 merging b
115 my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
119 my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
116 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
120 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
@@ -93,6 +93,13 b' hg rm fenugreek'
93 debugwalk fenugreek
93 debugwalk fenugreek
94 touch new
94 touch new
95 debugwalk new
95 debugwalk new
96
97 mkdir ignored
98 touch ignored/file
99 echo '^ignored$' > .hgignore
100 debugwalk ignored
101 debugwalk ignored/file
102
96 chdir ..
103 chdir ..
97 debugwalk -R t t/mammals/skunk
104 debugwalk -R t t/mammals/skunk
98 mkdir t2
105 mkdir t2
@@ -283,6 +283,11 b' m fenugreek fenugreek exact'
283 hg debugwalk new
283 hg debugwalk new
284 f new new exact
284 f new new exact
285
285
286 hg debugwalk ignored
287
288 hg debugwalk ignored/file
289 f ignored/file ignored/file exact
290
286 cd ..
291 cd ..
287
292
288 hg debugwalk -R t t/mammals/skunk
293 hg debugwalk -R t t/mammals/skunk
@@ -2,17 +2,18 b''
2
2
3 hg init test
3 hg init test
4 cd test
4 cd test
5 cat >sometext.txt <<ENDSOME
5 mkdir sub
6 cat >'sub/some "text".txt' <<ENDSOME
6 This is just some random text
7 This is just some random text
7 that will go inside the file and take a few lines.
8 that will go inside the file and take a few lines.
8 It is very boring to read, but computers don't
9 It is very boring to read, but computers don't
9 care about things like that.
10 care about things like that.
10 ENDSOME
11 ENDSOME
11 hg add sometext.txt
12 hg add 'sub/some "text".txt'
12 hg commit -d "1 0" -m "Just some text"
13 hg commit -d "1 0" -m "Just some text"
13 hg serve -p $HGPORT -A access.log -E error.log -d --pid-file=hg.pid
14 hg serve -p $HGPORT -A access.log -E error.log -d --pid-file=hg.pid
14 cat hg.pid >> $DAEMON_PIDS
15 cat hg.pid >> $DAEMON_PIDS
15 ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/?f=f165dc289438;file=sometext.txt;style=raw' content-type content-length content-disposition) >getoutput.txt &
16 ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/?f=a23bf1310f6e;file=sub/some%20%22text%22.txt;style=raw' content-type content-length content-disposition) >getoutput.txt &
16
17
17 sleep 5
18 sleep 5
18 kill `cat hg.pid`
19 kill `cat hg.pid`
@@ -1,10 +1,10 b''
1 200 Script output follows
1 200 Script output follows
2 content-type: text/plain
2 content-type: text/plain
3 content-length: 157
3 content-length: 157
4 content-disposition: inline; filename=sometext.txt
4 content-disposition: inline; filename="some \"text\".txt"
5
5
6 This is just some random text
6 This is just some random text
7 that will go inside the file and take a few lines.
7 that will go inside the file and take a few lines.
8 It is very boring to read, but computers don't
8 It is very boring to read, but computers don't
9 care about things like that.
9 care about things like that.
10 host - - [date] "GET /?f=f165dc289438;file=sometext.txt;style=raw HTTP/1.1" 200 -
10 host - - [date] "GET /?f=a23bf1310f6e;file=sub/some%20%22text%22.txt;style=raw HTTP/1.1" 200 -
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now