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 "droplets" 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( |
|
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 |
|
|
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 |
|
|
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 |
|
166 | pendings[c] = [p for p in parents[c] if p not in self.map] | |
134 |
|
|
167 | try: | |
135 |
|
|
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] = |
|
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 |
|
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 |
|
109 | latest = max(filerevids.get(r, None), latest) | |
110 |
|
|
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( |
|
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 |
|
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, |
|
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 |
|
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= |
|
197 | self.ct.show(changenode=node, root=self.repo.root, file=path) | |
152 |
|
|
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( |
|
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 |
|
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 |
|
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 |
|
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 = |
|
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 = |
|
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 |
|
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 |
|
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 |
|
|
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 |
|
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 |
|
|
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 " |
|
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 |
|
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( |
|
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 |
|
|
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!") % r |
|
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 |
% r |
|
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!") % r |
|
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!") % r |
|
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 |
|
|
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 |
|
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 |
|
2230 | if src != 'b': | |
2235 |
|
|
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 = ([], |
|
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, |
|
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 |
|
|
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 |
|
|
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 |
|
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, _(' |
|
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 |
|
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 |
|
|
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 |
i |
|
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 |
|
97 | Sometimes Mercurial needs to open a text file in an editor | |
101 |
to modify, for example when writing commit messages |
|
98 | for a user to modify, for example when writing commit messages. | |
102 |
|
|
99 | The editor it uses is determined by looking at the environment | |
103 |
|
|
100 | variables HGEDITOR, VISUAL and EDITOR, in that order. The first | |
104 |
|
|
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 |
|
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 |
|
|
384 | ltype = "difflineplus" | |
378 | elif l.startswith('-'): |
|
385 | elif l.startswith('-'): | |
379 |
|
|
386 | ltype = "difflineminus" | |
380 | elif l.startswith('@'): |
|
387 | elif l.startswith('@'): | |
381 |
|
|
388 | ltype = "difflineat" | |
382 | else: |
|
389 | else: | |
383 |
|
|
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 |
"line |
|
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 |
|
|
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": |
|
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 |
|
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( |
|
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 |
|
|
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 |
|
|
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(' |
|
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, |
|
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 |
|
|
583 | self.sjoin("journal"), | |
554 |
|
|
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 |
|
902 | if self.branchcache: | |
864 |
self.branch |
|
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, |
|
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, |
|
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 |
|
|
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 |
|
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: |
|
196 | if not d: | |
186 | self.pipeo.write(str(len(d)) + '\n') |
|
197 | break | |
187 |
self. |
|
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. |
|
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. |
|
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: |
|
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 |
|
|
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, |
|
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 = |
|
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 |
|
|
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 |
|
|
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 |
|
|
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( |
|
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 |
|
|
1587 | date = date.strip() | |
1540 | try: |
|
1588 | try: | |
1541 |
when, offset = map(int, |
|
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( |
|
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 ') % |
|
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 |
f |
|
1707 | if '.hg' in dirs: | |
1660 | if d == '.hg': |
|
1708 | dirs[:] = [] # don't descend further | |
1661 |
|
|
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>< |
|
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#">< |
|
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 |
|
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 - |
|
12 | hg commit -m "Adding root node" | |
8 |
|
|
13 | heads | |
9 | echo '-------' |
|
14 | echo '-------' | |
10 |
|
|
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 - |
|
21 | hg commit -m "Adding a branch" | |
17 |
|
|
22 | heads | |
18 | echo '-------' |
|
23 | echo '-------' | |
19 |
|
|
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 - |
|
31 | hg commit -m "Adding b branch" | |
27 |
|
|
32 | heads | |
28 | echo '-------' |
|
33 | echo '-------' | |
29 |
|
|
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 - |
|
39 | hg commit -m "Adding b branch head 1" | |
35 |
|
|
40 | heads | |
36 | echo '-------' |
|
41 | echo '-------' | |
37 |
|
|
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 - |
|
48 | hg commit -m "Adding b branch head 2" | |
44 |
|
|
49 | heads | |
45 | echo '-------' |
|
50 | echo '-------' | |
46 |
|
|
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 - |
|
57 | hg commit -m "Adding b branch head 3" | |
53 |
|
|
58 | heads | |
54 | echo '-------' |
|
59 | echo '-------' | |
55 |
|
|
60 | heads . | |
56 |
|
61 | |||
57 | echo '=======' |
|
62 | echo '=======' | |
58 | hg merge 4 |
|
63 | hg merge 4 | |
59 |
hg commit - |
|
64 | hg commit -m "Merging b branch head 2 and b branch head 3" | |
60 |
|
|
65 | heads | |
61 | echo '-------' |
|
66 | echo '-------' | |
62 |
|
|
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 - |
|
73 | hg commit -m "Adding c branch" | |
69 |
|
|
74 | heads | |
70 | echo '-------' |
|
75 | echo '-------' | |
71 |
|
|
76 | heads . | |
72 |
|
77 | |||
73 | echo '=======' |
|
78 | echo '=======' | |
74 |
|
|
79 | heads -r 3 . | |
75 | echo $? |
|
80 | echo $? | |
76 | echo '-------' |
|
81 | echo '-------' | |
77 |
|
|
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 |
|
|
88 | heads -r 3 . | |
84 | echo $? |
|
89 | echo $? | |
85 | echo '-------' |
|
90 | echo '-------' | |
86 |
|
|
91 | heads -r 2 . | |
87 | echo $? |
|
92 | echo $? | |
88 | echo '-------' |
|
93 | echo '-------' | |
89 |
|
|
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 |
h |
|
100 | heads | |
96 | echo '-------' |
|
101 | echo '-------' | |
97 |
h |
|
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 |
h |
|
108 | heads "$i" | |
104 | echo '-------' |
|
109 | echo '-------' | |
105 | done |
|
110 | done | |
106 |
|
111 | |||
107 | echo '=======' |
|
112 | echo '=======' | |
108 |
|
|
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 |
|
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 |
|
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 . |
|
39 | hg commit -d '0 0' -m commit-11 . | |
44 |
hg commit -d '0 0' -m commit-12 ../dir ../dir2 |
|
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 |
|
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 |
|
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 |
|
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 |
|
15 | abort: no match under directory dir! | |
22 |
abort: no match under directory . |
|
16 | abort: no match under directory .! | |
23 |
abort: no match under directory .. |
|
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 |
|
20 | abort: file does-not-exist not found! | |
27 |
abort: file |
|
21 | abort: file baz not tracked! | |
28 |
abort: file |
|
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 |
<<<<<<< |
|
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 c |
|
19 | 2 c2 | |
20 |
pulling from branch0 into branch |
|
20 | pulling from branch0 into branch2 | |
21 | 2 changesets found |
|
21 | 2 changesets found | |
22 |
1 c |
|
22 | 1 c1 | |
23 |
pulling from branch0 into branch |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 -r |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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, |
|
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 |
|
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 |
+<<<<<<< |
|
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 |
<<<<<<< |
|
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 |
|
|
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 |
|
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 |
|
|
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 |
@@ -2,17 +2,12 b'' | |||||
2 |
|
2 | |||
3 | "$TESTDIR/hghave" symlink || exit 80 |
|
3 | "$TESTDIR/hghave" symlink || exit 80 | |
4 |
|
4 | |||
5 | cleanpath() |
|
|||
6 | { |
|
|||
7 | sed -e "s:/.*\(/test-symlink-basic/.*\):...\1:" |
|
|||
8 | } |
|
|||
9 |
|
||||
10 | hg init a |
|
5 | hg init a | |
11 | cd a |
|
6 | cd a | |
12 | ln -s nothing dangling |
|
7 | ln -s nothing dangling | |
13 |
hg commit -m 'commit symlink without adding' |
|
8 | hg commit -m 'commit symlink without adding' dangling | |
14 | hg add dangling |
|
9 | hg add dangling | |
15 |
hg commit -m 'add symlink' |
|
10 | hg commit -m 'add symlink' | |
16 |
|
11 | |||
17 | hg tip -v |
|
12 | hg tip -v | |
18 | hg manifest --debug |
|
13 | hg manifest --debug |
@@ -1,4 +1,4 b'' | |||||
1 |
abort: file |
|
1 | abort: file dangling not tracked! | |
2 | changeset: 0:cabd88b706fc |
|
2 | changeset: 0:cabd88b706fc | |
3 | tag: tip |
|
3 | tag: tip | |
4 | user: test |
|
4 | user: test |
@@ -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= |
|
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= |
|
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