001package org.vishia.vcs; 002 003import java.io.File; 004import java.io.FileNotFoundException; 005import java.io.IOException; 006import java.util.Map; 007 008import org.vishia.util.DataAccess; 009import org.vishia.util.FileSystem; 010import org.vishia.util.StringPartScan; 011 012public class Bzr 013{ 014 /**Searches the repository starting from startDir in outer direction. 015 * If the startDir contains a ".bzr" directory, it is the repository. 016 * If any parent dir contains it, bzrdir will be set to the parent dir. 017 * If startDir or any parent contains a file ".bzr.bat" and does not contain a ".bzr" dir, 018 * that file is read in to find out where the repository is located. 019 * It is the line which contains "bzr_mvExpl.bat BZRDIR". 020 * The BZRDIR should be relative to a system width defined location of all repositories. 021 * This routine does not deal with them, only returns the relativ path. 022 * 023 * 024 * @param startDir The start directory where to find the ".bzr" 025 * @param dst A map which contains variables, the result will be put into. 026 * @param bzrdir Name of the variable for dst to put the absolute path of the ".bzr" or ".bzr.bat"-location 027 * @param bzrsrc Name of the variable for dst to put the relativ ".bzr" location find out in the ".bzr.bat". 028 * This variable is put with "$" if a ".bzr" is found in bzrdir. 029 * @return null if success, an error message if ".bzr" or ".bzr.bat" was not found. 030 * @throws IOException on any unexpected exception. 031 * @throws IllegalAccessException 032 */ 033 public static String searchRepository(File startDir, Map<String, DataAccess.Variable<Object>> dst, String bzrdir, String bzrsrc) 034 throws IOException, IllegalAccessException 035 { File fBzr; 036 File currDir = startDir.isDirectory() ? startDir : startDir.getParentFile(); 037 String ret = null; 038 //search whether a .bzr or .bzr.bat exists and change to parent dir till it is found. 039 do{ 040 fBzr = new File(currDir, ".bzr.bat"); 041 if(!fBzr.exists()){ 042 fBzr = new File(currDir, "_bzr.bat"); 043 if(!fBzr.exists()){ 044 fBzr = new File(currDir, ".bzr"); 045 if(!fBzr.exists()){ 046 try{ 047 currDir = FileSystem.getDirectory(currDir); //NOTE: currDir.getParent() is not successfully on relative dir "." 048 } catch(FileNotFoundException exc){ currDir = null;} 049 } 050 } 051 } 052 } while(!fBzr.exists() && currDir !=null); 053 if(currDir ==null){ 054 throw new IOException("Bzr.searchRepository - .bzr... not found ;" + startDir.getAbsolutePath()); 055 } else { 056 String sBzrDir = FileSystem.getCanonicalPath(currDir); 057 DataAccess.createOrReplaceVariable(dst, bzrdir, 'S', sBzrDir, true); 058 //dst.put(bzrdir, sBzrDir); 059 if(!fBzr.getName().equals(".bzr")){ //one of the batch files found 060 ret = FileSystem.readFile(fBzr); 061 String sLine = FileSystem.grep1line(fBzr, "bzr_mvExpl.bat"); 062 if(sLine !=null){ 063 int pos = sLine.indexOf("bzr_mvExpl.bat"); 064 String sBzrSrc = sLine.substring(pos + 15).trim(); 065 DataAccess.createOrReplaceVariable(dst, bzrsrc, 'S', sBzrSrc, true); 066 //dst.put(bzrsrc, sBzrSrc); 067 } 068 if(sLine == null) { 069 throw new IOException("Bzr.searchRepository - .bzr.bat found but does not contain \"bzr_mvExpl.bat\""); 070 } 071 } else { 072 dst.put(bzrsrc, null); 073 } 074 } 075 return ret; 076 } 077}