maven-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bri...@apache.org
Subject svn commit: r556791 - in /maven/plugins/branches/maven-dependency-plugin-MDEP-47: ./ src/main/java/org/apache/maven/plugin/dependency/ src/test/java/org/apache/maven/plugin/dependency/ src/test/resources/unit/unpack-dependencies-test/
Date Tue, 17 Jul 2007 02:07:38 GMT
Author: brianf
Date: Mon Jul 16 19:07:37 2007
New Revision: 556791

URL: http://svn.apache.org/viewvc?view=rev&rev=556791
Log:
applied patch from Damian Bradicich for MDEP-47

Added:
    maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/test/java/org/apache/maven/plugin/dependency/TestIncludeExcludeUnpackDependenciesMojo.java
    maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/test/resources/unit/unpack-dependencies-test/test.zip
  (with props)
Modified:
    maven/plugins/branches/maven-dependency-plugin-MDEP-47/pom.xml
    maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/main/java/org/apache/maven/plugin/dependency/AbstractDependencyMojo.java

Modified: maven/plugins/branches/maven-dependency-plugin-MDEP-47/pom.xml
URL: http://svn.apache.org/viewvc/maven/plugins/branches/maven-dependency-plugin-MDEP-47/pom.xml?view=diff&rev=556791&r1=556790&r2=556791
==============================================================================
--- maven/plugins/branches/maven-dependency-plugin-MDEP-47/pom.xml (original)
+++ maven/plugins/branches/maven-dependency-plugin-MDEP-47/pom.xml Mon Jul 16 19:07:37 2007
@@ -77,6 +77,29 @@
 	<build>
 		<plugins>
 			<plugin>
+				<artifactId>maven-enforcer-plugin</artifactId>
+				<version>1.0-alpha-3</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>enforce</goal>
+						</goals>
+						<id>ensure-no-container-api</id>
+						<configuration>
+							<rules>
+								<bannedDependencies>
+									<excludes>
+										<exclude>org.codehaus.plexus:plexus-component-api</exclude>
+									</excludes>
+									<message>The new containers are not supported. You probably added a dependency
that is missing the exclusions.</message>
+								</bannedDependencies>
+							</rules>  
+							<fail>true</fail>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
 				<groupId>org.codehaus.mojo</groupId>
 				<artifactId>cobertura-maven-plugin</artifactId>
 				<version>2.0</version>
@@ -145,17 +168,17 @@
 			<artifactId>plexus-archiver</artifactId>
 			<version>1.0-alpha-9-SNAPSHOT</version>
 			<exclusions>
-              <exclusion>
-                 <groupId>org.codehaus.plexus</groupId>
-                 <artifactId>plexus-container-default</artifactId>
-              </exclusion>
-              <exclusion>
-                 <groupId>org.codehaus.plexus</groupId>
-                 <artifactId>plexus-component-api</artifactId>
-              </exclusion>			  
-            </exclusions>
+				<exclusion>
+					<groupId>org.codehaus.plexus</groupId>
+					<artifactId>plexus-container-default</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.codehaus.plexus</groupId>
+					<artifactId>plexus-component-api</artifactId>
+				</exclusion>			  
+			</exclusions>
 		</dependency>
-<!--		<dependency>
+		<!--		<dependency>
 			<groupId>org.codehaus.plexus</groupId>
 			<artifactId>plexus-component-api</artifactId>
 			<version>1.0-alpha-9</version>
@@ -182,25 +205,40 @@
 			<version>1.0-alpha-9-stable-1</version>
 		</dependency>
 		<dependency>
-		    <groupId>org.apache.maven.shared</groupId>
-		    <artifactId>maven-dependency-analyzer</artifactId>
-		    <version>1.0-alpha-3-SNAPSHOT</version>
+			<groupId>org.apache.maven.shared</groupId>
+			<artifactId>maven-dependency-analyzer</artifactId>
+			<version>1.0-alpha-3-SNAPSHOT</version>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.maven.shared</groupId>
 			<artifactId>maven-dependency-tree</artifactId>
 			<version>1.0</version>
 		</dependency>
+		<dependency>
+			<groupId>org.codehaus.plexus</groupId>
+			<artifactId>plexus-io</artifactId>
+			<version>1.0-alpha-1</version>
+			<exclusions>
+				<exclusion>
+					<groupId>org.codehaus.plexus</groupId>
+					<artifactId>plexus-container-default</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.codehaus.plexus</groupId>
+					<artifactId>plexus-component-api</artifactId>
+				</exclusion>			  
+			</exclusions>
+		</dependency>
 	</dependencies>
 
-  <!-- TODO: remove when plexus-archiver is released -->
-  <repositories>
-    <repository>
-      <id>codehaus.snapshots</id>
-      <url>http://snapshots.repository.codehaus.org/</url>
-      <releases>
-        <enabled>false</enabled>
-      </releases>
-    </repository>
-  </repositories>
+	<!-- TODO: remove when plexus-archiver is released -->
+	<repositories>
+		<repository>
+			<id>codehaus.snapshots</id>
+			<url>http://snapshots.repository.codehaus.org/</url>
+			<releases>
+				<enabled>false</enabled>
+			</releases>
+		</repository>
+	</repositories>
 </project>

Modified: maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/main/java/org/apache/maven/plugin/dependency/AbstractDependencyMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/main/java/org/apache/maven/plugin/dependency/AbstractDependencyMojo.java?view=diff&rev=556791&r1=556790&r2=556791
==============================================================================
--- maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/main/java/org/apache/maven/plugin/dependency/AbstractDependencyMojo.java
(original)
+++ maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/main/java/org/apache/maven/plugin/dependency/AbstractDependencyMojo.java
Mon Jul 16 19:07:37 2007
@@ -34,12 +34,15 @@
 import org.codehaus.plexus.archiver.UnArchiver;
 import org.codehaus.plexus.archiver.manager.ArchiverManager;
 import org.codehaus.plexus.archiver.manager.NoSuchArchiverException;
+import org.codehaus.plexus.components.io.fileselectors.IncludeExcludeFileSelector;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.ReflectionUtils;
+import org.codehaus.plexus.util.StringUtils;
 
 /**
  * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
- * @version $Id$
+ * @version $Id: AbstractDependencyMojo.java 552528
+ *          2007-07-02 16:12:47Z markh $
  */
 public abstract class AbstractDependencyMojo
     extends AbstractMojo
@@ -129,7 +132,8 @@
      * 
      * @optional
      * @since 2.0
-     * @parameter expression="${silent}" default-value="false"
+     * @parameter expression="${silent}"
+     *            default-value="false"
      */
     public boolean silent;
 
@@ -143,12 +147,28 @@
      */
     protected boolean outputAbsoluteArtifactFilename;
 
+    /**
+     * A set of file patterns to include when unpacking the
+     * artifact.
+     * 
+     * @parameter expression="${mdep.unpack.includes}"
+     */
+    private String includes;
+
+    /**
+     * A set of file patterns to exclude when unpacking the
+     * artifact.
+     * 
+     * @parameter expression="${mdep.unpack.excludes}"
+     */
+    private String excludes;
+
     private Log log;
 
     /**
      * @return Returns the log.
      */
-    public Log getLog()
+    public Log getLog ()
     {
         if ( silent )
         {
@@ -165,7 +185,7 @@
     /**
      * @return Returns the archiverManager.
      */
-    public ArchiverManager getArchiverManager()
+    public ArchiverManager getArchiverManager ()
     {
         return this.archiverManager;
     }
@@ -173,15 +193,13 @@
     /**
      * Does the actual copy of the file and logging.
      * 
-     * @param artifact
-     *            represents the file to copy.
-     * @param destFile
-     *            file name of destination file.
+     * @param artifact represents the file to copy.
+     * @param destFile file name of destination file.
      * 
-     * @throws MojoExecutionException
-     *             with a message if an error occurs.
+     * @throws MojoExecutionException with a message if an
+     *             error occurs.
      */
-    protected void copyFile( File artifact, File destFile )
+    protected void copyFile ( File artifact, File destFile )
         throws MojoExecutionException
     {
         Log theLog = this.getLog();
@@ -202,12 +220,11 @@
     /**
      * Unpacks the archive file.
      * 
-     * @param file
-     *            File to be unpacked.
-     * @param location
-     *            Location where to put the unpacked files.
+     * @param file File to be unpacked.
+     * @param location Location where to put the unpacked
+     *            files.
      */
-    protected void unpack( File file, File location )
+    protected void unpack ( File file, File location )
         throws MojoExecutionException
     {
 
@@ -223,6 +240,25 @@
 
             unArchiver.setDestDirectory( location );
 
+            if ( StringUtils.isNotEmpty( excludes ) || StringUtils.isNotEmpty( includes )
)
+            {
+                // Create the selectors that will filter
+                // based on include/exclude parameters
+                // MDEP-47
+                IncludeExcludeFileSelector[] selectors = new IncludeExcludeFileSelector[]
{ new IncludeExcludeFileSelector() };
+
+                if ( StringUtils.isNotEmpty( excludes ) )
+                {
+                    selectors[0].setExcludes( excludes.split( "," ) );
+                }
+
+                if ( StringUtils.isNotEmpty( includes ) )
+                {
+                    selectors[0].setIncludes( this.includes.split( "," ) );
+                }
+
+                unArchiver.setFileSelectors( selectors );
+            }
             if ( this.silent )
             {
                 silenceUnarchiver( unArchiver );
@@ -242,9 +278,10 @@
         }
     }
 
-    private void silenceUnarchiver( UnArchiver unArchiver )
+    private void silenceUnarchiver ( UnArchiver unArchiver )
     {
-        // dangerous but handle any errors. It's the only way to silence the
+        // dangerous but handle any errors. It's the only
+        // way to silence the
         // unArchiver.
         try
         {
@@ -256,23 +293,23 @@
         }
         catch ( Exception e )
         {
-            // was a nice try. Don't bother logging because the log is silent.
+            // was a nice try. Don't bother logging because
+            // the log is silent.
         }
     }
 
     /**
      * @return Returns the factory.
      */
-    public org.apache.maven.artifact.factory.ArtifactFactory getFactory()
+    public org.apache.maven.artifact.factory.ArtifactFactory getFactory ()
     {
         return this.factory;
     }
 
     /**
-     * @param factory
-     *            The factory to set.
+     * @param factory The factory to set.
      */
-    public void setFactory( org.apache.maven.artifact.factory.ArtifactFactory factory )
+    public void setFactory ( org.apache.maven.artifact.factory.ArtifactFactory factory )
     {
         this.factory = factory;
     }
@@ -280,7 +317,7 @@
     /**
      * @return Returns the project.
      */
-    public MavenProject getProject()
+    public MavenProject getProject ()
     {
         return this.project;
     }
@@ -288,16 +325,15 @@
     /**
      * @return Returns the local.
      */
-    public org.apache.maven.artifact.repository.ArtifactRepository getLocal()
+    public org.apache.maven.artifact.repository.ArtifactRepository getLocal ()
     {
         return this.local;
     }
 
     /**
-     * @param local
-     *            The local to set.
+     * @param local The local to set.
      */
-    public void setLocal( org.apache.maven.artifact.repository.ArtifactRepository local )
+    public void setLocal ( org.apache.maven.artifact.repository.ArtifactRepository local
)
     {
         this.local = local;
     }
@@ -305,16 +341,15 @@
     /**
      * @return Returns the remoteRepos.
      */
-    public java.util.List getRemoteRepos()
+    public java.util.List getRemoteRepos ()
     {
         return this.remoteRepos;
     }
 
     /**
-     * @param remoteRepos
-     *            The remoteRepos to set.
+     * @param remoteRepos The remoteRepos to set.
      */
-    public void setRemoteRepos( java.util.List remoteRepos )
+    public void setRemoteRepos ( java.util.List remoteRepos )
     {
         this.remoteRepos = remoteRepos;
     }
@@ -322,25 +357,23 @@
     /**
      * @return Returns the resolver.
      */
-    public org.apache.maven.artifact.resolver.ArtifactResolver getResolver()
+    public org.apache.maven.artifact.resolver.ArtifactResolver getResolver ()
     {
         return this.resolver;
     }
 
     /**
-     * @param resolver
-     *            The resolver to set.
+     * @param resolver The resolver to set.
      */
-    public void setResolver( org.apache.maven.artifact.resolver.ArtifactResolver resolver
)
+    public void setResolver ( org.apache.maven.artifact.resolver.ArtifactResolver resolver
)
     {
         this.resolver = resolver;
     }
 
     /**
-     * @param archiverManager
-     *            The archiverManager to set.
+     * @param archiverManager The archiverManager to set.
      */
-    public void setArchiverManager( ArchiverManager archiverManager )
+    public void setArchiverManager ( ArchiverManager archiverManager )
     {
         this.archiverManager = archiverManager;
     }
@@ -348,16 +381,16 @@
     /**
      * @return Returns the artifactCollector.
      */
-    public ArtifactCollector getArtifactCollector()
+    public ArtifactCollector getArtifactCollector ()
     {
         return this.artifactCollector;
     }
 
     /**
-     * @param theArtifactCollector
-     *            The artifactCollector to set.
+     * @param theArtifactCollector The artifactCollector to
+     *            set.
      */
-    public void setArtifactCollector( ArtifactCollector theArtifactCollector )
+    public void setArtifactCollector ( ArtifactCollector theArtifactCollector )
     {
         this.artifactCollector = theArtifactCollector;
     }
@@ -365,17 +398,33 @@
     /**
      * @return Returns the artifactMetadataSource.
      */
-    public ArtifactMetadataSource getArtifactMetadataSource()
+    public ArtifactMetadataSource getArtifactMetadataSource ()
     {
         return this.artifactMetadataSource;
     }
 
     /**
-     * @param theArtifactMetadataSource
-     *            The artifactMetadataSource to set.
+     * @param theArtifactMetadataSource The
+     *            artifactMetadataSource to set.
      */
-    public void setArtifactMetadataSource( ArtifactMetadataSource theArtifactMetadataSource
)
+    public void setArtifactMetadataSource ( ArtifactMetadataSource theArtifactMetadataSource
)
     {
         this.artifactMetadataSource = theArtifactMetadataSource;
+    }
+
+    /**
+     * @param excludes The items to exclude
+     */
+    public void setExcludes ( String excludes )
+    {
+        this.excludes = excludes;
+    }
+
+    /**
+     * @param includes The items to include
+     */
+    public void setIncludes ( String includes )
+    {
+        this.includes = includes;
     }
 }

Added: maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/test/java/org/apache/maven/plugin/dependency/TestIncludeExcludeUnpackDependenciesMojo.java
URL: http://svn.apache.org/viewvc/maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/test/java/org/apache/maven/plugin/dependency/TestIncludeExcludeUnpackDependenciesMojo.java?view=auto&rev=556791
==============================================================================
--- maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/test/java/org/apache/maven/plugin/dependency/TestIncludeExcludeUnpackDependenciesMojo.java
(added)
+++ maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/test/java/org/apache/maven/plugin/dependency/TestIncludeExcludeUnpackDependenciesMojo.java
Mon Jul 16 19:07:37 2007
@@ -0,0 +1,164 @@
+package org.apache.maven.plugin.dependency;
+
+import java.io.File;
+import java.util.Set;
+
+import org.apache.maven.project.MavenProject;
+
+public class TestIncludeExcludeUnpackDependenciesMojo 
+	extends AbstractDependencyMojoTestCase
+{
+	private final String PACKED_FILE = "test.zip";
+	
+	private final String UNPACKED_FILE_PREFIX = "test";
+	private final String UNPACKED_FILE_SUFFIX = ".txt";
+	
+	private final String PACKED_FILE_PATH = "target/test-classes/unit/unpack-dependencies-test/"
+ PACKED_FILE;
+	
+	UnpackDependenciesMojo mojo;
+
+    protected void setUp()
+        throws Exception
+    {
+    	// required for mojo lookups to work
+        super.setUp( "unpack-dependencies", true );
+
+        File testPom = new File( getBasedir(), "target/test-classes/unit/unpack-dependencies-test/plugin-config.xml"
);
+        mojo = (UnpackDependenciesMojo) lookupMojo( "unpack-dependencies", testPom );
+        mojo.outputDirectory = new File( this.testDir, "outputDirectory" );
+        // mojo.silent = true;
+
+        // it needs to get the archivermanager
+        //stubFactory.setUnpackableFile( mojo.getArchiverManager() );
+        // i'm using one file repeatedly to archive so I can test the name
+        // programmatically.
+        stubFactory.setSrcFile( new File( getBasedir() + File.separatorChar + PACKED_FILE_PATH
) );
+
+        assertNotNull( mojo );
+        assertNotNull( mojo.getProject() );
+        MavenProject project = mojo.getProject();
+
+        Set artifacts = this.stubFactory.getScopedArtifacts();
+        Set directArtifacts = this.stubFactory.getReleaseAndSnapshotArtifacts();
+        artifacts.addAll( directArtifacts );
+
+        project.setArtifacts( artifacts );
+        project.setDependencyArtifacts( directArtifacts );
+        mojo.markersDirectory = new File( this.testDir, "markers" );
+
+    }
+    
+    protected void tearDown()
+    {
+        super.tearDown();
+        
+        mojo = null;
+        System.gc();
+    }
+    
+    private void assertUnpacked(boolean unpacked, String fileName)
+    {
+    	File destFile = new File( mojo.getOutputDirectory().getAbsolutePath() , fileName );
   	
+    	assertEquals(unpacked, destFile.exists());
+    }
+    
+    /**
+     * This test will validate that only the 1 and 11 files get unpacked
+     * @throws Exception
+     */
+    public void testUnpackIncludesManyFiles()
+		throws Exception
+	{
+    	mojo.setIncludes("**/*1" + UNPACKED_FILE_SUFFIX);
+    	mojo.execute();
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 1 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 11 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 2 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 3 + UNPACKED_FILE_SUFFIX);
+	}
+    
+    /**
+     * This test will verify only the 2 file gets unpacked
+     * @throws Exception
+     */
+    public void testUnpackIncludesSingleFile()
+    	throws Exception
+	{
+    	mojo.setIncludes("**/test2" + UNPACKED_FILE_SUFFIX);
+    	mojo.execute();
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 1 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 11 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 2 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 3 + UNPACKED_FILE_SUFFIX);
+	}
+    
+    /**
+     * This test will verify all files get unpacked
+     * @throws Exception
+     */
+    public void testUnpackIncludesAllFiles()
+    	throws Exception
+	{
+    	mojo.setIncludes("**/*");
+    	mojo.execute();
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 1 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 11 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 2 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 3 + UNPACKED_FILE_SUFFIX);
+	}
+    
+    /**
+     * This test will validate that only the 2 and 3 files get unpacked
+     * @throws Exception
+     */
+    public void testUnpackExcludesManyFiles()
+		throws Exception
+	{
+    	mojo.setExcludes("**/*1" + UNPACKED_FILE_SUFFIX);
+    	mojo.execute();
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 1 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 11 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 2 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 3 + UNPACKED_FILE_SUFFIX);
+	}
+    
+    /**
+     * This test will verify only the 1, 11 & 3 files get unpacked
+     * @throws Exception
+     */
+    public void testUnpackExcludesSingleFile()
+    	throws Exception
+	{
+    	mojo.setExcludes("**/test2" + UNPACKED_FILE_SUFFIX);
+    	mojo.execute();
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 1 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 11 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 2 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 3 + UNPACKED_FILE_SUFFIX);
+	}
+    
+    /**
+     * This test will verify no files get unpacked
+     * @throws Exception
+     */
+    public void testUnpackExcludesAllFiles()
+    	throws Exception
+	{
+    	mojo.setExcludes("**/*");
+    	mojo.execute();
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 1 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 11 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 2 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(false, UNPACKED_FILE_PREFIX + 3 + UNPACKED_FILE_SUFFIX);
+	}
+    
+    public void testNoIncludeExcludes()
+    	throws Exception
+	{
+    	mojo.execute();
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 1 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 11 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 2 + UNPACKED_FILE_SUFFIX);
+    	assertUnpacked(true, UNPACKED_FILE_PREFIX + 3 + UNPACKED_FILE_SUFFIX);
+	}
+}

Added: maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/test/resources/unit/unpack-dependencies-test/test.zip
URL: http://svn.apache.org/viewvc/maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/test/resources/unit/unpack-dependencies-test/test.zip?view=auto&rev=556791
==============================================================================
Binary file - no diff available.

Propchange: maven/plugins/branches/maven-dependency-plugin-MDEP-47/src/test/resources/unit/unpack-dependencies-test/test.zip
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



Mime
View raw message