changeset 22:0d6f27953b30

synchronization fixes
author Pavel.Sher
date Thu, 17 Jul 2008 00:58:04 +0400
parents c76d6a2b27f6
children 3ddf410c2fd6
files mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/BaseCommandTestCase.java mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CatCommand.java mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/PullCommand.java mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/Settings.java mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/StatusCommand.java mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/TipCommand.java mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/UpdateCommand.java
diffstat 9 files changed, 33 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/BaseCommandTestCase.java	Thu Jul 17 00:44:10 2008 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/BaseCommandTestCase.java	Thu Jul 17 00:58:04 2008 +0400
@@ -23,10 +23,10 @@
     settings.setRepository(repository.getAbsolutePath());
     TempFiles tf = new TempFiles();
     File parentDir = tf.createTempDir();
-    settings.setWorkingDir(new File(parentDir, "rep").getAbsolutePath());
+    settings.setWorkingDir(new File(parentDir, "rep").getAbsoluteFile());
     try {
       CloneCommand cl = new CloneCommand(settings);
-      cl.setDestDir(settings.getWorkingDir());
+      cl.setDestDir(settings.getWorkingDir().getAbsolutePath());
       cl.execute();
 
       return executor.execute(settings);
--- a/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Thu Jul 17 00:44:10 2008 +0400
+++ b/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Thu Jul 17 00:58:04 2008 +0400
@@ -62,7 +62,7 @@
     File workFoldersParent = new File(myServerPaths.getCachesDir(), "mercurial");
     if (!workFoldersParent.isDirectory()) return;
 
-    Set<File> dirNames = new HashSet<File>();
+    Set<File> workDirs = new HashSet<File>();
     File[] files = workFoldersParent.listFiles(new FileFilter() {
       public boolean accept(final File file) {
         return file.isDirectory() && file.getName().startsWith(Settings.DEFAULT_WORK_DIR_PREFIX);
@@ -70,19 +70,24 @@
     });
     if (files != null) {
       for (File f: files) {
-        dirNames.add(FileUtil.getCanonicalFile(f));
+        workDirs.add(FileUtil.getCanonicalFile(f));
       }
     }
 
     for (VcsRoot vcsRoot: myVcsManager.getAllRegisteredVcsRoots()) {
       if (getName().equals(vcsRoot.getVcsName())) {
         Settings s = new Settings(myServerPaths, vcsRoot);
-        dirNames.remove(FileUtil.getCanonicalFile(new File(s.getWorkingDir())));
+        workDirs.remove(FileUtil.getCanonicalFile(s.getWorkingDir()));
       }
     }
 
-    for (File f: dirNames) {
-      FileUtil.delete(f);
+    for (File f: workDirs) {
+      lockWorkDir(f);
+      try {
+        FileUtil.delete(f);
+      } finally {
+        unlockWorkDir(f);
+      }
     }
   }
 
@@ -378,17 +383,17 @@
   // updates current working copy of repository by pulling changes from the repository specified in VCS root
   private void updateWorkingDirectory(final VcsRoot root) throws VcsException {
     Settings settings = new Settings(myServerPaths, root);
-    String workDir = settings.getWorkingDir();
+    File workDir = settings.getWorkingDir();
     lockWorkDir(workDir);
     try {
-      if (hasRepositoryCopy(new File(workDir))) {
+      if (hasRepositoryCopy(workDir)) {
         // update
         PullCommand pull = new PullCommand(settings);
         pull.execute();
       } else {
         // clone
         CloneCommand cl = new CloneCommand(settings);
-        cl.setDestDir(workDir);
+        cl.setDestDir(workDir.getAbsolutePath());
         cl.setUpdateWorkingDir(false);
         cl.execute();
       }
@@ -397,19 +402,20 @@
     }
   }
 
-  private void lockWorkDir(@NotNull String workDir) {
+  private void lockWorkDir(@NotNull File workDir) {
     getWorkDirLock(workDir).lock();
   }
 
-  private void unlockWorkDir(@NotNull String workDir) {
+  private void unlockWorkDir(@NotNull File workDir) {
     getWorkDirLock(workDir).unlock();
   }
 
-  private Lock getWorkDirLock(final String workDir) {
-    Lock lock = myWorkDirLocks.get(workDir);
+  private Lock getWorkDirLock(final File workDir) {
+    String path = workDir.getAbsolutePath();
+    Lock lock = myWorkDirLocks.get(path);
     if (lock == null) {
       lock = new ReentrantLock();
-      Lock curLock = myWorkDirLocks.putIfAbsent(workDir, lock);
+      Lock curLock = myWorkDirLocks.putIfAbsent(path, lock);
       if (curLock != null) {
         lock = curLock;
       }
--- a/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CatCommand.java	Thu Jul 17 00:44:10 2008 +0400
+++ b/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/CatCommand.java	Thu Jul 17 00:58:04 2008 +0400
@@ -37,7 +37,7 @@
 
     GeneralCommandLine cli = new GeneralCommandLine();
     cli.setExePath(mySettings.getHgCommandPath());
-    cli.setWorkDirectory(mySettings.getWorkingDir());
+    cli.setWorkDirectory(mySettings.getWorkingDir().getAbsolutePath());
     cli.addParameter("cat");
     cli.addParameter("-o");
     cli.addParameter(tempDir.getAbsolutePath() + File.separator + "%p");
--- a/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java	Thu Jul 17 00:44:10 2008 +0400
+++ b/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/LogCommand.java	Thu Jul 17 00:58:04 2008 +0400
@@ -39,7 +39,7 @@
   public List<ChangeSet> execute() throws VcsException {
     GeneralCommandLine cli = new GeneralCommandLine();
     cli.setExePath(mySettings.getHgCommandPath());
-    cli.setWorkDirectory(mySettings.getWorkingDir());
+    cli.setWorkDirectory(mySettings.getWorkingDir().getAbsolutePath());
     cli.addParameter("log");
     cli.addParameter("-r");
     String from = myFromId;
--- a/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/PullCommand.java	Thu Jul 17 00:44:10 2008 +0400
+++ b/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/PullCommand.java	Thu Jul 17 00:58:04 2008 +0400
@@ -18,7 +18,7 @@
   public void execute() throws VcsException {
     GeneralCommandLine cli = new GeneralCommandLine();
     cli.setExePath(mySettings.getHgCommandPath());
-    cli.setWorkDirectory(mySettings.getWorkingDir());
+    cli.setWorkDirectory(mySettings.getWorkingDir().getAbsolutePath());
     cli.addParameter("pull");
     cli.addParameter(mySettings.getRepository());
     CommandUtil.runCommand(cli);
--- a/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/Settings.java	Thu Jul 17 00:44:10 2008 +0400
+++ b/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/Settings.java	Thu Jul 17 00:58:04 2008 +0400
@@ -17,7 +17,7 @@
   private String myRepository;
   private String myHgCommandPath;
   private ServerPaths myServerPaths;
-  private String myWorkingDir;
+  private File myWorkingDir;
 
   public Settings(@NotNull ServerPaths paths, @NotNull VcsRoot vcsRoot) {
     myServerPaths = paths;
@@ -54,8 +54,8 @@
     myHgCommandPath = hgCommandPath;
   }
 
-  public void setWorkingDir(@NotNull final String workingDir) {
-    myWorkingDir = workingDir;
+  public void setWorkingDir(@NotNull final File workingDir) {
+    myWorkingDir = FileUtil.getCanonicalFile(workingDir);
   }
 
   /**
@@ -63,7 +63,7 @@
    * @return repository working directory
    */
   @NotNull
-  public String getWorkingDir() {
+  public File getWorkingDir() {
     if (myWorkingDir != null) {
       return myWorkingDir;
     }
@@ -73,13 +73,13 @@
 
   public static String DEFAULT_WORK_DIR_PREFIX = "hg_";
 
-  private static String getDefaultWorkDir(@NotNull ServerPaths serverPaths, @NotNull String repPath) {
+  private static File getDefaultWorkDir(@NotNull ServerPaths serverPaths, @NotNull String repPath) {
     String workingDirname = DEFAULT_WORK_DIR_PREFIX + String.valueOf(Hash.calc(normalize(repPath)));
     File workFoldersRootDir = new File(serverPaths.getCachesDir(), "mercurial");
     if (!workFoldersRootDir.mkdirs() && !workFoldersRootDir.isDirectory()) {
       throw new RuntimeException("Cannot create directory: " + workFoldersRootDir.getAbsolutePath());
     }
-    return FileUtil.getCanonicalFile(new File(workFoldersRootDir, workingDirname)).getAbsolutePath();
+    return FileUtil.getCanonicalFile(new File(workFoldersRootDir, workingDirname));
   }
 
   private static String normalize(final String path) {
--- a/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/StatusCommand.java	Thu Jul 17 00:44:10 2008 +0400
+++ b/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/StatusCommand.java	Thu Jul 17 00:58:04 2008 +0400
@@ -28,7 +28,7 @@
   public List<ModifiedFile> execute() throws VcsException {
     GeneralCommandLine cli = new GeneralCommandLine();
     cli.setExePath(mySettings.getHgCommandPath());
-    cli.setWorkDirectory(mySettings.getWorkingDir());
+    cli.setWorkDirectory(mySettings.getWorkingDir().getAbsolutePath());
     cli.addParameter("status");
     cli.addParameter("--rev");
     String from = myFromId;
--- a/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/TipCommand.java	Thu Jul 17 00:44:10 2008 +0400
+++ b/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/TipCommand.java	Thu Jul 17 00:58:04 2008 +0400
@@ -22,7 +22,7 @@
   @NotNull
   public ChangeSet execute() throws VcsException {
     GeneralCommandLine cli = new GeneralCommandLine();
-    cli.setWorkDirectory(mySettings.getWorkingDir());
+    cli.setWorkDirectory(mySettings.getWorkingDir().getAbsolutePath());
     cli.setExePath(mySettings.getHgCommandPath());
     cli.addParameter("tip");
     ExecResult res = CommandUtil.runCommand(cli);
--- a/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/UpdateCommand.java	Thu Jul 17 00:44:10 2008 +0400
+++ b/mercurial/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/command/UpdateCommand.java	Thu Jul 17 00:58:04 2008 +0400
@@ -14,7 +14,7 @@
   public void execute() throws VcsException {
     GeneralCommandLine cli = new GeneralCommandLine();
     cli.setExePath(mySettings.getHgCommandPath());
-    cli.setWorkDirectory(mySettings.getWorkingDir());
+    cli.setWorkDirectory(mySettings.getWorkingDir().getAbsolutePath());
     cli.addParameter("update");
     cli.addParameter("-C");
     CommandUtil.runCommand(cli);