mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

jvergara
22.30.2007 b54e25e8af0e73b7ddaca4eaec088803ea6a7e4f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at
 * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
 * add the following below this CDDL HEADER, with the fields enclosed
 * by brackets "[]" replaced with your own identifying * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Portions Copyright 2007 Sun Microsystems, Inc.
 */
package org.opends.build.tools;
 
 
 
import java.io.File;
import java.util.LinkedList;
 
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.FileSet;
 
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.wc.SVNPropertyData;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNStatus;
import org.tmatesoft.svn.core.wc.SVNStatusClient;
import org.tmatesoft.svn.core.wc.SVNStatusType;
import org.tmatesoft.svn.core.wc.SVNWCClient;
 
 
 
/**
 * This class provides an implementation of an Ant task that may be used to
 * verify that any file marked for addition to the repository has the
 * "svn:eol-style" property set with a value of "native".
 */
public class CheckEOLStyle
       extends Task
{
  /**
   * The name of the system property that may be used to prevent property
   * errors from failing the build.
   */
  public static final String IGNORE_ERRORS_PROPERTY =
       "org.opends.server.IgnoreEOLStyleErrors";
 
 
 
  // A list of all the filesets to be checked.
  private LinkedList<FileSet> filesetList = new LinkedList<FileSet>();
 
  // The path to the root of the Subversion workspace to check.
  private String workspace = null;
 
 
 
  /**
   * Adds the provided fileset to the list of filesets that should be checked.
   *
   * @param  fileset  A fileset containing a list of files that should be
   *                  checked.
   */
  public void addFileset(FileSet fileset)
  {
    filesetList.add(fileset);
  }
 
 
 
  /**
   * Specifies the path to the root of the Subversion workspace to check.
   *
   * @param  workspace  The path to the root of the Subversion workspace to
   *                    check.
   */
  public void setWorkspace(String workspace)
  {
    this.workspace = workspace;
  }
 
 
 
  /**
   * Performs the appropriate processing needed for this task.  In this case,
   * it uses SVNKit to identify all files marked for addition to the Subversion
   * repository and verify that the file has the svn:eol-style property set with
   * a value of native.
   */
  @Override()
  public void execute()
  {
    // Make sure that at least one fileset was provided.
    if (filesetList.isEmpty())
    {
      throw new BuildException("ERROR:  No filesets were specified to " +
                               "indicate which files should be checked.");
    }
 
 
    File workspacePath;
    if ((workspace == null) || (workspace.length() == 0))
    {
      workspacePath = getProject().getBaseDir();
    }
    else
    {
      workspacePath = new File(workspace);
    }
    String workspacePathString = workspacePath.getAbsolutePath() +
                                 File.separator;
 
 
    // Get the current status for all files in the fileset.  For any files
    // marked for addition, check the svn:eol-style property.
    SVNStatusClient statusClient   = new SVNStatusClient(null, null);
    SVNWCClient     propertyClient = new SVNWCClient(null, null);
 
    LinkedList<String> problemFiles = new LinkedList<String>();
    for (FileSet fileSet : filesetList)
    {
      DirectoryScanner scanner = fileSet.getDirectoryScanner(getProject());
      for (String relativePath : scanner.getIncludedFiles())
      {
        String filePath = scanner.getBasedir() + File.separator + relativePath;
        File targetFile = new File(filePath);
 
        try
        {
          SVNStatus svnStatus = statusClient.doStatus(targetFile, false);
          if (svnStatus == null)
          {
            System.err.println("WARNING:  Could not determine Subversion " +
                               "status for file " + filePath);
            System.err.println("No further EOL style checking will be " +
                               "performed.");
            return;
          }
 
          SVNStatusType statusType = svnStatus.getContentsStatus();
          if (statusType == SVNStatusType.STATUS_ADDED)
          {
            SVNPropertyData propertyData =
                 propertyClient.doGetProperty(targetFile, "svn:eol-style",
                                              SVNRevision.BASE,
                                              SVNRevision.WORKING, false);
            if ((propertyData == null) ||
                (! propertyData.getValue().equals("native")))
            {
              problemFiles.add(filePath);
            }
          }
        }
        catch (SVNException svnException)
        {
          System.err.println("WARNING:  Could not check eol-style property " +
                             "for file " + filePath + ":  " + svnException);
          System.err.println("No further EOL style checking will be " +
                             "performed.");
          return;
        }
      }
    }
 
 
    if (! problemFiles.isEmpty())
    {
      System.err.println("WARNING:  Property 'svn:eol-style' not set to " +
                         "'native' for the following files:");
      for (String filename : problemFiles)
      {
        System.err.println("     " + filename);
      }
 
      String ignoreStr = getProject().getProperty(IGNORE_ERRORS_PROPERTY);
      if ((ignoreStr == null) || (! ignoreStr.equalsIgnoreCase("true")))
      {
        throw new BuildException("Fix these reported problems before " +
                                 "proceeding, or use '-D" +
                                 IGNORE_ERRORS_PROPERTY + "=true' to " +
                                 "ignore svn:eol-style warnings.");
      }
    }
  }
}