Mercurial > hg > mercurial
changeset 917:e467e67d5892 Hajipur-9.0.x
TW-39663 don't escape command output dedicated for parsing
line wrap: on
line diff
--- a/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ext/impl/SparseCheckoutProvider.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ext/impl/SparseCheckoutProvider.java Tue Jan 13 20:52:21 2015 +0100 @@ -62,7 +62,7 @@ } CommandResult result = info.getTempDirRepo().runCommand("help", "extensions"); boolean enabledExtensions = false; - for (String line : StringUtil.splitByLines(result.getStdout())) { + for (String line : StringUtil.splitByLines(result.getRawStdout())) { if (line.trim().equals("enabled extensions:")) { enabledExtensions = true; continue;
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/BranchesCommand.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/BranchesCommand.java Tue Jan 13 20:52:21 2015 +0100 @@ -46,7 +46,7 @@ MercurialCommandLine cli = createCommandLine(); cli.addParameter(getBranchesCommand()); CommandResult res = runCommand(cli); - String stdout = res.getStdout(); + String stdout = res.getRawStdout(); Map<String, String> result = new HashMap<String, String>(); Pattern branchPattern = Pattern.compile("(.*)[\\s]+([0-9]+:[A-Za-z0-9]+).*"); for (String line: stdout.split("[\r\n]+")) {
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResult.java Tue Jan 13 20:52:21 2015 +0100 @@ -78,10 +78,15 @@ } @NotNull - public String getStdout() { + public String getSecureStdout() { return removePrivateData(myDelegate.getStdout(), myPrivateData); } + @NotNull + public String getRawStdout() { + return myDelegate.getStdout(); + } + public void checkCommandFailed() throws VcsException { checkFailure(false); } @@ -90,7 +95,7 @@ rethrowDetectedError(); if (isFailure()) logAndThrowError(); - String stderr = getStderr(); + String stderr = getSecureStderr(); if (!isEmpty(stderr)) { if (failWhenStderrIsNonEmpty) logAndThrowError(); @@ -139,10 +144,15 @@ } @NotNull - private String getStderr() { + private String getSecureStderr() { return removePrivateData(myDelegate.getStderr(), myPrivateData); } + @NotNull + private String getRawStderr() { + return myDelegate.getStderr(); + } + @Nullable private Throwable getException() { return myDelegate.getException(); @@ -180,7 +190,7 @@ if (!isEmpty(myCommandWorkingDir)) message.append("[").append(myCommandWorkingDir).append("] "); message.append(getCommand()).append("' command failed."); - String stderr = getStderr(); + String stderr = getSecureStderr(); if (!isEmpty(stderr)) { int logOutputLimit = mySettings.getLogOutputLimit(); if (logOutputLimit == -1) { @@ -195,7 +205,7 @@ private String getExceptionMessage() { StringBuilder message = new StringBuilder(); message.append("'").append(getCommand()).append("' command failed."); - String stderr = getStderr(); + String stderr = getSecureStderr(); if (!isEmpty(stderr)) { message.append("\n"); int limit = mySettings.getExceptionOutputLimit(); @@ -213,7 +223,7 @@ private void rethrowDetectedError() throws VcsException { if (!shouldDetectErrors()) return; - String stderr = getStderr().trim(); + String stderr = getRawStderr().trim(); checkUnrelatedRepository(stderr); checkUnknownRevision(stderr); checkFileNotUnderTheRoot(stderr);
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandUtil.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandUtil.java Tue Jan 13 20:52:21 2015 +0100 @@ -173,9 +173,9 @@ private static void logCommandOutput(@NotNull String command, @NotNull CommandResult result, @NotNull CommandSettings settings) { int limit = settings.getLogOutputLimit(); if (limit == -1) { - Loggers.VCS.debug("Command " + command + " output:\n" + result.getStdout()); + Loggers.VCS.debug("Command " + command + " output:\n" + result.getSecureStdout()); } else { - Loggers.VCS.debug("Command " + command + " output:\n" + StringUtil.truncateStringValueWithDotsAtEnd(result.getStdout(), limit)); + Loggers.VCS.debug("Command " + command + " output:\n" + StringUtil.truncateStringValueWithDotsAtEnd(result.getSecureStdout(), limit)); } } }
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommand.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommitsAndMountPointsCommand.java Tue Jan 13 20:52:21 2015 +0100 @@ -98,9 +98,9 @@ cli.addParameter(new File(root, "result").getPath()); final CommandResult res = runCommand(cli); - final String output = res.getStdout(); + final String rawOutput = res.getRawStdout(); - if (!output.contains("##Completed##")) throw new VcsException("Command failed: " + output); + if (!rawOutput.contains("##Completed##")) throw new VcsException("Command failed: " + res.getSecureStdout()); try { parseFileLog(new File(root, "result.hgsub"), new CommitsAndMountPointsParser.ContentsConsumer() {
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/IdentifyCommand.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/IdentifyCommand.java Tue Jan 13 20:52:21 2015 +0100 @@ -103,7 +103,7 @@ cli.addParameter(myNamedRevision); } CommandResult res = runCommand(cli); - String output = res.getStdout().trim(); + String output = res.getRawStdout().trim(); if (myShowBranch) { return output; } else {
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LoadDagCommand.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LoadDagCommand.java Tue Jan 13 20:52:21 2015 +0100 @@ -60,7 +60,7 @@ final CommandResult res = runCommand(cli); - final String output = res.getStdout(); + final String output = res.getRawStdout(); String fromNode = null; for (String line : StringUtil.splitByLines(output)) { final String[] revs = line.split(" ");
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java Tue Jan 13 20:52:21 2015 +0100 @@ -139,7 +139,7 @@ cli.addParameters(myFiles); final CommandResult res = runCommand(cli); - final String output = res.getStdout(); + final String output = res.getRawStdout(); try { List<ChangeSet> changes = parseChangeSetsXml(output); if (myCalculateParents) @@ -148,9 +148,9 @@ } catch (Exception e) { int limit = myCommandSettings.getLogOutputLimit(); if (limit == -1) { - LOG.error("Error while parsing log output:\n" + output, e); + LOG.error("Error while parsing log output:\n" + res.getSecureStdout(), e); } else { - LOG.error("Error while parsing log output:\n" + StringUtil.truncateStringValueWithDotsAtEnd(output, limit), e); + LOG.error("Error while parsing log output:\n" + StringUtil.truncateStringValueWithDotsAtEnd(res.getSecureStdout(), limit), e); } throw new VcsException("Error while parsing log output, see teamcity-vcs.log for details", e); }
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ParentsCommand.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ParentsCommand.java Tue Jan 13 20:52:21 2015 +0100 @@ -47,7 +47,7 @@ cli.addParameters("-r", myRevision); CommandResult res = runCommand(cli); List<String> parentRevisions = new ArrayList<String>(); - for (String line : res.getStdout().split("\n")) { + for (String line : res.getRawStdout().split("\n")) { if (StringUtil.isEmpty(line)) continue; parentRevisions.add(new ChangeSet(line).getId());
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ResolveCommand.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/ResolveCommand.java Tue Jan 13 20:52:21 2015 +0100 @@ -37,7 +37,7 @@ MercurialCommandLine cmd = createCommandLine(); cmd.addParameters("resolve", "--no-status", "--list"); CommandResult result = runCommand(cmd); - String stdout = result.getStdout(); + String stdout = result.getRawStdout(); if (stdout.length() == 0) return emptyList(); List<String> unresolvedFiles = new ArrayList<String>();
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/StatusCommand.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/StatusCommand.java Tue Jan 13 20:52:21 2015 +0100 @@ -106,7 +106,7 @@ cli.addParameter(from + ":" + to); final CommandResult res = runCommand(cli); - return parseFiles(res.getStdout()); + return parseFiles(res.getRawStdout()); } @NotNull
--- a/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/VersionCommand.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-common/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/VersionCommand.java Tue Jan 13 20:52:21 2015 +0100 @@ -45,7 +45,7 @@ cli.addEnvParam("LC_MESSAGE", "en_US"); CommandResult result = runCommand(cli, myCommandSettings); - return HgVersion.parse(result.getStdout()); + return HgVersion.parse(result.getRawStdout()); }
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java Tue Jan 13 20:52:21 2015 +0100 @@ -270,8 +270,8 @@ cli.setEnvParams(map("HGRCPATH", "")); cli.addParameter("tags"); CommandResult res = CommandUtil.runCommand(cli, new CommandSettings()); - assertTrue(res.getStdout().contains("new_tag")); - assertTrue(res.getStdout().contains("1:1d446e82d356")); + assertTrue(res.getRawStdout().contains("new_tag")); + assertTrue(res.getRawStdout().contains("1:1d446e82d356")); } public void test_tag_in_branch() throws IOException, VcsException { @@ -287,8 +287,8 @@ cli.addParameter("tags"); cli.setEnvParams(map("HGRCPATH", "")); CommandResult res = CommandUtil.runCommand(cli, new CommandSettings()); - assertTrue(res.getStdout().contains("branch_tag")); - assertTrue(res.getStdout().contains("7:376dcf05cd2a")); + assertTrue(res.getRawStdout().contains("branch_tag")); + assertTrue(res.getRawStdout().contains("7:376dcf05cd2a")); } @@ -378,6 +378,30 @@ } + @TestFor(issues = "TW-39663") + public void do_not_escape_command_output_for_parsing() throws Exception { + File repository = copyRepository(myTempFiles, simpleRepo()); + VcsRoot root = vcsRoot().withUrl(repository.getAbsolutePath()) + .withBranch("default") + .withPassword("default") //to check we don't escape branch names + .withArchiveForPatch(true) + .build(); + + assertTrue(myVcs.getCollectChangesPolicy().getCurrentState(root).getBranchRevisions().containsKey("default")); + + root = vcsRoot().withUrl(repository.getAbsolutePath()) + .withBranch("default") + .withPassword("xml") //to ensure we don't escape xml from 'hg log' + .withArchiveForPatch(true) + .build(); + + assertEquals(7, myVcs.getCollectChangesPolicy().collectChanges(root, + RepositoryStateData.createVersionState("default", map("default", "1:1d446e82d356")), + RepositoryStateData.createVersionState("default", map("default", "11:e6935c9c80bf")), + CheckoutRules.DEFAULT).size()); + } + + public void labeling_should_not_populate_files_in_local_mirror() throws Exception { VcsRootImpl root = createVcsRoot(simpleRepo()); myVcs.getCollectChangesPolicy().getCurrentState(root);
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java Fri Jan 02 12:36:52 2015 +0100 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CommandResultTest.java Tue Jan 13 20:52:21 2015 +0100 @@ -60,7 +60,7 @@ public void output_should_not_contain_private_data() { String password = "pass"; CommandResult commandResult = commandResultFor(execResult().withStdout(password).withStderr(password), password); - assertFalse(commandResult.getStdout().contains(password)); + assertFalse(commandResult.getSecureStdout().contains(password)); myLogger.assertLogMessagesDontContain(password); }