diff agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java @ 12:662a0be55de7

- source indexing works! - few tests added
author Evgeniy.Koshkin
date Tue, 30 Jul 2013 22:10:30 +0400
parents 5fb218a7e574
children 5856cab1ca05
line wrap: on
line diff
--- a/agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java	Thu Jul 25 19:11:53 2013 +0400
+++ b/agent/src/jetbrains/buildServer/symbols/SymbolsIndexer.java	Tue Jul 30 22:10:30 2013 +0400
@@ -26,8 +26,6 @@
   private static final Logger LOG = Logger.getLogger(SymbolsIndexer.class);
 
   public static final String PDB_FILE_EXTENSION = "pdb";
-  public static final String EXE_FILE_EXTENSION = "exe";
-  public static final String DLL_FILE_EXTENSION = "dll";
 
   public static final String SYMBOLS_EXE = "JetBrains.CommandLine.Symbols.exe";
   public static final String DUMP_SYMBOL_SIGN_CMD = "dumpSymbolSign";
@@ -35,33 +33,31 @@
   @NotNull private final ArtifactsWatcher myArtifactsWatcher;
   @NotNull private final File myNativeToolPath;
   @Nullable private AgentRunningBuild myBuild;
-  @Nullable private Collection<File> myBinariesToProcess;
   @Nullable private Collection<File> mySymbolsToProcess;
 
   public SymbolsIndexer(@NotNull final PluginDescriptor pluginDescriptor, @NotNull final EventDispatcher<AgentLifeCycleListener> agentDispatcher, @NotNull final ArtifactsWatcher artifactsWatcher) {
+    myArtifactsWatcher = artifactsWatcher;
     myNativeToolPath = new File(new File(pluginDescriptor.getPluginRoot(), "bin"), SYMBOLS_EXE);
-    myArtifactsWatcher = artifactsWatcher;
+
     agentDispatcher.addListener(new AgentLifeCycleAdapter() {
       @Override
       public void buildStarted(@NotNull final AgentRunningBuild runningBuild) {
         myBuild = runningBuild;
-        myBinariesToProcess = new HashSet<File>();
         mySymbolsToProcess = new HashSet<File>();
       }
 
       @Override
       public void afterAtrifactsPublished(@NotNull AgentRunningBuild build, @NotNull BuildFinishedStatus buildStatus) {
         super.afterAtrifactsPublished(build, buildStatus);
-        if (myBuild == null || mySymbolsToProcess == null || myBinariesToProcess == null) return;
+        if (myBuild == null || mySymbolsToProcess == null) return;
         if(myBuild.getBuildFeaturesOfType(SymbolsConstants.BUILD_FEATURE_TYPE).isEmpty()) return;
 
         if (mySymbolsToProcess.isEmpty()) {
           myBuild.getBuildLogger().warning("Symbols weren't found in artifacts to be published.");
           LOG.debug("Symbols weren't found in artifacts to be published.");
         } else {
-          final File targetDir = myBuild.getBuildTempDirectory();
           try {
-            final File symbolSignaturesFile = dumpSymbolSignatures(mySymbolsToProcess, targetDir, myBuild.getBuildLogger());
+            final File symbolSignaturesFile = dumpSymbolSignatures(mySymbolsToProcess, myBuild.getBuildTempDirectory(), myBuild.getBuildLogger());
             if(symbolSignaturesFile.exists()){
               myArtifactsWatcher.addNewArtifactsPath(symbolSignaturesFile + "=>" + ".teamcity/symbols");
             }
@@ -72,7 +68,6 @@
           }
         }
         mySymbolsToProcess = null;
-        myBinariesToProcess = null;
         myBuild = null;
       }
     });
@@ -81,17 +76,26 @@
   @Override
   public void afterCollectingFiles(@NotNull List<ArtifactsCollection> artifacts) {
     super.afterCollectingFiles(artifacts);
-    if(myBuild == null || mySymbolsToProcess == null || myBinariesToProcess == null) return;
+    if(myBuild == null || mySymbolsToProcess == null) return;
     if(myBuild.getBuildFeaturesOfType(SymbolsConstants.BUILD_FEATURE_TYPE).isEmpty()){
       myBuild.getBuildLogger().warning(SymbolsConstants.BUILD_FEATURE_TYPE + " build feature disabled. No indexing performed.");
       LOG.debug(SymbolsConstants.BUILD_FEATURE_TYPE + " build feature disabled. No indexing performed.");
       return;
     }
-    myBuild.getBuildLogger().message(SymbolsConstants.BUILD_FEATURE_TYPE + " build feature enabled. Searching for suitable files.");
     LOG.debug(SymbolsConstants.BUILD_FEATURE_TYPE + " build feature enabled. Searching for suitable files.");
-    mySymbolsToProcess.addAll(getArtifactPathsByFileExtension(artifacts, PDB_FILE_EXTENSION));
-    myBinariesToProcess.addAll(getArtifactPathsByFileExtension(artifacts, EXE_FILE_EXTENSION));
-    myBinariesToProcess.addAll(getArtifactPathsByFileExtension(artifacts, DLL_FILE_EXTENSION));
+    Collection<File> pdbFiles = getArtifactPathsByFileExtension(artifacts, PDB_FILE_EXTENSION);
+    final PdbFilePatcher pdbFilePatcher = new PdbFilePatcher(myBuild.getBuildTempDirectory(), new SrcSrvStreamProvider(myBuild.getBuildId(), myBuild.getCheckoutDirectory()));
+    for(File pdbFile : pdbFiles){
+      try {
+        myBuild.getBuildLogger().message("Indexing sources appeared in file " + pdbFile.getAbsolutePath());
+        pdbFilePatcher.patch(pdbFile);
+        mySymbolsToProcess.add(pdbFile);
+      } catch (Throwable e) {
+        LOG.error("Error occurred while patching symbols file " + pdbFile, e);
+        myBuild.getBuildLogger().error("Error occurred while patching symbols file " + pdbFile);
+        myBuild.getBuildLogger().exception(e);
+      }
+    }
   }
 
   private Collection<File> getArtifactPathsByFileExtension(List<ArtifactsCollection> artifactsCollections, String fileExtension){
@@ -108,11 +112,11 @@
 
   private File dumpSymbolSignatures(Collection<File> files, File targetDir, BuildProgressLogger buildLogger) throws IOException {
     final File tempFile = FileUtil.createTempFile(targetDir, "symbol-signatures-", ".xml", false);
-    runTool(DUMP_SYMBOL_SIGN_CMD, files, tempFile, buildLogger);
+    runNativeTool(DUMP_SYMBOL_SIGN_CMD, files, tempFile, buildLogger);
     return tempFile;
   }
 
-  private void runTool(String cmd, Collection<File> files, File output, BuildProgressLogger buildLogger){
+  private void runNativeTool(String cmd, Collection<File> files, File output, BuildProgressLogger buildLogger){
     final GeneralCommandLine commandLine = new GeneralCommandLine();
     commandLine.setExePath(myNativeToolPath.getPath());
     commandLine.addParameter(cmd);