annotate mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CatCommand.java @ 600:6c480513e5c2

Optimize subrepo changes calculation: reuse subrepo revision table calculated for parent commit
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Thu, 30 May 2013 15:09:10 +0400
parents efba721f9a1d
children 31a1aca3305c
rev   line source
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
1 /*
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
2 * Copyright 2000-2011 JetBrains s.r.o.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
3 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
4 * Licensed under the Apache License, Version 2.0 (the "License");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
5 * you may not use this file except in compliance with the License.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
6 * You may obtain a copy of the License at
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
7 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
8 * http://www.apache.org/licenses/LICENSE-2.0
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
9 *
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
10 * Unless required by applicable law or agreed to in writing, software
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
11 * distributed under the License is distributed on an "AS IS" BASIS,
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
13 * See the License for the specific language governing permissions and
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
14 * limitations under the License.
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
15 */
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
16 package jetbrains.buildServer.buildTriggers.vcs.mercurial.command;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
17
417
74487e2c6356 Use shorter temp directory names
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
18 import jetbrains.buildServer.buildTriggers.vcs.mercurial.HgFileUtil;
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 476
diff changeset
19 import jetbrains.buildServer.log.Loggers;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
20 import jetbrains.buildServer.vcs.VcsException;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
21 import org.jetbrains.annotations.NotNull;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
22
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
23 import java.io.File;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
24 import java.io.IOException;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
25 import java.util.ArrayList;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
26 import java.util.LinkedList;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
27 import java.util.List;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
28 import java.util.Queue;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
29
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
30 import static java.util.Collections.singletonList;
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 476
diff changeset
31 import static jetbrains.buildServer.buildTriggers.vcs.mercurial.HgFileUtil.deleteDir;
352
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
32
280
8c1fd2e565ae Implement mercurial detection on the agents
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 266
diff changeset
33 public class CatCommand extends VcsRootCommand {
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
34 private String myRevId;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
35 private final static int MAX_CMD_LEN = 900;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
36 private List<String> myRelativePaths = new ArrayList<String>();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
37 private boolean myCheckForFailure = true;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
38
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
39 public CatCommand(@NotNull CommandSettings commandSettings,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
40 @NotNull String hgPath,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
41 @NotNull File workingDir,
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
42 @NotNull AuthSettings authSettings) {
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
43 super(commandSettings, hgPath, workingDir, authSettings);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
44 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
45
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
46 public CatCommand files(@NotNull String relativePath) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
47 myRelativePaths = singletonList(relativePath);
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
48 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
49 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
50
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
51 public CatCommand files(@NotNull List<String> relativePaths) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
52 myRelativePaths = relativePaths;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
53 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
54 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
55
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
56 public CatCommand setRevId(final String revId) {
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
57 myRevId = revId;
399
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
58 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
59 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
60
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
61 public CatCommand atRevision(@NotNull ChangeSet cset) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
62 myRevId = cset.getId();
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
63 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
64 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
65
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
66 public CatCommand checkForFailure(boolean doCheckForFailure) {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
67 myCheckForFailure = doCheckForFailure;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
68 return this;
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
69 }
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
70
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
71 public File call() throws VcsException {
45f25ca68312 Support local mirrors for subrepos
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 367
diff changeset
72 return execute(myRelativePaths, myCheckForFailure);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
73 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
74
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
75 public File execute(List<String> relPaths) throws VcsException {
304
e9cdb499350d Do clean checkout if subrepository URL changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
76 return execute(relPaths, true);
e9cdb499350d Do clean checkout if subrepository URL changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
77 }
e9cdb499350d Do clean checkout if subrepository URL changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
78
e9cdb499350d Do clean checkout if subrepository URL changed
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 280
diff changeset
79 public File execute(List<String> relPaths, boolean checkFailure) throws VcsException {
352
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
80 File tempDir = null;
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
81 try {
352
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
82 tempDir = createTmpDir();
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
83 createDirectories(relPaths, tempDir);
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
84 catFiles(relPaths, checkFailure, tempDir);
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
85 return tempDir;
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
86 } catch (VcsException e) {
478
0a33f3dbd261 Ensure temp dirs are deleted
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 476
diff changeset
87 deleteDir(tempDir, Loggers.VCS);
352
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
88 throw e;
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
89 }
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
90 }
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
91
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
92 private File createTmpDir() throws VcsException {
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
93 try {
417
74487e2c6356 Use shorter temp directory names
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 399
diff changeset
94 return HgFileUtil.createTempDir();
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
95 } catch (IOException e) {
476
aa19481a91c3 Include cause of the error
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 417
diff changeset
96 throw new VcsException("Unable to create temporary directory", e);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
97 }
352
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
98 }
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
99
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
100 private void createDirectories(List<String> relPaths, File tempDir) throws VcsException {
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
101 for (String path: relPaths) {
352
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
102 File parentFile = new File(tempDir, path).getParentFile();
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
103 if (!parentFile.isDirectory() && !parentFile.mkdirs())
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
104 throw new VcsException("Failed to create directory: " + parentFile.getAbsolutePath());
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
105 }
352
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
106 }
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
107
352
1b3be513520e TW-13178 clean tmp dir when cat command fails
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 339
diff changeset
108 private void catFiles(List<String> relPaths, boolean checkFailure, File tempDir) throws VcsException {
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
109 Queue<String> paths = new LinkedList<String>(relPaths);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
110 while (!paths.isEmpty()) {
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
111 MercurialCommandLine cli = createCommandLine(tempDir);
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
112 int cmdSize = cli.getCommandLineString().length();
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
113
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
114 do {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
115 String path = paths.poll();
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
116 cli.addParameter(path);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
117 cmdSize += path.length();
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
118 } while (cmdSize < MAX_CMD_LEN && !paths.isEmpty());
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
119
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
120 runCommand(cli, myCommandSettings.setCheckForFailure(checkFailure));
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
121 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
122 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
123
480
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
124 private MercurialCommandLine createCommandLine(final File tempDir) {
efba721f9a1d TW-23382 agent logs with info, server logs with debug
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 478
diff changeset
125 MercurialCommandLine cli = createCommandLine();
266
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
126 cli.addParameter("cat");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
127 cli.addParameter("-o");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
128 cli.addParameter(tempDir.getAbsolutePath() + File.separator + "%p");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
129 if (myRevId != null) {
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
130 cli.addParameter("-r");
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
131 cli.addParameter(myRevId);
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
132 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
133 return cli;
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
134 }
643fa1236f4e Fix file encoding
Dmitry Neverov <dmitry.neverov@jetbrains.com>
parents: 181
diff changeset
135 }