TW-58811 Support 'update-ref --stdin'
[teamcity/git-plugin.git] / git-agent / src / jetbrains / buildServer / buildTriggers / vcs / git / agent / command / impl / UpdateRefBatchCommandImpl.java
1 /*
2  * Copyright 2000-2019 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package jetbrains.buildServer.buildTriggers.vcs.git.agent.command.impl;
18
19 import jetbrains.buildServer.ExecResult;
20 import jetbrains.buildServer.buildTriggers.vcs.git.agent.GitCommandLine;
21 import jetbrains.buildServer.buildTriggers.vcs.git.agent.command.UpdateRefBatchCommand;
22 import jetbrains.buildServer.vcs.VcsException;
23 import org.jetbrains.annotations.NotNull;
24 import org.jetbrains.annotations.Nullable;
25 import org.springframework.util.FastByteArrayOutputStream;
26
27 import java.io.IOException;
28
29 import static org.apache.commons.codec.Charsets.UTF_8;
30
31
32 public class UpdateRefBatchCommandImpl extends BaseCommandImpl implements UpdateRefBatchCommand {
33   private FastByteArrayOutputStream myInput = new FastByteArrayOutputStream();
34
35   public UpdateRefBatchCommandImpl(@NotNull GitCommandLine cmd) {
36     super(cmd);
37   }
38
39   @NotNull
40   @Override
41   public UpdateRefBatchCommand update(@NotNull final String ref, @NotNull final String value, @Nullable final String oldValue)
42     throws VcsException {
43     //update SP <ref> NUL <newValue> NUL [<oldValue>] NUL
44     try {
45       myInput.write("update".getBytes(UTF_8));
46       myInput.write(0x20);
47       myInput.write(ref.getBytes(UTF_8));
48       myInput.write(0x0);
49       myInput.write(value.getBytes(UTF_8));
50       myInput.write(0x0);
51       if (oldValue != null) {
52         myInput.write(oldValue.getBytes(UTF_8));
53       }
54       myInput.write(0x0);
55     } catch (IOException ignored) {
56       throw new VcsException("Failed to generate update-ref command binary input");
57     }
58     return this;
59   }
60
61
62   @NotNull
63   @Override
64   public UpdateRefBatchCommand create(@NotNull final String ref, @NotNull final String value) throws VcsException {
65     //create SP <ref> NUL <newValue> NUL
66     try {
67       myInput.write("create".getBytes(UTF_8));
68       myInput.write(0x20);
69       myInput.write(ref.getBytes(UTF_8));
70       myInput.write(0x0);
71     } catch (IOException ignored) {
72       throw new VcsException("Failed to generate update-ref command binary input");
73     }
74     return this;
75   }
76
77   @NotNull
78   @Override
79   public UpdateRefBatchCommand delete(@NotNull final String ref, @Nullable final String oldValue) throws VcsException {
80     //delete SP <ref> NUL [<oldValue>] NUL
81     try {
82       myInput.write("delete".getBytes(UTF_8));
83       myInput.write(0x20);
84       myInput.write(ref.getBytes(UTF_8));
85       myInput.write(0x0);
86       if (oldValue != null) {
87         myInput.write(oldValue.getBytes(UTF_8));
88       }
89       myInput.write(0x0);
90     } catch (IOException ignored) {
91       throw new VcsException("Failed to generate update-ref command binary input");
92     }
93     return this;
94   }
95
96   @NotNull
97   @Override
98   public UpdateRefBatchCommand verify(@NotNull final String ref, @Nullable final String oldValue) throws VcsException {
99     //verify SP <ref> NUL [<oldValue>] NUL
100     try {
101       myInput.write("verify".getBytes(UTF_8));
102       myInput.write(0x20);
103       myInput.write(ref.getBytes(UTF_8));
104       myInput.write(0x0);
105       if (oldValue != null) {
106         myInput.write(oldValue.getBytes(UTF_8));
107       }
108       myInput.write(0x0);
109     } catch (IOException ignored) {
110       throw new VcsException("Failed to generate update-ref command binary input");
111     }
112     return this;
113   }
114
115   @NotNull
116   @Override
117   public UpdateRefBatchCommand option(@NotNull final String option) throws VcsException {
118     //option SP <opt> NUL
119     try {
120       myInput.write("option".getBytes(UTF_8));
121       myInput.write(0x20);
122       myInput.write(option.getBytes(UTF_8));
123       myInput.write(0x0);
124     } catch (IOException ignored) {
125       throw new VcsException("Failed to generate update-ref command binary input");
126     }
127     return this;
128   }
129
130   public void call() throws VcsException {
131     GitCommandLine cmd = getCmd();
132     cmd.addParameter("update-ref");
133     cmd.addParameter("--stdin");
134     cmd.addParameter("-z");
135     byte[] input = myInput.toByteArray();
136     ExecResult r = CommandUtil.runCommand(cmd, input);
137     CommandUtil.failIfNotEmptyStdErr(cmd, r);
138   }
139 }