merge feed reader api
authorEugene Petrenko <eugene.petrenko@gmail.com>
Fri, 12 Aug 2011 15:51:33 +0000 (19:51 +0400)
committerEugene Petrenko <eugene.petrenko@gmail.com>
Fri, 12 Aug 2011 15:51:33 +0000 (19:51 +0400)
Conflicts:
nuget-server/nuget-server.iml
nuget-server/src/META-INF/build-server-plugin-nuget.xml

32 files changed:
.idea/artifacts/plugin.xml
.idea/libraries/commons_http.xml [new file with mode: 0644]
lib/httpcomponents-client/commons-codec-1.4.jar [new file with mode: 0644]
lib/httpcomponents-client/httpclient-4.1.2.jar [new file with mode: 0644]
lib/httpcomponents-client/httpclient-cache-4.1.2.jar [new file with mode: 0644]
lib/httpcomponents-client/httpcore-4.1.2.jar [new file with mode: 0644]
lib/httpcomponents-client/httpmime-4.1.2.jar [new file with mode: 0644]
lib/httpcomponents-client/src/httpcomponents-client-4.1.2-src.zip [new file with mode: 0644]
lib/httpcomponents-client/src/httpcomponents-core-4.1.2-src.zip [new file with mode: 0644]
nuget-server/nuget-server.iml
nuget-server/src/META-INF/build-server-plugin-nuget.xml
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/FeedConstants.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/FeedPackage.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/NuGetFeedReader.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/FeedClient.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/FeedGetMethodFactory.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/FeedHttpClientHolder.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/NuGetFeedReaderImpl.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/PackagesFeedParser.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/PackagesFeedParserImpl.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/Param.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/UrlResolver.java [new file with mode: 0644]
nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/UrlResolverImpl.java [new file with mode: 0644]
nuget-tests/nuget-tests.iml
nuget-tests/src/jetbrains/buildServer/nuget/tests/integration/FeedReaderTest.java [new file with mode: 0644]
nuget-tests/src/jetbrains/buildServer/nuget/tests/server/feed/reader/FeedGetMethodFactoryTest.java [new file with mode: 0644]
nuget-tests/src/jetbrains/buildServer/nuget/tests/server/feed/reader/FeedPackagesParserTest.java [new file with mode: 0644]
nuget-tests/src/jetbrains/buildServer/nuget/tests/server/feed/reader/UrlResolverTest.java [new file with mode: 0644]
nuget-tests/src/testng-nuget-fast.xml
nuget-tests/src/testng-nuget-integration.xml
nuget-tests/testData/feed/reader/feed-one.xml [new file with mode: 0644]
nuget-tests/testData/feed/reader/feed-response.xml [new file with mode: 0644]

index 1421f277caaf5a8b7e342995472f0009dfacb84b..0ef1af0d2662c630a99dbffc448c57cf3a60e707 100644 (file)
@@ -31,6 +31,7 @@
             <element id="dir-copy" path="$PROJECT_DIR$/nuget-server/resources" />\r
           </element>\r
         </element>\r
+        <element id="library" level="project" name="commons-http" />\r
       </element>\r
       <element id="file-copy" path="$PROJECT_DIR$/nuget-server/teamcity-server-plugin.xml" output-file-name="teamcity-plugin.xml" />\r
       <element id="directory" name="bin">\r
diff --git a/.idea/libraries/commons_http.xml b/.idea/libraries/commons_http.xml
new file mode 100644 (file)
index 0000000..e02ee9b
--- /dev/null
@@ -0,0 +1,23 @@
+<component name="libraryTable">\r
+  <library name="commons-http">\r
+    <CLASSES>\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/httpclient-cache-4.1.2.jar!/" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/httpclient-4.1.2.jar!/" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/httpcore-4.1.2.jar!/" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/httpmime-4.1.2.jar!/" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/commons-codec-1.4.jar!/" />\r
+    </CLASSES>\r
+    <JAVADOC />\r
+    <SOURCES>\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/src/httpcomponents-client-4.1.2-src.zip!/httpcomponents-client-4.1.2/httpmime/src/main/java" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/src/httpcomponents-client-4.1.2-src.zip!/httpcomponents-client-4.1.2/httpclient-contrib/src/main/java" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/src/httpcomponents-client-4.1.2-src.zip!/httpcomponents-client-4.1.2/httpclient-benchmark/src/main/java" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/src/httpcomponents-client-4.1.2-src.zip!/httpcomponents-client-4.1.2/httpclient/src/main/java" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/src/httpcomponents-core-4.1.2-src.zip!/httpcomponents-core-4.1.2/httpcore/src/main/java" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/src/httpcomponents-core-4.1.2-src.zip!/httpcomponents-core-4.1.2/httpcore-nio/src/main/java" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/src/httpcomponents-core-4.1.2-src.zip!/httpcomponents-core-4.1.2/httpcore-contrib/src/main/java" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/src/httpcomponents-core-4.1.2-src.zip!/httpcomponents-core-4.1.2/httpcore-benchmark/src/main/java" />\r
+      <root url="jar://$PROJECT_DIR$/lib/httpcomponents-client/src/httpcomponents-core-4.1.2-src.zip!/httpcomponents-core-4.1.2/httpcore-ab/src/main/java" />\r
+    </SOURCES>\r
+  </library>\r
+</component>
\ No newline at end of file
diff --git a/lib/httpcomponents-client/commons-codec-1.4.jar b/lib/httpcomponents-client/commons-codec-1.4.jar
new file mode 100644 (file)
index 0000000..458d432
Binary files /dev/null and b/lib/httpcomponents-client/commons-codec-1.4.jar differ
diff --git a/lib/httpcomponents-client/httpclient-4.1.2.jar b/lib/httpcomponents-client/httpclient-4.1.2.jar
new file mode 100644 (file)
index 0000000..b3cdb4c
Binary files /dev/null and b/lib/httpcomponents-client/httpclient-4.1.2.jar differ
diff --git a/lib/httpcomponents-client/httpclient-cache-4.1.2.jar b/lib/httpcomponents-client/httpclient-cache-4.1.2.jar
new file mode 100644 (file)
index 0000000..6b7bcce
Binary files /dev/null and b/lib/httpcomponents-client/httpclient-cache-4.1.2.jar differ
diff --git a/lib/httpcomponents-client/httpcore-4.1.2.jar b/lib/httpcomponents-client/httpcore-4.1.2.jar
new file mode 100644 (file)
index 0000000..66ae90b
Binary files /dev/null and b/lib/httpcomponents-client/httpcore-4.1.2.jar differ
diff --git a/lib/httpcomponents-client/httpmime-4.1.2.jar b/lib/httpcomponents-client/httpmime-4.1.2.jar
new file mode 100644 (file)
index 0000000..eea3b3f
Binary files /dev/null and b/lib/httpcomponents-client/httpmime-4.1.2.jar differ
diff --git a/lib/httpcomponents-client/src/httpcomponents-client-4.1.2-src.zip b/lib/httpcomponents-client/src/httpcomponents-client-4.1.2-src.zip
new file mode 100644 (file)
index 0000000..f13d3d6
Binary files /dev/null and b/lib/httpcomponents-client/src/httpcomponents-client-4.1.2-src.zip differ
diff --git a/lib/httpcomponents-client/src/httpcomponents-core-4.1.2-src.zip b/lib/httpcomponents-client/src/httpcomponents-core-4.1.2-src.zip
new file mode 100644 (file)
index 0000000..1595f39
Binary files /dev/null and b/lib/httpcomponents-client/src/httpcomponents-core-4.1.2-src.zip differ
index 36c800563f2f7658d4a02937f9a4b200af7e457b..dc8180215bb7a0d392f81c45f7be404ec77508b8 100644 (file)
@@ -39,6 +39,7 @@
     <orderEntry type="module" module-name="nuget-common" />\r
     <orderEntry type="library" name="Common-Impl" level="project" />\r
     <orderEntry type="library" name="TeamCity server runtime" level="project" />\r
+    <orderEntry type="library" name="commons-http" level="project" />\r
   </component>\r
 </module>\r
 \r
index 61359ed61a4233e5c62bef8a24c32201f30731c1..7ed537ef34e84c18ef2ee7846e1e80455232fe30 100644 (file)
@@ -32,6 +32,7 @@
   <bean class="jetbrains.buildServer.nuget.server.publish.PublishRunType"/>\r
 \r
 \r
+
   <bean class="jetbrains.buildServer.nuget.server.toolRegistry.tab.PermissionChecker"/>\r
   <bean class="jetbrains.buildServer.nuget.server.toolRegistry.tab.ServerSettingsTab"/>\r
   <bean class="jetbrains.buildServer.nuget.server.toolRegistry.tab.InstalledToolsController"/>\r
 \r
 \r
   <bean class="jetbrains.buildServer.nuget.server.toolRegistry.impl.NuGetToolManagerImpl"/>\r
+
+
+
+  <bean class="jetbrains.buildServer.nuget.server.feed.reader.impl.FeedHttpClientHolder" destroy-method="dispose"/>\r
+  <bean class="jetbrains.buildServer.nuget.server.feed.reader.impl.NuGetFeedReaderImpl"/>\r
+  <bean class="jetbrains.buildServer.nuget.server.feed.reader.impl.FeedGetMethodFactory"/>\r
+  <bean class="jetbrains.buildServer.nuget.server.feed.reader.impl.PackagesFeedParserImpl"/>\r
+  <bean class="jetbrains.buildServer.nuget.server.feed.reader.impl.UrlResolverImpl"/>\r
+
 </beans>
\ No newline at end of file
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/FeedConstants.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/FeedConstants.java
new file mode 100644 (file)
index 0000000..b51bff4
--- /dev/null
@@ -0,0 +1,26 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 11.08.11 16:04\r
+ */\r
+public class FeedConstants {\r
+  public static final String FEED_URL = "https://go.microsoft.com/fwlink/?LinkID=206669";\r
+  public static final String NUGET_COMMANDLINE = "NuGet.CommandLine";\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/FeedPackage.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/FeedPackage.java
new file mode 100644 (file)
index 0000000..7d0ed8d
--- /dev/null
@@ -0,0 +1,97 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader;\r
+\r
+import jetbrains.buildServer.nuget.common.PackageInfo;\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 13:43\r
+ */\r
+public class FeedPackage implements Comparable<FeedPackage>{\r
+  private final String myAtomId;\r
+  private final PackageInfo myInfo;\r
+  private final boolean myLatestVersion;\r
+  private final String myDescription;\r
+\r
+  private final String myDownloadUrl;\r
+\r
+  public FeedPackage(@NotNull String atomId,\r
+                     @NotNull PackageInfo info,\r
+                     boolean latestVersion,\r
+                     @NotNull String description,\r
+                     @NotNull String downloadUrl) {\r
+    myAtomId = atomId;\r
+    myInfo = info;\r
+    myLatestVersion = latestVersion;\r
+    myDescription = description;\r
+    myDownloadUrl = downloadUrl;\r
+  }\r
+\r
+  @NotNull\r
+  public String getAtomId() {\r
+    return myAtomId;\r
+  }\r
+\r
+  @NotNull\r
+  public PackageInfo getInfo() {\r
+    return myInfo;\r
+  }\r
+\r
+  public boolean isLatestVersion() {\r
+    return myLatestVersion;\r
+  }\r
+\r
+  @NotNull\r
+  public String getDescription() {\r
+    return myDescription;\r
+  }\r
+\r
+  @NotNull\r
+  public String getDownloadUrl() {\r
+    return myDownloadUrl;\r
+  }\r
+\r
+  @Override\r
+  public boolean equals(Object o) {\r
+    if (this == o) return true;\r
+    if (o == null || getClass() != o.getClass()) return false;\r
+    FeedPackage that = (FeedPackage) o;\r
+    return myInfo.equals(that.myInfo);\r
+  }\r
+\r
+  @Override\r
+  public int hashCode() {\r
+    return myInfo.hashCode();\r
+  }\r
+\r
+  public int compareTo(@NotNull FeedPackage o) {\r
+    return myInfo.compareTo(o.myInfo);\r
+  }\r
+\r
+  @Override\r
+  public String toString() {\r
+    return "FeedPackage{" +\r
+            "myAtomId='" + myAtomId + '\'' +\r
+            ", myInfo=" + myInfo +\r
+            ", myLatestVersion=" + myLatestVersion +\r
+            ", myDescription='" + myDescription + '\'' +\r
+            ", myDownloadUrl='" + myDownloadUrl + '\'' +\r
+            '}';\r
+  }\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/NuGetFeedReader.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/NuGetFeedReader.java
new file mode 100644 (file)
index 0000000..3772508
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader;\r
+\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.util.Collection;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 14:46\r
+ */\r
+public interface NuGetFeedReader {\r
+  @NotNull\r
+  Collection<FeedPackage> queryPackageVersions(@NotNull String feedUrl,\r
+                                               @NotNull String packageId) throws IOException;\r
+\r
+  void downloadPackage(@NotNull FeedPackage pkg,\r
+                       @NotNull File destFile) throws IOException;\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/FeedClient.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/FeedClient.java
new file mode 100644 (file)
index 0000000..aa8f0f4
--- /dev/null
@@ -0,0 +1,32 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader.impl;\r
+\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.client.methods.HttpUriRequest;\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+import java.io.IOException;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 15:13\r
+ */\r
+public interface FeedClient {\r
+  @NotNull\r
+  HttpResponse execute(@NotNull HttpUriRequest request) throws IOException;\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/FeedGetMethodFactory.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/FeedGetMethodFactory.java
new file mode 100644 (file)
index 0000000..2e0a77d
--- /dev/null
@@ -0,0 +1,45 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader.impl;\r
+\r
+import org.apache.http.HttpVersion;\r
+import org.apache.http.NameValuePair;\r
+import org.apache.http.client.methods.HttpGet;\r
+import org.apache.http.client.utils.URLEncodedUtils;\r
+import org.apache.http.params.HttpProtocolParams;\r
+import org.apache.http.protocol.HTTP;\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+import java.util.Arrays;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 12:28\r
+ */\r
+public class FeedGetMethodFactory {\r
+  @NotNull\r
+  public HttpGet createGet(@NotNull final String url, NameValuePair... getParams) {\r
+    String argz = URLEncodedUtils.format(Arrays.asList(getParams), HTTP.ISO_8859_1);\r
+    if (argz.length() > 0) {\r
+      argz = (url.contains("?") ? "&" : "?") + argz;\r
+    }\r
+    final HttpGet get = new HttpGet(url + argz);\r
+    HttpProtocolParams.setVersion(get.getParams(), HttpVersion.HTTP_1_1);\r
+\r
+    return get;\r
+  }\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/FeedHttpClientHolder.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/FeedHttpClientHolder.java
new file mode 100644 (file)
index 0000000..9e251c2
--- /dev/null
@@ -0,0 +1,59 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader.impl;\r
+\r
+import jetbrains.buildServer.version.ServerVersionHolder;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.client.HttpClient;\r
+import org.apache.http.client.methods.HttpUriRequest;\r
+import org.apache.http.impl.client.DefaultHttpClient;\r
+import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;\r
+import org.apache.http.params.HttpConnectionParams;\r
+import org.apache.http.params.HttpParams;\r
+import org.apache.http.params.HttpProtocolParams;\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+import java.io.IOException;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 11.08.11 16:24\r
+ */\r
+public class FeedHttpClientHolder implements FeedClient {\r
+  private final HttpClient myClient;\r
+\r
+  public FeedHttpClientHolder() {\r
+    myClient = new DefaultHttpClient(new ThreadSafeClientConnManager());\r
+    final HttpParams params = myClient.getParams();\r
+\r
+    HttpConnectionParams.setConnectionTimeout(params, 10000);\r
+    HttpConnectionParams.setSoTimeout(params, 10000);\r
+\r
+    final String serverVersion = ServerVersionHolder.getVersion().getDisplayVersion();\r
+    HttpProtocolParams.setUserAgent(params, "JetBrains TeamCity " + serverVersion);\r
+  }\r
+\r
+  @NotNull\r
+  public HttpResponse execute(@NotNull HttpUriRequest request) throws IOException {\r
+    return myClient.execute(request);\r
+  }\r
+\r
+  public void dispose() {\r
+    myClient.getConnectionManager().shutdown();\r
+  }\r
+\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/NuGetFeedReaderImpl.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/NuGetFeedReaderImpl.java
new file mode 100644 (file)
index 0000000..55e795c
--- /dev/null
@@ -0,0 +1,109 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader.impl;\r
+\r
+import com.intellij.openapi.diagnostic.Logger;\r
+import com.intellij.openapi.util.Pair;\r
+import jetbrains.buildServer.nuget.server.feed.reader.*;\r
+import jetbrains.buildServer.util.FileUtil;\r
+import jetbrains.buildServer.util.XmlUtil;\r
+import org.apache.http.HttpHeaders;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.HttpStatus;\r
+import org.apache.http.StatusLine;\r
+import org.apache.http.client.methods.HttpGet;\r
+import org.jdom.Element;\r
+import org.jdom.JDOMException;\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+import java.io.*;\r
+import java.util.Collection;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 11.08.11 15:42\r
+ */\r
+public class NuGetFeedReaderImpl implements NuGetFeedReader {\r
+  private static final Logger LOG = Logger.getInstance(NuGetFeedReader.class.getName());\r
+  private final FeedClient myClient;\r
+  private final UrlResolver myResolver;\r
+  private final FeedGetMethodFactory myMethodFactory;\r
+  private final PackagesFeedParser myParser;\r
+\r
+  public NuGetFeedReaderImpl(@NotNull final FeedClient client,\r
+                             @NotNull final UrlResolver resolver,\r
+                             @NotNull final FeedGetMethodFactory methodFactory,\r
+                             @NotNull final PackagesFeedParser parser) {\r
+    myClient = client;\r
+    myResolver = resolver;\r
+    myMethodFactory = methodFactory;\r
+    myParser = parser;\r
+  }\r
+\r
+  @NotNull\r
+  public Collection<FeedPackage> queryPackageVersions(@NotNull String feedUrl,\r
+                                                      @NotNull String packageId) throws IOException {\r
+    LOG.debug("Connecting to NuGet feed url: " + feedUrl);\r
+    final Pair<String, HttpResponse> pair = myResolver.resolvePath(feedUrl);\r
+    feedUrl = pair.first;\r
+    LOG.debug("Resolved NuGet feed URL to " + feedUrl);\r
+    final Element element = toDocument(pair.second);\r
+    LOG.debug("Recieved xml: " + XmlUtil.to_s(element));\r
+\r
+    final HttpGet get = myMethodFactory.createGet(feedUrl + "/Packages()",\r
+            new Param("$filter", "Id eq '" + packageId + "'")\r
+    );\r
+    get.setHeader(HttpHeaders.ACCEPT_ENCODING, "application/atom+xml");\r
+\r
+    LOG.debug("Query for packages: " + get.getURI());\r
+\r
+    final HttpResponse execute = myClient.execute(get);\r
+    return myParser.readPackages(toDocument(execute));\r
+  }\r
+\r
+  public void downloadPackage(@NotNull FeedPackage pkg, @NotNull File file) throws IOException {\r
+    FileUtil.createParentDirs(file);\r
+    final String url = pkg.getDownloadUrl();\r
+\r
+    final HttpGet get = myMethodFactory.createGet(url);\r
+    final HttpResponse resp = myClient.execute(get);\r
+    final StatusLine statusLine = resp.getStatusLine();\r
+    if (statusLine.getStatusCode() != HttpStatus.SC_OK) {\r
+      throw new IOException("Failed to download package " + pkg + ". Server returned " + statusLine);\r
+    }\r
+\r
+    OutputStream os = null;\r
+    try {\r
+      os = new BufferedOutputStream(new FileOutputStream(file));\r
+      resp.getEntity().writeTo(os);\r
+    } catch (final IOException e) {\r
+      throw new IOException("Failed to download package " + pkg + ". " + e.getMessage()) {{ initCause(e); }};\r
+    } finally {\r
+      FileUtil.close(os);\r
+    }\r
+  }\r
+\r
+  private Element toDocument(HttpResponse response) throws IOException {\r
+    try {\r
+      return FileUtil.parseDocument(response.getEntity().getContent(), false);\r
+    } catch (final JDOMException e) {\r
+      throw new IOException("Failed to parse xml document. " + e.getMessage()) {{\r
+        initCause(e);\r
+      }};\r
+    }\r
+  }\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/PackagesFeedParser.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/PackagesFeedParser.java
new file mode 100644 (file)
index 0000000..208e807
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader.impl;\r
+\r
+import jetbrains.buildServer.nuget.server.feed.reader.FeedPackage;\r
+import org.jdom.Element;\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+import java.util.Collection;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 15:14\r
+ */\r
+public interface PackagesFeedParser {\r
+  Collection<FeedPackage> readPackages(@NotNull Element root);\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/PackagesFeedParserImpl.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/PackagesFeedParserImpl.java
new file mode 100644 (file)
index 0000000..88b1bde
--- /dev/null
@@ -0,0 +1,132 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader.impl;\r
+\r
+import com.intellij.openapi.diagnostic.Logger;\r
+import jetbrains.buildServer.nuget.common.PackageInfo;\r
+import jetbrains.buildServer.nuget.server.feed.reader.FeedPackage;\r
+import jetbrains.buildServer.util.StringUtil;\r
+import org.jdom.Element;\r
+import org.jdom.Namespace;\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 13:42\r
+ */\r
+public class PackagesFeedParserImpl implements PackagesFeedParser {\r
+  private static final Logger LOG = Logger.getInstance(PackagesFeedParserImpl.class.getName());\r
+\r
+  private static final Namespace atom = Namespace.getNamespace("http://www.w3.org/2005/Atom");\r
+  private static final Namespace metadata = Namespace.getNamespace("http://schemas.microsoft.com/ado/2007/08/dataservices/metadata");\r
+  private static final Namespace services = Namespace.getNamespace("http://schemas.microsoft.com/ado/2007/08/dataservices");\r
+\r
+  public Collection<FeedPackage> readPackages(@NotNull Element root) {\r
+    final List<FeedPackage> result = new ArrayList<FeedPackage>();\r
+\r
+    final List entries = root.getChildren("entry", atom);\r
+    for (Object o : entries) {\r
+      final Element entry = (Element) o;\r
+      try {\r
+        final FeedPackage e = parseOneEntry(entry);\r
+        result.add(e);\r
+      } catch (InvalidXmlException e) {\r
+        LOG.debug("Failed to parse feed entry. " + e.getMessage());\r
+      }\r
+    }\r
+    Collections.sort(result);\r
+    return result;\r
+  }\r
+\r
+  @NotNull\r
+  private FeedPackage parseOneEntry(Element entry) throws InvalidXmlException {\r
+    final Element atomIdElement = getChild(entry, "id", atom);\r
+    final String atomId = atomIdElement.getText();\r
+\r
+    final String content = getChildAttribute(entry, "content", atom, "src");\r
+    final Element props = getChild(entry, "properties", metadata);\r
+\r
+    final String packageId = getChildText(props, "Id", services);\r
+    final String version = getChildText(props, "Version", services);\r
+    final String desription = getChildText(props, "Description", services);\r
+    final String summary = getChildText(props, "Summary", services);\r
+    final boolean isLatestVersion = "true".equalsIgnoreCase(getChildTextSafe(props, "IsLatestVersion", services));\r
+\r
+    return new FeedPackage(\r
+            atomId,\r
+            new PackageInfo(packageId, version),\r
+            isLatestVersion,\r
+            StringUtil.isEmptyOrSpaces(desription) ? summary : desription,\r
+            content);\r
+  }\r
+\r
+  @NotNull\r
+  private String getChildTextSafe(@NotNull Element element,\r
+                                  @NotNull String name,\r
+                                  @NotNull Namespace ns) {\r
+    try {\r
+      return getChildText(element, name, ns);\r
+    } catch (InvalidXmlException e) {\r
+      return "";\r
+    }\r
+  }\r
+\r
+  @NotNull\r
+  private String getChildText(@NotNull Element element,\r
+                              @NotNull String name,\r
+                              @NotNull Namespace ns) throws InvalidXmlException {\r
+    final Element data = getChild(element, name, ns);\r
+    final String text = data.getText();\r
+    if (StringUtil.isEmptyOrSpaces(text)) {\r
+      throw new InvalidXmlException("Element " + name + " must have a content. ");\r
+    }\r
+    return text;\r
+  }\r
+\r
+  @NotNull\r
+  private String getChildAttribute(@NotNull Element element,\r
+                                   @NotNull String name,\r
+                                   @NotNull Namespace ns,\r
+                                   @NotNull String attribute) throws InvalidXmlException {\r
+    final Element data = getChild(element, name, ns);\r
+    final String text = data.getAttributeValue(attribute);\r
+    if (StringUtil.isEmptyOrSpaces(text)) {\r
+      throw new InvalidXmlException("Element " + name + " must have non-empty attribute " + attribute + ". ");\r
+    }\r
+    return text;\r
+  }\r
+\r
+  @NotNull\r
+  private Element getChild(Element element, String name, Namespace ns) throws InvalidXmlException {\r
+    final Element data = element.getChild(name, ns);\r
+    if (data == null) {\r
+      throw new InvalidXmlException("Element " + name + " was not found. ");\r
+    }\r
+    return data;\r
+  }\r
+\r
+  private static class InvalidXmlException extends Exception {\r
+    private InvalidXmlException(String message) {\r
+      super(message);\r
+    }\r
+  }\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/Param.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/Param.java
new file mode 100644 (file)
index 0000000..1e49539
--- /dev/null
@@ -0,0 +1,43 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader.impl;\r
+\r
+import org.apache.http.NameValuePair;\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+/**\r
+* Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+* Date: 12.08.11 12:50\r
+*/\r
+public class Param implements NameValuePair {\r
+  private final String myName;\r
+  private final String myValue;\r
+\r
+  public Param(@NotNull final String name, @NotNull final String value) {\r
+    myName = name;\r
+    myValue = value;\r
+  }\r
+\r
+  public String getName() {\r
+    return myName;\r
+  }\r
+\r
+  @NotNull\r
+  public String getValue() {\r
+    return myValue;\r
+  }\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/UrlResolver.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/UrlResolver.java
new file mode 100644 (file)
index 0000000..3aac7c6
--- /dev/null
@@ -0,0 +1,32 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader.impl;\r
+\r
+import com.intellij.openapi.util.Pair;\r
+import org.apache.http.HttpResponse;\r
+import org.jetbrains.annotations.NotNull;\r
+\r
+import java.io.IOException;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 15:15\r
+ */\r
+public interface UrlResolver {\r
+  @NotNull\r
+  Pair<String, HttpResponse> resolvePath(@NotNull String feedUrl) throws IOException;\r
+}\r
diff --git a/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/UrlResolverImpl.java b/nuget-server/src/jetbrains/buildServer/nuget/server/feed/reader/impl/UrlResolverImpl.java
new file mode 100644 (file)
index 0000000..256113c
--- /dev/null
@@ -0,0 +1,108 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.server.feed.reader.impl;\r
+\r
+import com.intellij.openapi.diagnostic.Logger;\r
+import com.intellij.openapi.util.Pair;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.HttpStatus;\r
+import org.apache.http.ProtocolException;\r
+import org.apache.http.client.RedirectStrategy;\r
+import org.apache.http.client.methods.HttpGet;\r
+import org.apache.http.client.methods.HttpUriRequest;\r
+import org.apache.http.client.params.ClientPNames;\r
+import org.apache.http.impl.client.DefaultRedirectStrategy;\r
+import org.apache.http.protocol.BasicHttpContext;\r
+import org.apache.http.protocol.HttpContext;\r
+import org.jetbrains.annotations.NotNull;\r
+import org.jetbrains.annotations.Nullable;\r
+\r
+import java.io.IOException;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 10:24\r
+ */\r
+public class UrlResolverImpl implements UrlResolver {\r
+  private static final Logger LOG = Logger.getInstance(UrlResolverImpl.class.getName());\r
+\r
+  private final FeedClient myClient;\r
+  private final FeedGetMethodFactory myMethods;\r
+\r
+  public UrlResolverImpl(@NotNull final FeedClient client,\r
+                         @NotNull final FeedGetMethodFactory methods) {\r
+    myClient = client;\r
+    myMethods = methods;\r
+  }\r
+\r
+  /**\r
+   * Generates GET request to a given URL.\r
+   * If HTTP Status 3xx is returned, Location header is\r
+   * used to generate next request unless non 3xx status\r
+   * is returned\r
+   * @param feedUrl url to ping and resolve\r
+   * @return resolved URL and HttpResponse\r
+   * @throws IOException if failed to communicate or non 3xx or 200 status returned\r
+   */\r
+  @NotNull\r
+  public Pair<String, HttpResponse> resolvePath(@NotNull String feedUrl) throws IOException {\r
+    for(int _ = 100; _-->0;) {\r
+      HttpGet ping = myMethods.createGet(feedUrl);\r
+      ping.getParams().setBooleanParameter(ClientPNames.HANDLE_REDIRECTS, false);\r
+\r
+      final HttpResponse execute = myClient.execute(ping);\r
+\r
+      String redirected = getRedirectedUrl(ping, execute);\r
+      if (redirected != null) {\r
+        LOG.debug("Redirected to " + redirected);\r
+        feedUrl = redirected;\r
+        continue;\r
+      }\r
+\r
+      final int statusCode = execute.getStatusLine().getStatusCode();\r
+      if (statusCode != HttpStatus.SC_OK) {\r
+        throw new IOException("Failed to connect to " + feedUrl);\r
+      }\r
+      return Pair.create(feedUrl, execute);\r
+    }\r
+    throw new IOException("Failed to resolve redirects");\r
+  }\r
+\r
+  private HttpContext createContext() {\r
+    return new BasicHttpContext();\r
+  }\r
+\r
+  @NotNull\r
+  public RedirectStrategy getRedirectStrategy() {\r
+    //TODO: could use http client for that\r
+    return new DefaultRedirectStrategy();\r
+  }\r
+\r
+  @Nullable\r
+  public String getRedirectedUrl(@NotNull HttpUriRequest request, @NotNull HttpResponse response) throws IOException {\r
+    try {\r
+      final RedirectStrategy redirectStrategy = getRedirectStrategy();\r
+      if (!redirectStrategy.isRedirected(request,response, createContext())) {\r
+        return null;\r
+      }\r
+\r
+      return redirectStrategy.getRedirect(request, response, createContext()).getURI().toString();\r
+    } catch (ProtocolException e) {\r
+      return null;\r
+    }\r
+  }\r
+}\r
index 88001f85eb1e41599d07355af3c7d112a5984db0..cb909629b8052fa06878e0dfca0ce5a8149e243a 100644 (file)
@@ -22,6 +22,7 @@
     <orderEntry type="library" scope="RUNTIME" name="TeamCity agent runtime" level="project" />\r
     <orderEntry type="library" name="Common-Impl" level="project" />\r
     <orderEntry type="library" name="Server-Api" level="project" />\r
+    <orderEntry type="library" name="commons-http" level="project" />\r
   </component>\r
 </module>\r
 \r
diff --git a/nuget-tests/src/jetbrains/buildServer/nuget/tests/integration/FeedReaderTest.java b/nuget-tests/src/jetbrains/buildServer/nuget/tests/integration/FeedReaderTest.java
new file mode 100644 (file)
index 0000000..6f19462
--- /dev/null
@@ -0,0 +1,106 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.tests.integration;\r
+\r
+import jetbrains.buildServer.BaseTestCase;\r
+import jetbrains.buildServer.nuget.server.feed.reader.FeedConstants;\r
+import jetbrains.buildServer.nuget.server.feed.reader.FeedPackage;\r
+import jetbrains.buildServer.nuget.server.feed.reader.NuGetFeedReader;\r
+import jetbrains.buildServer.nuget.server.feed.reader.impl.*;\r
+import jetbrains.buildServer.util.FileUtil;\r
+import org.testng.Assert;\r
+import org.testng.annotations.AfterMethod;\r
+import org.testng.annotations.BeforeMethod;\r
+import org.testng.annotations.Test;\r
+\r
+import java.io.BufferedInputStream;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.IOException;\r
+import java.util.Collection;\r
+import java.util.zip.ZipEntry;\r
+import java.util.zip.ZipInputStream;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 11.08.11 16:04\r
+ */\r
+public class FeedReaderTest extends BaseTestCase {\r
+  private NuGetFeedReader myReader;\r
+  private FeedHttpClientHolder myClient;\r
+\r
+  @BeforeMethod\r
+  @Override\r
+  protected void setUp() throws Exception {\r
+    super.setUp();\r
+    myClient = new FeedHttpClientHolder();\r
+    final FeedGetMethodFactory methods = new FeedGetMethodFactory();\r
+    myReader = new NuGetFeedReaderImpl(myClient, new UrlResolverImpl(myClient, methods), methods, new PackagesFeedParserImpl());\r
+  }\r
+\r
+  @AfterMethod\r
+  @Override\r
+  protected void tearDown() throws Exception {\r
+    super.tearDown();\r
+    myClient.dispose();\r
+  }\r
+\r
+  @Test\r
+  public void testRead() throws IOException {\r
+    final Collection<FeedPackage> feedPackages = myReader.queryPackageVersions(FeedConstants.FEED_URL, "NuGet.CommandLine");\r
+    Assert.assertTrue(feedPackages.size() > 0);\r
+\r
+    boolean hasLatest = false;\r
+    for (FeedPackage feedPackage : feedPackages) {\r
+      Assert.assertFalse(hasLatest && feedPackage.isLatestVersion(), "There could be only one latest");\r
+      hasLatest |= feedPackage.isLatestVersion();\r
+      System.out.println("feedPackage = " + feedPackage);\r
+    }\r
+  }\r
+\r
+  @Test\r
+  public void testDownloadLatest() throws IOException {\r
+    final Collection<FeedPackage> packages = myReader.queryPackageVersions(FeedConstants.FEED_URL, "NuGet.CommandLine");\r
+    FeedPackage latest = null;\r
+    for (FeedPackage aPackage : packages) {\r
+      if (aPackage.isLatestVersion()) {\r
+        latest = aPackage;\r
+      }\r
+    }\r
+    Assert.assertNotNull(latest, "there should be the latest package");\r
+\r
+    final File pkd = createTempFile();\r
+    myReader.downloadPackage(latest, pkd);\r
+\r
+    Assert.assertTrue(pkd.length() > 100);\r
+    boolean hasNuGetExe = false;\r
+    ZipInputStream zip = new ZipInputStream(new BufferedInputStream(new FileInputStream(pkd)));\r
+    try {\r
+      for (ZipEntry ze = zip.getNextEntry(); ze != null; ze = zip.getNextEntry()) {\r
+        String name = ze.getName();\r
+        System.out.println("ze = " + name);\r
+        name = name.toLowerCase();\r
+        hasNuGetExe |= name.endsWith("/NuGet.exe".toLowerCase());\r
+        hasNuGetExe |= name.endsWith("\\NuGet.exe".toLowerCase());\r
+      }\r
+    } finally {\r
+      FileUtil.close(zip);\r
+    }\r
+\r
+    Assert.assertTrue(hasNuGetExe, "package should contain nuget.exe");\r
+  }\r
+}\r
diff --git a/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/feed/reader/FeedGetMethodFactoryTest.java b/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/feed/reader/FeedGetMethodFactoryTest.java
new file mode 100644 (file)
index 0000000..c424fa4
--- /dev/null
@@ -0,0 +1,77 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.tests.server.feed.reader;\r
+\r
+import jetbrains.buildServer.BaseTestCase;\r
+import jetbrains.buildServer.nuget.server.feed.reader.impl.FeedGetMethodFactory;\r
+import jetbrains.buildServer.nuget.server.feed.reader.impl.Param;\r
+import org.apache.http.client.methods.HttpGet;\r
+import org.testng.Assert;\r
+import org.testng.annotations.BeforeMethod;\r
+import org.testng.annotations.Test;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 15:19\r
+ */\r
+public class FeedGetMethodFactoryTest extends BaseTestCase {\r
+  private FeedGetMethodFactory myFactory;\r
+\r
+\r
+  @BeforeMethod\r
+  @Override\r
+  protected void setUp() throws Exception {\r
+    super.setUp();\r
+    myFactory = new FeedGetMethodFactory();\r
+  }\r
+\r
+  @Test\r
+  public void test_emptyParams() {\r
+    final HttpGet get = myFactory.createGet("http://jetbrais.com");\r
+    Assert.assertEquals(get.getURI().toString(), "http://jetbrais.com");\r
+  }\r
+\r
+  @Test\r
+  public void test_withParams() {\r
+    final HttpGet get = myFactory.createGet("http://jetbrais.com?aaa=bbb");\r
+    Assert.assertEquals(get.getURI().toString(), "http://jetbrais.com?aaa=bbb");\r
+  }\r
+\r
+  @Test\r
+  public void test_withParams2() {\r
+    final HttpGet get = myFactory.createGet("http://jetbrais.com?aaa=bbb", new Param("qqq","ppp"));\r
+    Assert.assertEquals(get.getURI().toString(), "http://jetbrais.com?aaa=bbb&qqq=ppp");\r
+  }\r
+\r
+  @Test\r
+  public void test_withParams3() {\r
+    final HttpGet get = myFactory.createGet("http://jetbrais.com?aaa=bbb", new Param("qqq","ppp"), new Param("www","ttt"));\r
+    Assert.assertEquals(get.getURI().toString(), "http://jetbrais.com?aaa=bbb&qqq=ppp&www=ttt");\r
+  }\r
+\r
+  @Test\r
+  public void test_withParams4() {\r
+    final HttpGet get = myFactory.createGet("http://jetbrais.com", new Param("qqq","ppp"), new Param("www","ttt"));\r
+    Assert.assertEquals(get.getURI().toString(), "http://jetbrais.com?qqq=ppp&www=ttt");\r
+  }\r
+\r
+  @Test\r
+  public void test_withParams5() {\r
+    final HttpGet get = myFactory.createGet("http://jetbrais.com", new Param("$qqq","ppp"), new Param("$www","t t 't'"));\r
+    Assert.assertEquals(get.getURI().toString(), "http://jetbrais.com?%24qqq=ppp&%24www=t+t+%27t%27");\r
+  }\r
+}\r
diff --git a/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/feed/reader/FeedPackagesParserTest.java b/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/feed/reader/FeedPackagesParserTest.java
new file mode 100644 (file)
index 0000000..500eff5
--- /dev/null
@@ -0,0 +1,74 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.tests.server.feed.reader;\r
+\r
+import jetbrains.buildServer.BaseTestCase;\r
+import jetbrains.buildServer.nuget.server.feed.reader.FeedPackage;\r
+import jetbrains.buildServer.nuget.server.feed.reader.impl.PackagesFeedParser;\r
+import jetbrains.buildServer.nuget.server.feed.reader.impl.PackagesFeedParserImpl;\r
+import jetbrains.buildServer.nuget.tests.integration.Paths;\r
+import jetbrains.buildServer.util.FileUtil;\r
+import org.jdom.Element;\r
+import org.jdom.JDOMException;\r
+import org.testng.Assert;\r
+import org.testng.annotations.Test;\r
+\r
+import java.io.IOException;\r
+import java.util.Collection;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 13:44\r
+ */\r
+public class FeedPackagesParserTest extends BaseTestCase {\r
+  private PackagesFeedParser myParser = new PackagesFeedParserImpl();\r
+\r
+  @Test\r
+  public void test_ParseRealFeed() throws JDOMException, IOException {\r
+    final Element doc = FileUtil.parseDocument(Paths.getTestDataPath("feed/reader/feed-response.xml"));\r
+    boolean hasLatest = false;\r
+    final Collection<FeedPackage> feedPackages = myParser.readPackages(doc);\r
+    for (FeedPackage feedPackage : feedPackages) {\r
+      Assert.assertFalse(hasLatest && feedPackage.isLatestVersion(), "There could be only one latest");\r
+      hasLatest |= feedPackage.isLatestVersion();\r
+      System.out.println("feedPackage = " + feedPackage);\r
+    }\r
+  }\r
+\r
+  @Test\r
+  public void test_ParseOnePackage() throws JDOMException, IOException {\r
+    final Element doc = FileUtil.parseDocument(Paths.getTestDataPath("feed/reader/feed-one.xml"));\r
+    final Collection<FeedPackage> packages = myParser.readPackages(doc);\r
+\r
+    Assert.assertEquals(packages.size(), 1);\r
+    final FeedPackage pkg = packages.iterator().next();\r
+\r
+    Assert.assertEquals(pkg.getAtomId(), "http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.0.11220.26')");\r
+    Assert.assertEquals(pkg.getDownloadUrl(), "http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.0.11220.26");\r
+    Assert.assertEquals(pkg.getInfo().getId(), "NuGet.CommandLine");\r
+    Assert.assertEquals(pkg.getInfo().getVersion(), "1.0.11220.26");\r
+    Assert.assertEquals(pkg.isLatestVersion(), false);\r
+    Assert.assertTrue(pkg.getDescription().length() > 0, "package should have deseciription");\r
+  }\r
+\r
+  @Test\r
+  public void test_broken() {\r
+    Element el = new Element("broken");\r
+    final Collection<FeedPackage> feedPackages = myParser.readPackages(el);\r
+    Assert.assertTrue(feedPackages.isEmpty());\r
+  }\r
+}\r
diff --git a/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/feed/reader/UrlResolverTest.java b/nuget-tests/src/jetbrains/buildServer/nuget/tests/server/feed/reader/UrlResolverTest.java
new file mode 100644 (file)
index 0000000..64f605d
--- /dev/null
@@ -0,0 +1,190 @@
+/*\r
+ * Copyright 2000-2011 JetBrains s.r.o.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+package jetbrains.buildServer.nuget.tests.server.feed.reader;\r
+\r
+import com.intellij.openapi.util.Pair;\r
+import jetbrains.buildServer.BaseTestCase;\r
+import jetbrains.buildServer.nuget.server.feed.reader.impl.FeedClient;\r
+import jetbrains.buildServer.nuget.server.feed.reader.impl.FeedGetMethodFactory;\r
+import jetbrains.buildServer.nuget.server.feed.reader.impl.UrlResolver;\r
+import jetbrains.buildServer.nuget.server.feed.reader.impl.UrlResolverImpl;\r
+import org.apache.http.HttpResponse;\r
+import org.apache.http.HttpStatus;\r
+import org.apache.http.HttpVersion;\r
+import org.apache.http.client.methods.HttpUriRequest;\r
+import org.apache.http.message.BasicHttpResponse;\r
+import org.hamcrest.BaseMatcher;\r
+import org.hamcrest.Description;\r
+import org.jetbrains.annotations.NotNull;\r
+import org.jmock.Expectations;\r
+import org.jmock.Mockery;\r
+import org.testng.Assert;\r
+import org.testng.annotations.BeforeMethod;\r
+import org.testng.annotations.Test;\r
+\r
+import java.io.IOException;\r
+\r
+/**\r
+ * Created by Eugene Petrenko (eugene.petrenko@gmail.com)\r
+ * Date: 12.08.11 15:26\r
+ */\r
+public class UrlResolverTest extends BaseTestCase {\r
+  private Mockery m;\r
+  private FeedClient myFeedClient;\r
+  private UrlResolver myResolver;\r
+\r
+  @BeforeMethod\r
+  @Override\r
+  protected void setUp() throws Exception {\r
+    super.setUp();\r
+    m = new Mockery();\r
+    myFeedClient = m.mock(FeedClient.class);\r
+    myResolver = new UrlResolverImpl(myFeedClient, new FeedGetMethodFactory());\r
+  }\r
+\r
+  @Test\r
+  public void test_should_support_200() throws IOException {\r
+    m.checking(new Expectations() {{\r
+      oneOf(myFeedClient).execute(with(httpGet("http://www.jetbrains.com")));\r
+      will(returnValue(responseStatus(200)));\r
+    }});\r
+\r
+    final Pair<String, HttpResponse> pair = myResolver.resolvePath("http://www.jetbrains.com");\r
+    Assert.assertEquals(pair.first, "http://www.jetbrains.com");\r
+  }\r
+\r
+  @Test\r
+  public void test_should_support_3xx() throws IOException {\r
+    m.checking(new Expectations() {{\r
+      oneOf(myFeedClient).execute(with(httpGet("http://www.jetbrains.com")));\r
+      will(returnValue(responseLocationStatus(HttpStatus.SC_MOVED_PERMANENTLY, "http://www.google.com")));\r
+      oneOf(myFeedClient).execute(with(httpGet("http://www.google.com")));\r
+      will(returnValue(responseStatus(200)));\r
+    }});\r
+\r
+    final Pair<String, HttpResponse> pair = myResolver.resolvePath("http://www.jetbrains.com");\r
+    Assert.assertEquals(pair.first, "http://www.google.com");\r
+  }\r
+\r
+  @Test\r
+  public void test_should_support_3xx_ms() throws IOException {\r
+    m.checking(new Expectations() {{\r
+      oneOf(myFeedClient).execute(with(httpGet("http://www.jetbrains.com/redirect?fwLink=555")));\r
+      will(returnValue(responseLocationStatus(HttpStatus.SC_MOVED_PERMANENTLY, "http://www.google.com")));\r
+      oneOf(myFeedClient).execute(with(httpGet("http://www.google.com")));\r
+      will(returnValue(responseStatus(200)));\r
+    }});\r
+\r
+    final Pair<String, HttpResponse> pair = myResolver.resolvePath("http://www.jetbrains.com/redirect?fwLink=555");\r
+    Assert.assertEquals(pair.first, "http://www.google.com");\r
+  }\r
+\r
+  @Test\r
+  public void test_should_support_3xx_multi() throws IOException {\r
+    m.checking(new Expectations() {{\r
+      oneOf(myFeedClient).execute(with(httpGet("http://www.jetbrains.com")));\r
+      will(returnValue(responseLocationStatus(HttpStatus.SC_MOVED_PERMANENTLY, "http://domain_1.jonnyzzz.com")));\r
+\r
+      oneOf(myFeedClient).execute(with(httpGet("http://domain_1.jonnyzzz.com")));\r
+      will(returnValue(responseLocationStatus(HttpStatus.SC_MOVED_TEMPORARILY, "http://domain_2.jonnyzzz.com")));\r
+\r
+      oneOf(myFeedClient).execute(with(httpGet("http://domain_2.jonnyzzz.com")));\r
+      will(returnValue(responseLocationStatus(HttpStatus.SC_TEMPORARY_REDIRECT, "http://domain_3.jonnyzzz.com")));\r
+\r
+      oneOf(myFeedClient).execute(with(httpGet("http://domain_3.jonnyzzz.com")));\r
+      will(returnValue(responseLocationStatus(HttpStatus.SC_MOVED_PERMANENTLY, "http://domain_4.jonnyzzz.com")));\r
+\r
+      oneOf(myFeedClient).execute(with(httpGet("http://domain_4.jonnyzzz.com")));\r
+      will(returnValue(responseLocationStatus(HttpStatus.SC_MOVED_PERMANENTLY, "http://www.google.com")));\r
+\r
+      oneOf(myFeedClient).execute(with(httpGet("http://www.google.com")));\r
+      will(returnValue(responseStatus(200)));\r
+    }});\r
+\r
+    final Pair<String, HttpResponse> pair = myResolver.resolvePath("http://www.jetbrains.com");\r
+    Assert.assertEquals(pair.first, "http://www.google.com");\r
+  }\r
+\r
+  @Test\r
+  public void test_should_support_3xx_loop() throws IOException {\r
+    m.checking(new Expectations() {{\r
+      allowing(myFeedClient).execute(with(httpGet("http://www.jetbrains.com")));\r
+      will(returnValue(responseLocationStatus(HttpStatus.SC_MOVED_PERMANENTLY, "http://www.jetbrains.com")));\r
+    }});\r
+\r
+    try {\r
+      myResolver.resolvePath("http://www.jetbrains.com");\r
+    } catch (IOException e) {\r
+      return;\r
+    }\r
+    Assert.fail();\r
+  }\r
+\r
+  @Test\r
+  public void test_should_fail_on_500() throws IOException {\r
+    m.checking(new Expectations() {{\r
+      oneOf(myFeedClient).execute(with(httpGet("http://www.jetbrains.com")));\r
+      will(returnValue(responseStatus(500)));\r
+    }});\r
+\r
+    try {\r
+      myResolver.resolvePath("http://www.jetbrains.com");\r
+    } catch (IOException e) {\r
+      return;\r
+    }\r
+    Assert.fail();\r
+  }\r
+\r
+  @Test\r
+  public void test_should_fail_on_400() throws IOException {\r
+    m.checking(new Expectations() {{\r
+      oneOf(myFeedClient).execute(with(httpGet("http://www.jetbrains.com")));\r
+      will(returnValue(responseStatus(400)));\r
+    }});\r
+\r
+    try {\r
+      myResolver.resolvePath("http://www.jetbrains.com");\r
+    } catch (IOException e) {\r
+      return;\r
+    }\r
+    Assert.fail();\r
+  }\r
+\r
+  private static HttpResponse responseStatus(int status) {\r
+    return new BasicHttpResponse(HttpVersion.HTTP_1_0, status, "Status: " + status);\r
+  }\r
+\r
+  private static HttpResponse responseLocationStatus(int status, @NotNull String location) {\r
+    final BasicHttpResponse res = new BasicHttpResponse(HttpVersion.HTTP_1_0, status, "Status: " + status);\r
+    res.addHeader("Location", location);\r
+    return res;\r
+  }\r
+\r
+  private static BaseMatcher<HttpUriRequest> httpGet(@NotNull final String url) {\r
+    return new BaseMatcher<HttpUriRequest>() {\r
+      public boolean matches(Object o) {\r
+        if (!(o instanceof org.apache.http.client.methods.HttpGet)) return false;\r
+        org.apache.http.client.methods.HttpGet get = (org.apache.http.client.methods.HttpGet) o;\r
+        return get.getURI().toString().equals(url);\r
+      }\r
+\r
+      public void describeTo(Description description) {\r
+        description.appendText("HttpGet to ").appendText(url);\r
+      }\r
+    };\r
+  }\r
+}\r
index bc4ef387962fa5c1dd15f557857f7f4a3ae061cd..1a0b53fd539a8f25d80e71a9cbc4b6182f0d5eb9 100644 (file)
@@ -1,6 +1,5 @@
 <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">\r
 <suite name="nuget">\r
-\r
   <test name="fast tests">\r
     <classes>\r
       <class name="jetbrains.buildServer.nuget.tests.RunTypeNameTest"/>\r
@@ -26,6 +25,9 @@
       <class name="jetbrains.buildServer.nuget.tests.server.NamedPackagesUpdateCheckerTest"/>\r
 \r
       <class name="jetbrains.buildServer.nuget.tests.agent.MatchFilesBuildProcessTest"/>\r
+\r
+      <class name="jetbrains.buildServer.nuget.tests.server.feed.reader.FeedPackagesParserTest"/>\r
+      <class name="jetbrains.buildServer.nuget.tests.server.feed.reader.FeedGetMethodFactoryTest"/>\r
     </classes>\r
   </test>\r
 </suite>\r
index 0d42ca6c54d20f8a9b051cf0a3ee67ffdf4de3f1..4112e5236b6d651a4fde8f075b374367521c4ea9 100644 (file)
@@ -5,6 +5,7 @@
       <class name="jetbrains.buildServer.nuget.tests.integration.InstallPackageIntegtatoinTest"/>\r
       <class name="jetbrains.buildServer.nuget.tests.integration.NuGetExecutorTest"/>\r
       <class name="jetbrains.buildServer.nuget.tests.integration.PackagesPublishIntegrationTest"/>\r
+      <class name="jetbrains.buildServer.nuget.tests.integration.FeedReaderTest"/>\r
     </classes>\r
   </test>\r
 </suite>\r
diff --git a/nuget-tests/testData/feed/reader/feed-one.xml b/nuget-tests/testData/feed/reader/feed-one.xml
new file mode 100644 (file)
index 0000000..1e0b9e1
--- /dev/null
@@ -0,0 +1,54 @@
+<feed xml:base="http://packages.nuget.org/v1/FeedService.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">\r
+  <title type="text">Packages</title>\r
+  <id>http://packages.nuget.org/v1/FeedService.svc/Packages</id>\r
+  <updated>2011-08-12T09:37:47Z</updated>\r
+  <link rel="self" title="Packages" href="Packages" />\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.0.11220.26')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-01-16T02:09:47-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.0.11220.26')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.0.11220.26')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.0.11220.26')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.0.11220.26" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.0.11220.26</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>CdHaDY256ZkPkolX02H6LkkS/RtjWwgDafJHIXr65ePiFY5u3+4tM0TVUXNim7eIOzihnQhXXNjdu9M/kTMdnA==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">131297</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">90</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-01-07T07:57:50.387</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-01-16T02:09:47.61</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-01-16T02:09:54.94</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl>/Media/Default/Packages/NuGet.CommandLine/1.0.11220.26/nuget-64x64.png</d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.0.11220.26</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.0.11220.26</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+</feed>\r
diff --git a/nuget-tests/testData/feed/reader/feed-response.xml b/nuget-tests/testData/feed/reader/feed-response.xml
new file mode 100644 (file)
index 0000000..55fa4f9
--- /dev/null
@@ -0,0 +1,870 @@
+<feed xml:base="http://packages.nuget.org/v1/FeedService.svc/" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom">\r
+  <title type="text">Packages</title>\r
+  <id>http://packages.nuget.org/v1/FeedService.svc/Packages</id>\r
+  <updated>2011-08-12T09:37:47Z</updated>\r
+  <link rel="self" title="Packages" href="Packages" />\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.0.11220.26')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-01-16T02:09:47-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.0.11220.26')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.0.11220.26')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.0.11220.26')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.0.11220.26" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.0.11220.26</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>CdHaDY256ZkPkolX02H6LkkS/RtjWwgDafJHIXr65ePiFY5u3+4tM0TVUXNim7eIOzihnQhXXNjdu9M/kTMdnA==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">131297</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">90</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-01-07T07:57:50.387</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-01-16T02:09:47.61</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-01-16T02:09:54.94</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl>/Media/Default/Packages/NuGet.CommandLine/1.0.11220.26/nuget-64x64.png</d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.0.11220.26</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.0.11220.26</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.1.2120.134')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-01-20T01:20:55-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.1.2120.134')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.1.2120.134')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.1.2120.134')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.1.2120.134" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.1.2120.134</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>xGfEKOnyk+AgzZHcsdSjVL4jycFmDtV70eh/uIamhyAQqGF5LkS2RmVPE+/nkl/zMQpC3AF/2cHT7xIt4JTAnw==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">140927</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">80</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-01-20T01:20:55.597</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-01-20T01:20:55.597</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-01-20T01:20:55.907</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.1.2120.134</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.1.2120.134</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.1.2120.136')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-01-20T20:26:50-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.1.2120.136')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.1.2120.136')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.1.2120.136')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.1.2120.136" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.1.2120.136</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>Obo270Tcmx5W4Uc1Xfve/DlMZue+8lRrJ8CPHfYo8z6H8zpu2QfJ/0y/yoSLIOooU9Z4EUZUCGKdX1EVRU/pgw==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">142675</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">77</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-01-20T20:26:50.16</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-01-20T20:26:50.16</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-01-20T20:26:50.44</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.1.2120.136</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.1.2120.136</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.1.2121.140')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-01-21T02:12:26-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.1.2121.140')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.1.2121.140')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.1.2121.140')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.1.2121.140" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.1.2121.140</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>6qxF7h9NJRfLno58qnsmEizGsuMEkIpVfgmqjvXpkKWZbEeh77UektDWcZaauxHVnBQDoFUSDVP+hXMaBJ5Sgg==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">142869</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">82</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-01-21T02:12:26.517</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-01-21T02:12:26.517</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-01-21T02:12:26.957</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.1.2121.140</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.1.2121.140</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.1.2122.156')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-01-22T09:11:47-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.1.2122.156')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.1.2122.156')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.1.2122.156')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.1.2122.156" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.1.2122.156</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>hf1vvXOxkqCa11aP6x/50lYc9uCsjjeQFcdxJGa3vlXlXZhiGhq0EAE4DdnV4ntj5ZwqEzACBjALVwHEVdKELA==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">144898</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">108</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-01-22T09:11:47.16</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-01-22T09:11:47.16</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-01-22T09:11:47.517</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.1.2122.156</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.1.2122.156</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20216.59')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-02-16T06:00:06-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20216.59')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20216.59')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20216.59')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20216.59" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20216.59</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>O++ZhwMFjWf1ZP1hrT/pQ4HLcRqW31sx5t/Yl1Ku4Aq6qMTODUNlGdiQSRRJmX8Lf4sQJN6fsM4OrZhvsdf5iA==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">149670</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">253</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-02-16T06:00:06.047</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-02-16T06:00:06.047</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-02-16T06:00:06.733</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20216.59</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20216.59</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20310.1')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-03-10T20:52:36-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20310.1')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20310.1')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20310.1')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20310.1" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20310.1</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>lqqAnj4a9/XZ0TjGFzEJrcAyomM130pjwkGPNTnDDVKpCnzBrqiassb2QveZcpje9nnUL+jhh8e2picx039aBQ==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">160705</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">77</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-03-10T20:52:36.097</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-03-10T20:52:36.097</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-03-10T20:52:37.19</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20310.1</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20310.1</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20311.3')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-03-11T23:41:13-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20311.3')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20311.3')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20311.3')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20311.3" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20311.3</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>cG0mwva/959xYIgRiiRdtv6yrQZeHacBZKY49lKIny177LF4Hz2QJq1Xfl8gYRdcUAAf7uGDrXMjzyu65Vb9CA==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">163523</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">206</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-03-11T23:41:13.727</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-03-11T23:41:13.727</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-03-11T23:41:14.04</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20311.3</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20311.3</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20325.10')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-03-31T06:44:05-07:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20325.10')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20325.10')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20325.10')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20325.10" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20325.10</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>5b5GhAi2up+FMtYGFoBuERBmUg+jTjkPAgrgyBT7rnR/P2Art+CB6zKPLn2lJ1xWOMCpZsD8GvRuLdpbfzCQag==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">163825</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">143</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-03-31T06:44:05.937</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-03-31T06:44:05.937</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-03-31T06:44:06.39</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20325.10</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20325.10</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20401.11')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-04-02T01:29:10-07:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20401.11')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20401.11')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20401.11')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20401.11" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20401.11</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>GucKIezAxoaDayGFWHBpU2foLo08yefzYaMBMDb4/6WP78QkDtQXu+SWt939DGiQ7kqtU+WQ7360+y7/bMgAAA==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">163977</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">163</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-04-02T01:29:10.287</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-04-02T01:29:10.287</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-04-02T01:29:10.74</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20401.11</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20401.11</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20409.25')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet Command Line Tool</summary>\r
+    <updated>2011-04-14T06:07:04-07:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20409.25')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20409.25')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20409.25')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20409.25" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20409.25</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet Command Line Tool</d:Summary>\r
+      <d:Description>NuGet Command Line Tool</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>RbpiILSeerRprKnf6J+27TXqzP8v8ddvVd5JYycQQn2h3ZyTvdVGFHdsLOzIwRSpyuNP+JfTHNeb92K479eyWA==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">181974</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">5</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">1</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">101</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-04-14T06:07:04.913</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-04-14T06:07:04.913</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-04-14T06:07:05.27</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl>http://nuget.codeplex.com/license</d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags m:null="true"></d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20409.25</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20409.25</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20415.26')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet Command Line Tool</summary>\r
+    <updated>2011-04-16T05:21:16-07:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20415.26')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20415.26')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20415.26')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20415.26" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20415.26</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet Command Line Tool</d:Summary>\r
+      <d:Description>NuGet Command Line Tool</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>xXJRheYRC4VoJ1mXyYWfodYWXsJySuqG7YKIDfwfD0iy6+DyKEZtGLpaufXHItjM+VZbJrbSpFDcd2lGqVdxjA==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">181811</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">73</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-04-16T05:21:16.52</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-04-16T05:21:16.52</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-04-16T05:21:16.99</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl>http://nuget.codeplex.com/license</d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags m:null="true"></d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20415.26</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20415.26</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20416.28')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-04-17T18:53:31-07:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20416.28')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20416.28')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20416.28')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20416.28" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20416.28</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>2cD3v+hbCjXfCtLyZmyCuUya5Asn78p/s+hPdFKMi1iFkegCPS4L5SnUGRq1o/LSFZXiWjt3vKYf26UJBwDRIA==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">169134</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">33</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-04-17T18:53:31.897</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-04-17T18:53:31.897</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-04-17T18:53:32.24</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20416.28</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20416.28</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20416.30')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet Command Line Tool</summary>\r
+    <updated>2011-04-17T23:57:12-07:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20416.30')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20416.30')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20416.30')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20416.30" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20416.30</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet Command Line Tool</d:Summary>\r
+      <d:Description>NuGet Command Line Tool</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>lDjpNDOgvjo4JaJBrqE5+oFUSTKwrC8S5agCkiFxFoApGnaG7pdHc0Diqfi6231ZY/QrHFFQlgCx4zeiQOS52g==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">169044</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">33</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-04-17T23:57:12.207</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-04-17T23:57:12.207</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-04-17T23:57:12.567</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl>http://nuget.codeplex.com/license</d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags m:null="true"></d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20416.30</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20416.30</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.20417.31')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet Command Line Tool</summary>\r
+    <updated>2011-04-18T06:34:05-07:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20417.31')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.20417.31')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.20417.31')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.20417.31" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.20417.31</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet Command Line Tool</d:Summary>\r
+      <d:Description>NuGet Command Line Tool</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>PdpsL76kbBazF/FxhaLrgqY56bqGg5Ajff8KszxAJ/mP3Flyo05ypbg1vHL1znli1ybRkxdIvsYC8gtZXlDnWQ==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">170105</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">573</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-04-18T06:34:05.287</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-04-18T06:34:05.287</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-04-18T06:34:05.617</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl>http://nuget.codeplex.com/license</d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags m:null="true"></d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.20417.31</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.20417.31</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.2.2128.11')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet command line tool used to create and push packages.</summary>\r
+    <updated>2011-01-28T08:33:10-08:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.2128.11')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.2.2128.11')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.2.2128.11')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.2.2128.11" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.2.2128.11</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet command line tool used to create and push packages.</d:Summary>\r
+      <d:Description>NuGet command line tool used to create and push packages.</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>Zr4xcwA++qSqVxBn71V16g/Lb3CnV8IUZqfkiZ79eQWzFWnViVihL/bkzqYvK6RaXFZAn6vvv8836jBoE95BGQ==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">147564</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">258</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-01-28T08:33:10.583</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-01-28T08:33:10.583</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-01-28T08:33:11.1</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl m:null="true"></d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags xml:space="preserve"> nuget </d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.2.2128.11</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.2.2128.11</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.3.20425.372')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet Command Line Tool</summary>\r
+    <updated>2011-04-26T18:03:37-07:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.3.20425.372')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.3.20425.372')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.3.20425.372')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.3.20425.372" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.3.20425.372</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet Command Line Tool</d:Summary>\r
+      <d:Description>NuGet Command Line Tool</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>F+arxhGXvOtn0BRK/3XEl1QvSGesWU1Pc0wBRSkZPtDIFoRrmTJeI5NyJe3/nUMjPgkuHf+e0NhXEKrUuCvtdw==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">174811</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">3429</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-04-26T18:03:37.583</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-04-26T18:03:37.583</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-04-26T18:03:37.99</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl>http://nuget.codeplex.com/license</d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags m:null="true"></d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.3.20425.372</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.3.20425.372</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+  <entry>\r
+    <id>http://packages.nuget.org/v1/FeedService.svc/Packages(Id='NuGet.CommandLine',Version='1.4.20615.182')</id>\r
+    <title type="text">NuGet.CommandLine</title>\r
+    <summary type="text">NuGet Command Line Tool</summary>\r
+    <updated>2011-06-17T22:40:31-07:00</updated>\r
+    <author>\r
+      <name>Outercurve Foundation</name>\r
+    </author>\r
+    <link rel="edit-media" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.4.20615.182')/$value" />\r
+    <link rel="edit" title="PublishedPackage" href="Packages(Id='NuGet.CommandLine',Version='1.4.20615.182')" />\r
+    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Screenshots" type="application/atom+xml;type=feed" title="Screenshots" href="Packages(Id='NuGet.CommandLine',Version='1.4.20615.182')/Screenshots" />\r
+    <category term="Gallery.Infrastructure.FeedModels.PublishedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />\r
+    <content type="application/zip" src="http://packages.nuget.org/v1/Package/Download/NuGet.CommandLine/1.4.20615.182" />\r
+    <m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">\r
+      <d:Id>NuGet.CommandLine</d:Id>\r
+      <d:Version>1.4.20615.182</d:Version>\r
+      <d:Title>NuGet.CommandLine</d:Title>\r
+      <d:Authors>Outercurve Foundation</d:Authors>\r
+      <d:PackageType>Packages</d:PackageType>\r
+      <d:Summary>NuGet Command Line Tool</d:Summary>\r
+      <d:Description>NuGet Command Line Tool</d:Description>\r
+      <d:Copyright m:null="true"></d:Copyright>\r
+      <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>\r
+      <d:PackageHash>IsySDzcP5nYd6wxY5WTsemUoNlhTRdBmME7JTyaSHmcoUFQarC/iMN8Rczwq0m5SM6c+ScpNICF/cUQ4zz4d4A==</d:PackageHash>\r
+      <d:PackageSize m:type="Edm.Int64">201729</d:PackageSize>\r
+      <d:Price m:type="Edm.Decimal">0</d:Price>\r
+      <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>\r
+      <d:IsLatestVersion m:type="Edm.Boolean">true</d:IsLatestVersion>\r
+      <d:VersionRating m:type="Edm.Double">0</d:VersionRating>\r
+      <d:VersionRatingsCount m:type="Edm.Int32">0</d:VersionRatingsCount>\r
+      <d:VersionDownloadCount m:type="Edm.Int32">4346</d:VersionDownloadCount>\r
+      <d:Created m:type="Edm.DateTime">2011-06-17T22:40:31.563</d:Created>\r
+      <d:LastUpdated m:type="Edm.DateTime">2011-06-17T22:40:31.563</d:LastUpdated>\r
+      <d:Published m:type="Edm.DateTime">2011-06-17T22:40:33.253</d:Published>\r
+      <d:ExternalPackageUrl m:null="true"></d:ExternalPackageUrl>\r
+      <d:ProjectUrl>http://nuget.codeplex.com/</d:ProjectUrl>\r
+      <d:LicenseUrl>http://nuget.codeplex.com/license</d:LicenseUrl>\r
+      <d:IconUrl m:null="true"></d:IconUrl>\r
+      <d:Rating m:type="Edm.Double">5</d:Rating>\r
+      <d:RatingsCount m:type="Edm.Int32">1</d:RatingsCount>\r
+      <d:DownloadCount m:type="Edm.Int32">10125</d:DownloadCount>\r
+      <d:Categories m:null="true"></d:Categories>\r
+      <d:Tags m:null="true"></d:Tags>\r
+      <d:Dependencies></d:Dependencies>\r
+      <d:ReportAbuseUrl>http://nuget.org/Package/ReportAbuse/NuGet.CommandLine/1.4.20615.182</d:ReportAbuseUrl>\r
+      <d:GalleryDetailsUrl>http://nuget.org/List/Packages/NuGet.CommandLine/1.4.20615.182</d:GalleryDetailsUrl>\r
+    </m:properties>\r
+  </entry>\r
+</feed>\r