replaced <code></code> with more concise {@code}
[idea/community.git] / plugins / git4idea / src / git4idea / config / GitVersionSpecialty.java
1 /*
2  * Copyright 2000-2010 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 package git4idea.config;
17
18 import com.intellij.openapi.util.SystemInfo;
19 import org.jetbrains.annotations.NotNull;
20
21 /**
22  * <p>
23  * This enum stores the collection of bugs and features of different versions of Git.
24  * To check if the bug exists in current version call {@link #existsIn(GitVersion)}.
25  * </p>
26  * <p>
27  * Usage example: CYGWIN Git has a bug - not understanding stash names without quotes:
28  * <pre>{@code
29  * String stashName = "stash@{0}";
30  * if (GitVersionSpecialty.NEEDS_QUOTES_IN_STASH_NAME.existsIn(myVcs.getVersion()) {
31  *   stashName = "\"stash@{0}\"";
32  * }
33  * }</pre>
34  * </p>
35  * @author Kirill Likhodedov
36  */
37 public enum GitVersionSpecialty {
38
39   /**
40    * This version of git has "--progress" parameter in long-going remote commands: clone, fetch, pull, push.
41    * Note that other commands (like merge) don't have this parameter in this version yet.
42    */
43   ABLE_TO_USE_PROGRESS_IN_REMOTE_COMMANDS {
44     @Override
45     public boolean existsIn(@NotNull GitVersion version) {
46       return version.isLaterOrEqual(new GitVersion(1, 7, 1, 1));
47     }
48   },
49
50   /**
51    * @deprecated on Windows, quotes are now added automatically whenever necessary on the GeneralCommandLine level
52    */
53   @Deprecated
54   NEEDS_QUOTES_IN_STASH_NAME {
55     @Override
56     public boolean existsIn(@NotNull GitVersion version) {
57       return version.getType().equals(GitVersion.Type.CYGWIN);
58     }
59   },
60
61   STARTED_USING_RAW_BODY_IN_FORMAT {
62     @Override
63     public boolean existsIn(@NotNull GitVersion version) {
64       return version.isLaterOrEqual(new GitVersion(1, 7, 2, 0));
65     }
66   },
67
68   /**
69    * Git understands {@code 'git status --porcelain'}.
70    * Since 1.7.0.
71    */
72   KNOWS_STATUS_PORCELAIN {
73     @Override
74     public boolean existsIn(@NotNull GitVersion version) {
75       return version.isLaterOrEqual(new GitVersion(1, 7, 0, 0));
76     }
77   },
78
79   /**
80    * {@code git fetch --prune} is actually supported since 1.7.0,
81    * but before 1.7.7.2 calling {@code git fetch --prune origin master} would delete all other references.
82    * This was fixed in {@code ed43de6ec35dfd4c4bd33ae9b5f2ebe38282209f} and added to the Git 1.7.7.2 release.
83    */
84   SUPPORTS_FETCH_PRUNE {
85     @Override
86     public boolean existsIn(@NotNull GitVersion version) {
87       return version.isLaterOrEqual(new GitVersion(1, 7, 7, 2));
88     }
89   },
90
91   /**
92    * Old style of messages returned by Git in the following 2 situations:
93    * - untracked files would be overwritten by checkout/merge;
94    * - local changes would be overwritten by checkout/merge;
95    */
96   OLD_STYLE_OF_UNTRACKED_AND_LOCAL_CHANGES_WOULD_BE_OVERWRITTEN {
97     @Override
98     public boolean existsIn(@NotNull GitVersion version) {
99       return version.isOlderOrEqual(new GitVersion(1, 7, 1, 0));
100     }
101   },
102
103   DOESNT_DEFINE_HOME_ENV_VAR {
104     @Override
105     public boolean existsIn(@NotNull GitVersion version) {
106       return SystemInfo.isWindows && version.isOlderOrEqual(new GitVersion(1, 7, 0, 2));
107     }
108   },
109
110   /**
111    * {@code --no-walk=unsorted} <br/>
112    * Before this version {@code --no-walk} didn't take any parameters.
113    */
114   NO_WALK_UNSORTED {
115     @Override
116     public boolean existsIn(@NotNull GitVersion version) {
117       return version.isLaterOrEqual(new GitVersion(1, 7, 12, 1));
118     }
119   },
120
121   SUPPORTS_FOLLOW_TAGS {
122     @Override
123     public boolean existsIn(@NotNull GitVersion version) {
124       return version.isLaterOrEqual(new GitVersion(1, 8, 3, 0));
125     }
126   },
127
128   CAN_OVERRIDE_GIT_CONFIG_FOR_COMMAND {
129     @Override
130     public boolean existsIn(@NotNull GitVersion version) {
131       return version.isLaterOrEqual(new GitVersion(1, 7, 2, 0));
132     }
133   },
134
135   FOLLOW_IS_BUGGY_IN_THE_LOG {
136     @Override
137     public boolean existsIn(@NotNull GitVersion version) {
138       return version.isOlderOrEqual(new GitVersion(1, 7, 2, 0));
139     }
140   },
141
142   FULL_HISTORY_SIMPLIFY_MERGES_WORKS_CORRECTLY { // for some reason, even with "simplify-merges", it used to show a lot of merges in history
143     @Override
144     public boolean existsIn(@NotNull GitVersion version) {
145       return version.isLaterOrEqual(new GitVersion(1, 9, 0, 0));
146     }
147   },
148
149   LOG_AUTHOR_FILTER_SUPPORTS_VERTICAL_BAR {
150     @Override
151     public boolean existsIn(@NotNull GitVersion version) {
152       return !SystemInfo.isMac || version.isLaterOrEqual(new GitVersion(1, 8, 3, 3));
153     }
154   },
155
156   KNOWS_SET_UPSTREAM_TO { // in Git 1.8.0 --set-upstream-to was introduced as a replacement of --set-upstream which became deprecated
157     @Override
158     public boolean existsIn(@NotNull GitVersion version) {
159       return version.isLaterOrEqual(new GitVersion(1, 8, 0, 0));
160     }
161   },
162
163   /**
164    * Git pre-push hook is supported since version 1.8.2.
165    */
166   PRE_PUSH_HOOK {
167     @Override
168     public boolean existsIn(@NotNull GitVersion version) {
169       return version.isLaterOrEqual(new GitVersion(1, 8, 2, 0));
170     }
171   },
172
173   LF_SEPARATORS_IN_STDIN {
174     @Override
175     public boolean existsIn(@NotNull GitVersion version) {
176       // before 2.8.0 git for windows expects to have LF symbol as line separator in standard input instead of CRLF
177       return SystemInfo.isWindows && !version.isLaterOrEqual(new GitVersion(2, 8, 0, 0));
178     }
179   };
180
181   public abstract boolean existsIn(@NotNull GitVersion version);
182
183 }