mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Fixed parsing VCS package requirement specs without '#egg' (PY-7583)
This commit is contained in:
@@ -11,6 +11,8 @@ import com.intellij.util.Function;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.*;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
@@ -21,8 +23,9 @@ import java.util.regex.Pattern;
|
||||
public class PyRequirement {
|
||||
private static final Pattern NAME = Pattern.compile("\\s*(\\w(\\w|[-.])*)\\s*(.*)");
|
||||
private static final Pattern VERSION_SPEC = Pattern.compile("\\s*(<=?|>=?|==|!=)\\s*((\\w|[-.])+)");
|
||||
private static final Pattern EDITABLE_EGG = Pattern.compile("\\s*(-e)?\\s*([^#]*)#egg=(.*)");
|
||||
private static final Pattern EDITABLE_EGG = Pattern.compile("\\s*(-e)?\\s*([^#]*)(#egg=(.*))?");
|
||||
private static final Pattern RECURSIVE_REQUIREMENT = Pattern.compile("\\s*-r\\s+(.*)");
|
||||
private static final Pattern VCS_PATH = Pattern.compile(".*/([^@/]+)/?(@.*)?");
|
||||
|
||||
public enum Relation {
|
||||
LT("<"),
|
||||
@@ -257,9 +260,14 @@ public class PyRequirement {
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
PyRequirement that = (PyRequirement)o;
|
||||
|
||||
if (myEditable != that.myEditable) return false;
|
||||
if (!myName.equals(that.myName)) return false;
|
||||
if (myURL != null ? !myURL.equals(that.myURL) : that.myURL != null) return false;
|
||||
if (!myVersionSpecs.equals(that.myVersionSpecs)) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -267,6 +275,8 @@ public class PyRequirement {
|
||||
public int hashCode() {
|
||||
int result = myName.hashCode();
|
||||
result = 31 * result + myVersionSpecs.hashCode();
|
||||
result = 31 * result + (myURL != null ? myURL.hashCode() : 0);
|
||||
result = 31 * result + (myEditable ? 1 : 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -390,10 +400,35 @@ public class PyRequirement {
|
||||
}
|
||||
final boolean editable = editableEggMatcher.group(1) != null;
|
||||
final String url = editableEggMatcher.group(2);
|
||||
final String egg = editableEggMatcher.group(3);
|
||||
String egg = editableEggMatcher.group(4);
|
||||
if (url == null) {
|
||||
return null;
|
||||
}
|
||||
if (egg == null) {
|
||||
try {
|
||||
final URI uri = new URI(url);
|
||||
if (uri.getScheme() != null) {
|
||||
final String path = uri.getPath();
|
||||
if (path != null) {
|
||||
final Matcher vcsPathMatcher = VCS_PATH.matcher(path);
|
||||
if (!vcsPathMatcher.matches()) {
|
||||
return null;
|
||||
}
|
||||
egg = vcsPathMatcher.group(1);
|
||||
final String gitSuffix = ".git";
|
||||
if (egg.endsWith(gitSuffix)) {
|
||||
egg = egg.substring(0, egg.length() - gitSuffix.length());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (URISyntaxException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
if (egg == null) {
|
||||
return null;
|
||||
}
|
||||
boolean isName = true;
|
||||
final List<String> nameParts = new ArrayList<String>();
|
||||
final List<String> versionParts = new ArrayList<String>();
|
||||
|
||||
@@ -63,6 +63,22 @@ public class PyRequirementTest extends PyTestCase {
|
||||
PyRequirement.fromString("-e git://github.com/toastdriven/django-haystack.git#egg=django-haystack-dev"));
|
||||
}
|
||||
|
||||
// PY-7583
|
||||
public void testGitRequirementWithoutEggName() {
|
||||
assertEquals(new PyRequirement("django-haystack", null, "git://github.com/toastdriven/django-haystack.git@4fb267623b58", false),
|
||||
PyRequirement.fromString("git://github.com/toastdriven/django-haystack.git@4fb267623b58"));
|
||||
assertEquals(new PyRequirement("django-haystack", null, "git+git://github.com/toastdriven/django-haystack.git@4fb267623b58", false),
|
||||
PyRequirement.fromString("git+git://github.com/toastdriven/django-haystack.git@4fb267623b58"));
|
||||
assertEquals(new PyRequirement("django-haystack", null, "git+git://github.com/toastdriven/django-haystack.git@4fb267623b58", true),
|
||||
PyRequirement.fromString("-e git+git://github.com/toastdriven/django-haystack.git@4fb267623b58"));
|
||||
assertEquals(new PyRequirement("django-haystack", null, "git+git://github.com/toastdriven/django-haystack.git", false),
|
||||
PyRequirement.fromString("git+git://github.com/toastdriven/django-haystack.git"));
|
||||
assertEquals(new PyRequirement("django-piston", null, "hg+ssh://hg@bitbucket.org/jespern/django-piston", false),
|
||||
PyRequirement.fromString("hg+ssh://hg@bitbucket.org/jespern/django-piston"));
|
||||
assertEquals(new PyRequirement("django-piston", null, "hg+ssh://hg@bitbucket.org/jespern/django-piston/", false),
|
||||
PyRequirement.fromString("hg+ssh://hg@bitbucket.org/jespern/django-piston/"));
|
||||
}
|
||||
|
||||
private static <T> List<T> list(T... xs) {
|
||||
return Arrays.asList(xs);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user