You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sk...@apache.org on 2013/06/04 03:14:18 UTC
svn commit: r1489267 - in /maven/sandbox/trunk/dist-tools/dist-tool-plugin:
./ src/main/java/org/apache/maven/dist/tools/ src/site/markdown/
Author: skygo
Date: Tue Jun 4 01:14:18 2013
New Revision: 1489267
URL: http://svn.apache.org/r1489267
Log:
show some commands but layout not nice.
older check is wrong and need a better regex
Modified:
maven/sandbox/trunk/dist-tools/dist-tool-plugin/pom.xml
maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/ConfigurationLineInfo.java
maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteMojo.java
maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteTakeScreenMojo.java
maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSourceReleaseMojo.java
maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/site/markdown/todo.md
Modified: maven/sandbox/trunk/dist-tools/dist-tool-plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/dist-tools/dist-tool-plugin/pom.xml?rev=1489267&r1=1489266&r2=1489267&view=diff
==============================================================================
--- maven/sandbox/trunk/dist-tools/dist-tool-plugin/pom.xml (original)
+++ maven/sandbox/trunk/dist-tools/dist-tool-plugin/pom.xml Tue Jun 4 01:14:18 2013
@@ -232,8 +232,8 @@
<id>html</id>
<reports>
<!--<report>check-screen-site</report>-->
- <report>check-site</report>
- <!-- <report>check-source-release</report>-->
+ <report>check-site</report>
+ <report>check-source-release</report>
</reports>
</reportSet>
</reportSets>
Modified: maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/ConfigurationLineInfo.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/ConfigurationLineInfo.java?rev=1489267&r1=1489266&r2=1489267&view=diff
==============================================================================
--- maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/ConfigurationLineInfo.java (original)
+++ maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/ConfigurationLineInfo.java Tue Jun 4 01:14:18 2013
@@ -19,6 +19,10 @@ package org.apache.maven.dist.tools;
* under the License.
*/
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
/**
*
* @author skygo
@@ -30,6 +34,7 @@ class ConfigurationLineInfo
private final String artifactId;
private final String dist;
private static final String URLSEP = "/";
+ private MavenMetadata metadata;
public ConfigurationLineInfo( String groupId, String artifactId, String dist )
{
@@ -81,4 +86,26 @@ class ConfigurationLineInfo
{
return getBaseURL( repoBaseUrl, version + URLSEP + artifactId + "-" + version + ".pom" );
}
+
+ void addMetadata( MavenMetadata metadata )
+ {
+ this.metadata = metadata;
+ }
+
+ String getReleaseFromMetadata()
+ {
+
+ try
+ {
+ SimpleDateFormat dateFormatter = new SimpleDateFormat( "yyyyMMddkkmmss" );
+ Date f = dateFormatter.parse( metadata.versioning.lastUpdated );
+ SimpleDateFormat dateFormattertarget = new SimpleDateFormat( "MMM dd, yyyy" );
+ return dateFormattertarget.format( f );
+ }
+ catch ( ParseException ex )
+ {
+ return "Cannot parse";
+ }
+
+ }
}
Modified: maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteMojo.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteMojo.java?rev=1489267&r1=1489266&r2=1489267&view=diff
==============================================================================
--- maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteMojo.java (original)
+++ maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteMojo.java Tue Jun 4 01:14:18 2013
@@ -34,20 +34,12 @@ import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
-import org.apache.maven.artifact.repository.MavenArtifactRepository;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.dist.tools.checkers.HTMLChecker;
import org.apache.maven.dist.tools.checkers.HTMLCheckerFactory;
import org.apache.maven.doxia.sink.Sink;
import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.reporting.MavenReportException;
import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;
@@ -65,6 +57,7 @@ import org.jsoup.select.Elements;
public class DistCheckSiteMojo extends AbstractDistCheckMojo
{
private static final String MAVEN_SITE = "http://maven.apache.org";
+ private static final int HTTP_OK = 200;
@Override
public String getOutputName()
@@ -89,7 +82,7 @@ public class DistCheckSiteMojo extends A
private String url;
private Map<HTMLChecker, Boolean> checkMap = new HashMap<>();
- private int statusCode = 200;
+ private int statusCode = HTTP_OK;
private Document document;
public DistCheckSiteResult( ConfigurationLineInfo r, String version )
@@ -118,9 +111,9 @@ public class DistCheckSiteMojo extends A
return checkMap;
}
- private void setHTTPErrorUrl( int statusCode )
+ private void setHTTPErrorUrl( int status )
{
- this.statusCode = statusCode;
+ this.statusCode = status;
}
/**
@@ -133,7 +126,7 @@ public class DistCheckSiteMojo extends A
private void getSkins( Sink sink )
{
- if ( statusCode != 200 )
+ if ( statusCode != HTTP_OK )
{
sink.text( "None" );
}
@@ -146,10 +139,11 @@ public class DistCheckSiteMojo extends A
Node n = htmlTa.previousSibling();
if ( n instanceof Comment )
{
- text += (( Comment ) n).getData();
+ text += ( ( Comment ) n ).getData();
}
else
- { text += "Nothing";
+ {
+ text += "Nothing";
}
}
@@ -173,7 +167,7 @@ public class DistCheckSiteMojo extends A
private void getOverall( Sink sink )
{
- if ( statusCode != 200 )
+ if ( statusCode != HTTP_OK )
{
iconError( sink );
}
@@ -263,7 +257,7 @@ public class DistCheckSiteMojo extends A
sink.rawText( "URL" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
- sink.rawText( "Skins and comments on top of html (helping for date but not allways)" );
+ sink.rawText( "Skins and comments on top of html (helping for date but not always)" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.rawText( "Precise and overkill contents check summary details on your left ==>" );
@@ -290,9 +284,12 @@ public class DistCheckSiteMojo extends A
sink.tableCell();
sink.rawText( csr.getVersion() );
sink.tableCell_();
-
+
sink.tableCell();
- if ( csr.getStatusCode() != 200 )
+ sink.rawText( csr.getConfigurationLine().getReleaseFromMetadata() );
+ sink.tableCell_();
+ sink.tableCell();
+ if ( csr.getStatusCode() != HTTP_OK )
{
iconError( sink );
sink.rawText( "[" + csr.getStatusCode() + "] " );
@@ -393,7 +390,7 @@ public class DistCheckSiteMojo extends A
JAXBContext context = JAXBContext.newInstance( MavenMetadata.class );
Unmarshaller unmarshaller = context.createUnmarshaller();
MavenMetadata metadata = ( MavenMetadata ) unmarshaller.unmarshal( input );
-
+ configLine.addMetadata( metadata );
getLog().info( "Checking for site for artifact : " + configLine.getGroupId() + ":" + configLine.getArtifactId() + ":" + metadata.versioning.latest );
// revert sort versions (not handling alpha and complex vesion scheme but more usefull version are displayed left side
Collections.sort( metadata.versioning.versions, Collections.reverseOrder() );
Modified: maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteTakeScreenMojo.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteTakeScreenMojo.java?rev=1489267&r1=1489266&r2=1489267&view=diff
==============================================================================
--- maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteTakeScreenMojo.java (original)
+++ maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSiteTakeScreenMojo.java Tue Jun 4 01:14:18 2013
@@ -36,20 +36,12 @@ import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.apache.commons.io.FileUtils;
import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
-import org.apache.maven.artifact.repository.MavenArtifactRepository;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.dist.tools.checkers.HTMLChecker;
import org.apache.maven.dist.tools.checkers.HTMLCheckerFactory;
import org.apache.maven.doxia.sink.Sink;
import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.reporting.MavenReportException;
import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;
@@ -343,7 +335,7 @@ public class DistCheckSiteTakeScreenMojo
// revert sort versions (not handling alpha and complex vesion scheme but more usefull version are displayed left side
Collections.sort( metadata.versioning.versions, Collections.reverseOrder() );
getLog().warn( metadata.versioning.versions + " version(s) detected " + repoBaseUrl );
-
+ configLine.addMetadata( metadata );
// central
checkSite( configLine.getVersionnedPomFileURL( repoBaseUrl, metadata.versioning.latest ), configLine, metadata.versioning.latest );
Modified: maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSourceReleaseMojo.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSourceReleaseMojo.java?rev=1489267&r1=1489266&r2=1489267&view=diff
==============================================================================
--- maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSourceReleaseMojo.java (original)
+++ maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/main/java/org/apache/maven/dist/tools/DistCheckSourceReleaseMojo.java Tue Jun 4 01:14:18 2013
@@ -31,7 +31,10 @@ import java.util.Locale;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
+import org.apache.maven.doxia.markup.HtmlMarkup;
import org.apache.maven.doxia.sink.Sink;
+import org.apache.maven.doxia.sink.SinkEventAttributeSet;
+import org.apache.maven.doxia.sink.SinkEventAttributes;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.reporting.MavenReportException;
@@ -71,11 +74,14 @@ public class DistCheckSourceReleaseMojo
return "Verification of source release";
}
+
+
class DistCheckSourceRelease extends AbstractCheckResult
{
private List<String> central;
private List<String> dist;
+ private List<String> older;
public DistCheckSourceRelease( ConfigurationLineInfo r, String version )
{
@@ -91,6 +97,11 @@ public class DistCheckSourceReleaseMojo
{
central = checkRepos;
}
+
+ private void setOlderSourceRelease( List<String> checkRepos )
+ {
+ older = checkRepos;
+ }
}
private List<DistCheckSourceRelease> results = new LinkedList<>();
@@ -121,6 +132,9 @@ public class DistCheckSourceReleaseMojo
sink.paragraph();
sink.text( "Check Source Release (= artifactId + version + '-source-release.zip[.asc|.md5]') availability in:" );
sink.paragraph_();
+ sink.paragraph();
+ sink.text( "cli command and olders artifact exploration is Work In Progress" );
+ sink.paragraph_();
sink.list();
sink.listItem();
sink.link( repoBaseUrl );
@@ -146,11 +160,17 @@ public class DistCheckSourceReleaseMojo
sink.rawText( "LATEST" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
+ sink.rawText( "DATE" );
+ sink.tableHeaderCell_();
+ sink.tableHeaderCell();
sink.rawText( "central" );
sink.tableHeaderCell_();
sink.tableHeaderCell();
sink.rawText( "dist" );
sink.tableHeaderCell_();
+ sink.tableHeaderCell();
+ sink.rawText( "Older in dist REGEX ISSUE NO TRUST (mainly for doxia) " );
+ sink.tableHeaderCell_();
sink.tableRow_();
for ( DistCheckSourceRelease csr : results )
@@ -159,7 +179,8 @@ public class DistCheckSourceReleaseMojo
sink.tableRow();
sink.tableCell();
- sink.rawText( csr.getConfigurationLine().getGroupId() );
+ // shorten groupid
+ sink.rawText( csr.getConfigurationLine().getGroupId().replaceAll( "org.apache.maven", "o.a.m" ) );
sink.tableCell_();
sink.tableCell();
sink.rawText( csr.getConfigurationLine().getArtifactId() );
@@ -169,7 +190,11 @@ public class DistCheckSourceReleaseMojo
sink.rawText( csr.getVersion() );
sink.link_();
sink.tableCell_();
-
+
+ sink.tableCell();
+ sink.rawText( csr.getConfigurationLine().getReleaseFromMetadata() );
+ sink.tableCell_();
+
sink.tableCell();
sink.link( cli.getBaseURL( repoBaseUrl, "" ) );
sink.text( "artifact" );
@@ -194,7 +219,7 @@ public class DistCheckSourceReleaseMojo
sink.rawText( missing );
}
sink.tableCell_();
-
+ // dist
sink.tableCell();
sink.link( cli.getDist() );
sink.text( cli.getDist().substring( DIST_AREA.length() ) );
@@ -208,14 +233,64 @@ public class DistCheckSourceReleaseMojo
{
iconWarning( sink );
}
+ StringBuilder cliMissing = new StringBuilder();
for ( String missing : csr.dist )
{
sink.lineBreak();
iconError( sink );
sink.rawText( missing );
+ cliMissing.append( "\nwget -O " ).append( cli.getVersionnedFolderURL( repoBaseUrl, csr.getVersion() ) ).
+ append( "/" ).append( missing );
+ cliMissing.append( "\nsvn co " ).append( missing );
+ }
+ if ( !cliMissing.toString().isEmpty() )
+ {
+ sink.lineBreak();
+ SinkEventAttributeSet atts = new SinkEventAttributeSet();
+ sink.unknown( "pre", new Object[]
+ {
+ new Integer( HtmlMarkup.TAG_TYPE_START )
+ }, atts );
+ sink.text( cliMissing.toString() );
+ sink.unknown( "pre", new Object[]{new Integer( HtmlMarkup.TAG_TYPE_END )}, null );
}
sink.tableCell_();
-
+ //older
+ sink.tableCell();
+ sink.link( cli.getDist() );
+ sink.text( cli.getDist().substring( DIST_AREA.length() ) );
+ sink.link_();
+ sink.text( "source-release" );
+ if ( csr.dist.isEmpty() )
+ {
+ iconSuccess( sink );
+ }
+ else
+ {
+ iconWarning( sink );
+ }
+
+ StringBuilder cliOlder = new StringBuilder();
+ for ( String missing : csr.older )
+ {
+ sink.lineBreak();
+ iconError( sink );
+ sink.rawText( missing );
+ cliOlder.append( "\nsvn rm " ).append( missing );
+ }
+ if ( !cliOlder.toString().isEmpty() )
+ {
+ sink.lineBreak();
+ SinkEventAttributeSet atts = new SinkEventAttributeSet();
+ sink.unknown( "pre", new Object[]
+ {
+ new Integer( HtmlMarkup.TAG_TYPE_START )
+ }, atts );
+ sink.text( cliOlder.toString() );
+ sink.unknown( "pre", new Object[]{new Integer( HtmlMarkup.TAG_TYPE_END )}, null );
+ }
+
+ sink.tableCell_();
sink.tableRow_();
}
sink.table_();
@@ -223,7 +298,44 @@ public class DistCheckSourceReleaseMojo
sink.flush();
sink.close();
}
+
+ private List<String> checkOldinRepos( String repourl, ConfigurationLineInfo r, String version ) throws IOException
+ {
+ Document doc = Jsoup.connect( repourl ).get();
+ Elements links = doc.select( "a[href]" );
+ List<String> expectedFile = new LinkedList<>();
+ List<String> retrievedFile = new LinkedList<>();
+ // http://maven.apache.org/developers/release/maven-project-release-procedure.html#Copy_the_source_release_to_the_Apache_Distribution_Area
+ // build source artifact name
+ expectedFile.add( r.getArtifactId() + "-" + version + "-source-release.zip" );
+ expectedFile.add( r.getArtifactId() + "-" + version + "-source-release.zip.asc" );
+ expectedFile.add( r.getArtifactId() + "-" + version + "-source-release.zip.md5" );
+
+
+
+ for ( Element e : links )
+ {
+ String art = e.attr( "href" );
+ // need a regex no strong enough
+ if ( art.startsWith( r.getArtifactId() + "-" ) && (art.endsWith( "-source-release.zip" )
+ || art.endsWith( "-source-release.zip.asc" )
+ || art.endsWith( "-source-release.zip.md5" )) )
+ //if (art.matches( "^"+r.getArtifactId()+"-\d.-source-release.zip[]"))
+ {
+ retrievedFile.add( e.attr( "href" ) );
+ }
+ }
+ retrievedFile.removeAll( expectedFile );
+ if ( !expectedFile.isEmpty() )
+ {
+ for ( String sourceItem : expectedFile )
+ {
+ getLog().error( "Older:" + sourceItem + " in " + repourl );
+ }
+ }
+ return retrievedFile;
+ }
private List<String> checkRepos( String repourl, ConfigurationLineInfo r, String version ) throws IOException
{
Document doc = Jsoup.connect( repourl ).get();
@@ -254,24 +366,26 @@ public class DistCheckSourceReleaseMojo
}
@Override
- void checkArtifact( ConfigurationLineInfo r, String repoBaseUrl ) throws MojoExecutionException
+ void checkArtifact( ConfigurationLineInfo configLine, String repoBaseUrl ) throws MojoExecutionException
{
- try ( BufferedReader input = new BufferedReader( new InputStreamReader( new URL( r.getMetadataFileURL( repoBaseUrl ) ).openStream() ) ) )
+ try ( BufferedReader input = new BufferedReader( new InputStreamReader( new URL( configLine.getMetadataFileURL( repoBaseUrl ) ).openStream() ) ) )
{
JAXBContext context = JAXBContext.newInstance( MavenMetadata.class );
Unmarshaller unmarshaller = context.createUnmarshaller();
MavenMetadata metadata = ( MavenMetadata ) unmarshaller.unmarshal( input );
- getLog().info( "Checking for artifact : " + r.getGroupId() + ":" + r.getArtifactId() + ":" + metadata.versioning.latest );
+ getLog().info( "Checking for artifact : " + configLine.getGroupId() + ":" + configLine.getArtifactId() + ":" + metadata.versioning.latest );
// revert sort versions (not handling alpha and complex vesion scheme but more usefull version are displayed left side
Collections.sort( metadata.versioning.versions, Collections.reverseOrder() );
getLog().warn( metadata.versioning.versions + " version(s) detected " + repoBaseUrl );
- DistCheckSourceRelease result = new DistCheckSourceRelease( r, metadata.versioning.latest );
+ configLine.addMetadata( metadata );
+ DistCheckSourceRelease result = new DistCheckSourceRelease( configLine, metadata.versioning.latest );
results.add( result );
// central
- result.setMisingCentralSourceRelease( checkRepos( r.getVersionnedFolderURL( repoBaseUrl, metadata.versioning.latest ), r, metadata.versioning.latest ) );
+ result.setMisingCentralSourceRelease( checkRepos( configLine.getVersionnedFolderURL( repoBaseUrl, metadata.versioning.latest ), configLine, metadata.versioning.latest ) );
//dist
- result.setMissingDistSourceRelease( checkRepos( r.getDist(), r, metadata.versioning.latest ) );
+ result.setMissingDistSourceRelease( checkRepos( configLine.getDist(), configLine, metadata.versioning.latest ) );
+ result.setOlderSourceRelease( checkOldinRepos( configLine.getDist(), configLine, metadata.versioning.latest ) );
}
catch ( MalformedURLException ex )
{
Modified: maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/site/markdown/todo.md
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/site/markdown/todo.md?rev=1489267&r1=1489266&r2=1489267&view=diff
==============================================================================
--- maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/site/markdown/todo.md (original)
+++ maven/sandbox/trunk/dist-tools/dist-tool-plugin/src/site/markdown/todo.md Tue Jun 4 01:14:18 2013
@@ -6,17 +6,22 @@ Todo
# Source Release
* add date of release (from artifact)
+ -- date from metadata is ok ?
* Check older artifact in dist (only latest should be present, previous version removed)
* Shell command for cleaning older artifacts
# Sites
* Check if artifact versions are up to date in /plugins/, /shared/, /pom/ and so on
+ -- [sky] not sure to get your point :)
* remove "check if version present", since our inheritance ensures we don't have problems
+ -- [sky] kept only for precise layout check
* replace Skins columns with one unique column "Skin used", showing which skin is used (with version)
- -- [RE] no garantee some site like http://maven.apache.org/plugins/maven-one-plugin/ have no style header
+ -- [sky] no garantee some site like http://maven.apache.org/plugins/maven-one-plugin/ have no style header
* add date of release (from artifact)
+ -- [sky] date from metadata is ok ?
* add date of site
+ -- [sky] date from comment part in skin (no always ok :( )
# (for-fun)
* take screenshot of site. ( os specific )