Merge remote-tracking branch 'origin/master'
[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  * </code></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 commands (such as clone or fetch).
41    * Note that while pull, clone and fetch received the parameter since 1.7.1.1,
42    * some other commands (like merge) might have achieved it later.
43    */
44   ABLE_TO_USE_PROGRESS {
45     @Override
46     public boolean existsIn(@NotNull GitVersion version) {
47       return version.isLaterOrEqual(new GitVersion(1, 7, 1, 1));
48     }
49   },
50
51   DOESNT_GET_PARAMETERS_FROM_RUNNERW {
52     @Override
53     public boolean existsIn(@NotNull GitVersion version) {
54       return version.getType().equals(GitVersion.Type.CYGWIN);
55     }
56   },
57
58   NEEDS_QUOTES_IN_STASH_NAME {
59     @Override
60     public boolean existsIn(@NotNull GitVersion version) {
61       return version.getType().equals(GitVersion.Type.CYGWIN);
62     }
63   },
64
65   STARTED_USING_RAW_BODY_IN_FORMAT {
66     @Override
67     public boolean existsIn(@NotNull GitVersion version) {
68       return version.isLaterOrEqual(new GitVersion(1, 7, 2, 0));
69     }
70   },
71
72   /**
73    * Git understands <code>'git status --porcelain'</code>.
74    * Since 1.7.0.
75    */
76   KNOWS_STATUS_PORCELAIN {
77     @Override
78     public boolean existsIn(@NotNull GitVersion version) {
79       return version.isLaterOrEqual(new GitVersion(1, 7, 0, 0));
80     }
81   },
82
83   DOESNT_DEFINE_HOME_ENV_VAR {
84     @Override
85     public boolean existsIn(@NotNull GitVersion version) {
86       return SystemInfo.isWindows && version.isOlderOrEqual(new GitVersion(1, 7, 0, 2));
87     }
88   };
89
90   public abstract boolean existsIn(@NotNull GitVersion version);
91
92 }