diff options
Diffstat (limited to 'bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java')
-rw-r--r-- | bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java | 582 |
1 files changed, 291 insertions, 291 deletions
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java index 6c3d2806b..6d199da8c 100644 --- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java +++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/listeners/LogListener.java @@ -33,233 +33,233 @@ import org.eclipse.team.internal.ccvs.core.util.Util; * server but delegates the handling of the entries to a subclass. */ public class LogListener extends CommandOutputListener { - - /* - * A new format for log dates was introduced in 1.12.9 - */ - private static final String LOG_TIMESTAMP_FORMAT_OLD= "yyyy/MM/dd HH:mm:ss zzz";//$NON-NLS-1$ - private static final String LOG_TIMESTAMP_FORMAT= "yyyy-MM-dd HH:mm:ss zzz";//$NON-NLS-1$ - private static final Locale LOG_TIMESTAMP_LOCALE= Locale.US; - private final DateFormat LOG_DATE_FORMATTER_OLD = new SimpleDateFormat(LOG_TIMESTAMP_FORMAT_OLD, LOG_TIMESTAMP_LOCALE); - private final DateFormat LOG_DATE_FORMATTER = new SimpleDateFormat(LOG_TIMESTAMP_FORMAT, LOG_TIMESTAMP_LOCALE); - - // Server message prefix used for error detection - private static final String NOTHING_KNOWN_ABOUT = "nothing known about "; //$NON-NLS-1$ + + /* + * A new format for log dates was introduced in 1.12.9 + */ + private static final String LOG_TIMESTAMP_FORMAT_OLD= "yyyy/MM/dd HH:mm:ss zzz";//$NON-NLS-1$ + private static final String LOG_TIMESTAMP_FORMAT= "yyyy-MM-dd HH:mm:ss zzz";//$NON-NLS-1$ + private static final Locale LOG_TIMESTAMP_LOCALE= Locale.US; + private final DateFormat LOG_DATE_FORMATTER_OLD = new SimpleDateFormat(LOG_TIMESTAMP_FORMAT_OLD, LOG_TIMESTAMP_LOCALE); + private final DateFormat LOG_DATE_FORMATTER = new SimpleDateFormat(LOG_TIMESTAMP_FORMAT, LOG_TIMESTAMP_LOCALE); + + // Server message prefix used for error detection + private static final String NOTHING_KNOWN_ABOUT = "nothing known about "; //$NON-NLS-1$ - // States of log accumulation. - private final int DONE = 4; - private final int COMMENT = 3; - private final int REVISION = 2; - private final int SYMBOLIC_NAMES = 1; - private final int BEGIN = 0; - - //Tag used for accumulating all of a branch's revision info - public final static String BRANCH_REVISION = "branchRevision"; //$NON-NLS-1$ - - private static final CVSTag[] NO_TAGS = new CVSTag[0]; - private static final String[] NO_VERSIONS = new String[0]; - - // Instance variables for accumulating Log information - private RemoteFile currentFile; - private int state = BEGIN; - private StringBuffer comment; - private String fileState; - private String revision; - private String author; - private Date creationDate; - private List versions = new ArrayList(); - private Map internedStrings = new HashMap(); - private final ILogEntryListener listener; - - /** - * Create a log listener for receiving entries for one or more files. - */ - public LogListener(ILogEntryListener listener) { - this.listener = listener; - } + // States of log accumulation. + private final int DONE = 4; + private final int COMMENT = 3; + private final int REVISION = 2; + private final int SYMBOLIC_NAMES = 1; + private final int BEGIN = 0; + + //Tag used for accumulating all of a branch's revision info + public final static String BRANCH_REVISION = "branchRevision"; //$NON-NLS-1$ + + private static final CVSTag[] NO_TAGS = new CVSTag[0]; + private static final String[] NO_VERSIONS = new String[0]; + + // Instance variables for accumulating Log information + private RemoteFile currentFile; + private int state = BEGIN; + private StringBuffer comment; + private String fileState; + private String revision; + private String author; + private Date creationDate; + private List versions = new ArrayList(); + private Map internedStrings = new HashMap(); + private final ILogEntryListener listener; + + /** + * Create a log listener for receiving entries for one or more files. + */ + public LogListener(ILogEntryListener listener) { + this.listener = listener; + } - public LogListener(RemoteFile file, ILogEntryListener listener) { - this(listener); - this.currentFile = file; - } + public LogListener(RemoteFile file, ILogEntryListener listener) { + this(listener); + this.currentFile = file; + } - private String getRelativeFilePath(ICVSRepositoryLocation location, String fileName) { - if (fileName.endsWith(",v")) { //$NON-NLS-1$ - fileName = fileName.substring(0, fileName.length() - 2); - } - fileName = Util.removeAtticSegment(fileName); - String rootDirectory = location.getRootDirectory(); - if (fileName.startsWith(rootDirectory)) { - try { - fileName = Util.getRelativePath(rootDirectory, fileName); - } catch (CVSException e) { - CVSProviderPlugin.log(e); - return null; - } - } - return fileName; - } + private String getRelativeFilePath(ICVSRepositoryLocation location, String fileName) { + if (fileName.endsWith(",v")) { //$NON-NLS-1$ + fileName = fileName.substring(0, fileName.length() - 2); + } + fileName = Util.removeAtticSegment(fileName); + String rootDirectory = location.getRootDirectory(); + if (fileName.startsWith(rootDirectory)) { + try { + fileName = Util.getRelativePath(rootDirectory, fileName); + } catch (CVSException e) { + CVSProviderPlugin.log(e); + return null; + } + } + return fileName; + } - public IStatus errorLine(String line, ICVSRepositoryLocation location, ICVSFolder commandRoot, IProgressMonitor monitor) { - String serverMessage = getServerMessage(line, location); - if (serverMessage != null) { - // look for the following condition - // E cvs server: nothing known about fileName - if (serverMessage.startsWith(NOTHING_KNOWN_ABOUT)) { - return new CVSStatus(IStatus.ERROR, CVSStatus.DOES_NOT_EXIST, line, commandRoot); - } - } - return OK; - } + public IStatus errorLine(String line, ICVSRepositoryLocation location, ICVSFolder commandRoot, IProgressMonitor monitor) { + String serverMessage = getServerMessage(line, location); + if (serverMessage != null) { + // look for the following condition + // E cvs server: nothing known about fileName + if (serverMessage.startsWith(NOTHING_KNOWN_ABOUT)) { + return new CVSStatus(IStatus.ERROR, CVSStatus.DOES_NOT_EXIST, line, commandRoot); + } + } + return OK; + } - public IStatus messageLine(String line, ICVSRepositoryLocation location, ICVSFolder commandRoot, IProgressMonitor monitor) { - // Fields we will find in the log for a file - // keys = String (tag name), values = String (tag revision number) */ - switch (state) { - case BEGIN: - if (line.startsWith("RCS file: ")) { //$NON-NLS-1$ - // We are starting to recieve the log for a file - String fileName = getRelativeFilePath(location, line.substring(10).trim()); - if (fileName == null) { - currentFile = null; - handleInvalidFileName(location, fileName); - } else { - if (currentFile == null || !currentFile.getRepositoryRelativePath().equals(fileName)) { - // We are starting another file - beginFile(location, fileName); - } - } - } else if (line.startsWith("symbolic names:")) { //$NON-NLS-1$ - state = SYMBOLIC_NAMES; - } else if (line.startsWith("revision ")) { //$NON-NLS-1$ - // if the revision has been locked, remove the "locked by" suffix - revision = line.substring(9).replaceFirst(ResourceSyncInfo.LOCKEDBY_REGEX, ""); //$NON-NLS-1$ - revision = internAndCopyString(revision); - state = REVISION; - } else if (line.startsWith("total revisions:")){ //$NON-NLS-1$ - //if there are no current revision selected and this is a branch then we are in the - //case where there have been no changes made on the branch since the initial branching - //and we need to get the revision that the branch was made from - int indexOfSelectedRevisions = line.lastIndexOf("selected revisions: "); //$NON-NLS-1$ - //20 for length of "selected revisions: " - String selectedRevisions = line.substring(indexOfSelectedRevisions + 20).trim(); - if (selectedRevisions.equals("0")){ //$NON-NLS-1$ - //ok put into comment state to await ======= and add info to log - state = COMMENT; - revision = BRANCH_REVISION; - comment = new StringBuffer(); - } - } - break; - case SYMBOLIC_NAMES: - if (line.startsWith("keyword substitution:")) { //$NON-NLS-1$ - state = BEGIN; - } else { - int firstColon = line.indexOf(':'); - String tagName = internAndCopyString(line.substring(1, firstColon)); - String tagRevision = internAndCopyString(line.substring(firstColon + 2)); - versions.add(new VersionInfo(tagRevision, tagName)); - } - break; - case REVISION: - // date: 2000/06/19 04:56:21; author: somebody; state: Exp; lines: +114 -45 - // get the creation date - int endOfDateIndex = line.indexOf(';', 6); - creationDate = convertFromLogTime(line.substring(6, endOfDateIndex) + " GMT"); //$NON-NLS-1$ - - // get the author name - int endOfAuthorIndex = line.indexOf(';', endOfDateIndex + 1); - author = internAndCopyString(line.substring(endOfDateIndex + 11, endOfAuthorIndex)); + public IStatus messageLine(String line, ICVSRepositoryLocation location, ICVSFolder commandRoot, IProgressMonitor monitor) { + // Fields we will find in the log for a file + // keys = String (tag name), values = String (tag revision number) */ + switch (state) { + case BEGIN: + if (line.startsWith("RCS file: ")) { //$NON-NLS-1$ + // We are starting to recieve the log for a file + String fileName = getRelativeFilePath(location, line.substring(10).trim()); + if (fileName == null) { + currentFile = null; + handleInvalidFileName(location, fileName); + } else { + if (currentFile == null || !currentFile.getRepositoryRelativePath().equals(fileName)) { + // We are starting another file + beginFile(location, fileName); + } + } + } else if (line.startsWith("symbolic names:")) { //$NON-NLS-1$ + state = SYMBOLIC_NAMES; + } else if (line.startsWith("revision ")) { //$NON-NLS-1$ + // if the revision has been locked, remove the "locked by" suffix + revision = line.substring(9).replaceFirst(ResourceSyncInfo.LOCKEDBY_REGEX, ""); //$NON-NLS-1$ + revision = internAndCopyString(revision); + state = REVISION; + } else if (line.startsWith("total revisions:")){ //$NON-NLS-1$ + //if there are no current revision selected and this is a branch then we are in the + //case where there have been no changes made on the branch since the initial branching + //and we need to get the revision that the branch was made from + int indexOfSelectedRevisions = line.lastIndexOf("selected revisions: "); //$NON-NLS-1$ + //20 for length of "selected revisions: " + String selectedRevisions = line.substring(indexOfSelectedRevisions + 20).trim(); + if (selectedRevisions.equals("0")){ //$NON-NLS-1$ + //ok put into comment state to await ======= and add info to log + state = COMMENT; + revision = BRANCH_REVISION; + comment = new StringBuffer(); + } + } + break; + case SYMBOLIC_NAMES: + if (line.startsWith("keyword substitution:")) { //$NON-NLS-1$ + state = BEGIN; + } else { + int firstColon = line.indexOf(':'); + String tagName = internAndCopyString(line.substring(1, firstColon)); + String tagRevision = internAndCopyString(line.substring(firstColon + 2)); + versions.add(new VersionInfo(tagRevision, tagName)); + } + break; + case REVISION: + // date: 2000/06/19 04:56:21; author: somebody; state: Exp; lines: +114 -45 + // get the creation date + int endOfDateIndex = line.indexOf(';', 6); + creationDate = convertFromLogTime(line.substring(6, endOfDateIndex) + " GMT"); //$NON-NLS-1$ + + // get the author name + int endOfAuthorIndex = line.indexOf(';', endOfDateIndex + 1); + author = internAndCopyString(line.substring(endOfDateIndex + 11, endOfAuthorIndex)); - // get the file state (because this revision might be "dead") - int endOfStateIndex = line.indexOf(';', endOfAuthorIndex + 1) < 0 ? line.length() : line.indexOf(';', endOfAuthorIndex + 1); - fileState = internAndCopyString(line.substring(endOfAuthorIndex + 10, endOfStateIndex)); - comment = new StringBuffer(); - state = COMMENT; - break; - case COMMENT: - // skip next line (info about branches) if it exists, if not then it is a comment line. - if (line.startsWith("branches:")) break; //$NON-NLS-1$ - if (line.equals("=============================================================================") //$NON-NLS-1$ - || line.equals("----------------------------")) { //$NON-NLS-1$ - state = DONE; - break; - } - //check for null if we are in the waiting to finish case (brought on by branches) - if (comment == null) - break; - - if (comment.length() != 0) comment.append('\n'); - comment.append(line); - break; - } - if (state == DONE) { - // we are only interested in tag names for this revision, remove all others. - List thisRevisionTags = versions.isEmpty() ? Collections.EMPTY_LIST : new ArrayList(3); - List thisRevisionBranches = new ArrayList(1); - //a parallel lists for revision tags (used only for branches with no commits on them) - List revisionVersions = versions.isEmpty() ? Collections.EMPTY_LIST : new ArrayList(3); - String branchRevision = this.getBranchRevision(revision); - for (Iterator i = versions.iterator(); i.hasNext();) { - VersionInfo version = (VersionInfo) i.next(); - String tagName = version.getTagName(); - String tagRevision = version.getTagRevision(); - String tagBranchRevision = version.getBranchRevision(); + // get the file state (because this revision might be "dead") + int endOfStateIndex = line.indexOf(';', endOfAuthorIndex + 1) < 0 ? line.length() : line.indexOf(';', endOfAuthorIndex + 1); + fileState = internAndCopyString(line.substring(endOfAuthorIndex + 10, endOfStateIndex)); + comment = new StringBuffer(); + state = COMMENT; + break; + case COMMENT: + // skip next line (info about branches) if it exists, if not then it is a comment line. + if (line.startsWith("branches:")) break; //$NON-NLS-1$ + if (line.equals("=============================================================================") //$NON-NLS-1$ + || line.equals("----------------------------")) { //$NON-NLS-1$ + state = DONE; + break; + } + //check for null if we are in the waiting to finish case (brought on by branches) + if (comment == null) + break; + + if (comment.length() != 0) comment.append('\n'); + comment.append(line); + break; + } + if (state == DONE) { + // we are only interested in tag names for this revision, remove all others. + List thisRevisionTags = versions.isEmpty() ? Collections.EMPTY_LIST : new ArrayList(3); + List thisRevisionBranches = new ArrayList(1); + //a parallel lists for revision tags (used only for branches with no commits on them) + List revisionVersions = versions.isEmpty() ? Collections.EMPTY_LIST : new ArrayList(3); + String branchRevision = this.getBranchRevision(revision); + for (Iterator i = versions.iterator(); i.hasNext();) { + VersionInfo version = (VersionInfo) i.next(); + String tagName = version.getTagName(); + String tagRevision = version.getTagRevision(); + String tagBranchRevision = version.getBranchRevision(); int type = version.isBranch() ? CVSTag.BRANCH : CVSTag.VERSION; if ( branchRevision.equals(tagBranchRevision) || (version.isBranch() && revision.equals(tagRevision))) { - CVSTag cvsTag = new CVSTag(tagName, tagBranchRevision, type); - thisRevisionBranches.add(cvsTag); - } - + CVSTag cvsTag = new CVSTag(tagName, tagBranchRevision, type); + thisRevisionBranches.add(cvsTag); + } + if (tagRevision.equals(revision) || - revision.equals(BRANCH_REVISION)) { - CVSTag cvsTag = new CVSTag(tagName, tagBranchRevision, type); - thisRevisionTags.add(cvsTag); - if (revision.equals(BRANCH_REVISION)){ - //also record the tag revision - revisionVersions.add(tagRevision); - } - } - } - - if (branchRevision.equals(CVSTag.HEAD_REVISION)) { - CVSTag tag = new CVSTag(CVSTag.HEAD_BRANCH, CVSTag.HEAD_REVISION, CVSTag.HEAD); + revision.equals(BRANCH_REVISION)) { + CVSTag cvsTag = new CVSTag(tagName, tagBranchRevision, type); + thisRevisionTags.add(cvsTag); + if (revision.equals(BRANCH_REVISION)){ + //also record the tag revision + revisionVersions.add(tagRevision); + } + } + } + + if (branchRevision.equals(CVSTag.HEAD_REVISION)) { + CVSTag tag = new CVSTag(CVSTag.HEAD_BRANCH, CVSTag.HEAD_REVISION, CVSTag.HEAD); thisRevisionBranches.add(tag); - } else { - if ( thisRevisionBranches.size() == 0) { - CVSTag cvsTag = new CVSTag(CVSTag.UNKNOWN_BRANCH, branchRevision, CVSTag.BRANCH); - thisRevisionBranches.add(cvsTag); - } - } - if (currentFile != null) { - LogEntry entry = new LogEntry(currentFile, revision, author, creationDate, - internString(comment.toString()), fileState, - !thisRevisionTags.isEmpty() ? (CVSTag[]) thisRevisionTags.toArray(new CVSTag[thisRevisionTags.size()]) :NO_TAGS, - !thisRevisionBranches.isEmpty() ? (CVSTag[]) thisRevisionBranches.toArray(new CVSTag[thisRevisionBranches.size()]) :NO_TAGS, - !revisionVersions.isEmpty() ? (String[]) revisionVersions.toArray(new String[revisionVersions.size()]) : NO_VERSIONS); - addEntry(entry); - } - state = BEGIN; - } - return OK; - } + } else { + if ( thisRevisionBranches.size() == 0) { + CVSTag cvsTag = new CVSTag(CVSTag.UNKNOWN_BRANCH, branchRevision, CVSTag.BRANCH); + thisRevisionBranches.add(cvsTag); + } + } + if (currentFile != null) { + LogEntry entry = new LogEntry(currentFile, revision, author, creationDate, + internString(comment.toString()), fileState, + !thisRevisionTags.isEmpty() ? (CVSTag[]) thisRevisionTags.toArray(new CVSTag[thisRevisionTags.size()]) :NO_TAGS, + !thisRevisionBranches.isEmpty() ? (CVSTag[]) thisRevisionBranches.toArray(new CVSTag[thisRevisionBranches.size()]) :NO_TAGS, + !revisionVersions.isEmpty() ? (String[]) revisionVersions.toArray(new String[revisionVersions.size()]) : NO_VERSIONS); + addEntry(entry); + } + state = BEGIN; + } + return OK; + } - /** - * Convert revision number to branch number. - * - * <table border="1"> - * <tr><th>revision</th><th>branch</th><th>comment</th></tr> - * <tr><td>1.1.2.1</td><td>1.1.0.2</td><td>regular branch</td></tr> - * <tr><td>1.1.4.1</td><td>1.1.0.4</td><td>regular branch</td></tr> - * <tr><td>1.1.1.2</td><td>1.1.1</td><td>vendor branch</td></tr> - * <tr><td>1.1.2.1.2.3</td><td>1.1.2.1.0.2</td><td>branch created from another branch</td></tr> - * </table> - * - * @param revision revision number - * @return branch number - * - */ + /** + * Convert revision number to branch number. + * + * <table border="1"> + * <tr><th>revision</th><th>branch</th><th>comment</th></tr> + * <tr><td>1.1.2.1</td><td>1.1.0.2</td><td>regular branch</td></tr> + * <tr><td>1.1.4.1</td><td>1.1.0.4</td><td>regular branch</td></tr> + * <tr><td>1.1.1.2</td><td>1.1.1</td><td>vendor branch</td></tr> + * <tr><td>1.1.2.1.2.3</td><td>1.1.2.1.0.2</td><td>branch created from another branch</td></tr> + * </table> + * + * @param revision revision number + * @return branch number + * + */ private String getBranchRevision(String revision) { if (revision.length() == 0 || revision.lastIndexOf(".") == -1) //$NON-NLS-1$ throw new IllegalArgumentException( @@ -274,63 +274,63 @@ public class LogListener extends CommandOutputListener { branchPrefix += branchNumber.substring(branchNumber.lastIndexOf(".")); //$NON-NLS-1$ return branchPrefix; } - - protected void beginFile(ICVSRepositoryLocation location, String fileName) { - currentFile = RemoteFile.create(fileName, location); - versions.clear(); - } + + protected void beginFile(ICVSRepositoryLocation location, String fileName) { + currentFile = RemoteFile.create(fileName, location); + versions.clear(); + } - protected void addEntry(LogEntry entry) { - listener.handleLogEntryReceived(entry); - } + protected void addEntry(LogEntry entry) { + listener.handleLogEntryReceived(entry); + } - protected void handleInvalidFileName(ICVSRepositoryLocation location, String badFilePath) { - CVSProviderPlugin.log(IStatus.WARNING, "Invalid file path '" + badFilePath + "' received from " + location.toString(), null); //$NON-NLS-1$ //$NON-NLS-2$ - } + protected void handleInvalidFileName(ICVSRepositoryLocation location, String badFilePath) { + CVSProviderPlugin.log(IStatus.WARNING, "Invalid file path '" + badFilePath + "' received from " + location.toString(), null); //$NON-NLS-1$ //$NON-NLS-2$ + } - /** - * Converts a time stamp as sent from a cvs server for a "log" command into a - * <code>Date</code>. - */ - private Date convertFromLogTime(String modTime) { - DateFormat format = LOG_DATE_FORMATTER; - // Compatibility for older cvs version (pre 1.12.9) - if (modTime.length() > 4 && modTime.charAt(4) == '/') - format = LOG_DATE_FORMATTER_OLD; - - try { - return format.parse(modTime); - } catch (ParseException e) { - // fallback is to return null - return null; - } - } - - private String internAndCopyString(String string) { - String internedString = (String) internedStrings.get(string); - if (internedString == null) { - internedString = new String(string); - internedStrings.put(internedString, internedString); - } - return internedString; - } - - private String internString(String string) { - String internedString = (String) internedStrings.get(string); - if (internedString == null) { - internedString = string; - internedStrings.put(internedString, internedString); - } - return internedString; - } - - private static class VersionInfo { + /** + * Converts a time stamp as sent from a cvs server for a "log" command into a + * <code>Date</code>. + */ + private Date convertFromLogTime(String modTime) { + DateFormat format = LOG_DATE_FORMATTER; + // Compatibility for older cvs version (pre 1.12.9) + if (modTime.length() > 4 && modTime.charAt(4) == '/') + format = LOG_DATE_FORMATTER_OLD; + + try { + return format.parse(modTime); + } catch (ParseException e) { + // fallback is to return null + return null; + } + } + + private String internAndCopyString(String string) { + String internedString = (String) internedStrings.get(string); + if (internedString == null) { + internedString = new String(string); + internedStrings.put(internedString, internedString); + } + return internedString; + } + + private String internString(String string) { + String internedString = (String) internedStrings.get(string); + if (internedString == null) { + internedString = string; + internedStrings.put(internedString, internedString); + } + return internedString; + } + + private static class VersionInfo { private final boolean isBranch; private String tagRevision; private String branchRevision; private final String tagName; - public VersionInfo(String version, String tagName) { + public VersionInfo(String version, String tagName) { this.tagName = tagName; this.isBranch = isBranchTag(version); tagRevision = version; @@ -347,7 +347,7 @@ public class LogListener extends CommandOutputListener { tagRevision = version.substring(0, lastDot); } } - } + } public String getTagName() { return this.tagName; @@ -356,34 +356,34 @@ public class LogListener extends CommandOutputListener { public String getTagRevision() { return this.tagRevision; } - - public boolean isBranch() { - return isBranch; - } - - /** branch tags have odd number of segments or have - * an even number with a zero as the second last segment - * e.g: 1.1.1, 1.26.0.2 are branch revision numbers */ - private boolean isBranchTag(String tagName) { - // First check if we have an odd number of segments (i.e. even number of dots) - int numberOfDots = 0; - int lastDot = 0; - for (int i = 0; i < tagName.length(); i++) { - if (tagName.charAt(i) == '.') { - numberOfDots++; - lastDot = i; - } - } - if ((numberOfDots % 2) == 0) return true; - if (numberOfDots == 1) return false; - - // If not, check if the second lat segment is a zero - if (tagName.charAt(lastDot - 1) == '0' && tagName.charAt(lastDot - 2) == '.') return true; - return false; - } + + public boolean isBranch() { + return isBranch; + } + + /** branch tags have odd number of segments or have + * an even number with a zero as the second last segment + * e.g: 1.1.1, 1.26.0.2 are branch revision numbers */ + private boolean isBranchTag(String tagName) { + // First check if we have an odd number of segments (i.e. even number of dots) + int numberOfDots = 0; + int lastDot = 0; + for (int i = 0; i < tagName.length(); i++) { + if (tagName.charAt(i) == '.') { + numberOfDots++; + lastDot = i; + } + } + if ((numberOfDots % 2) == 0) return true; + if (numberOfDots == 1) return false; + + // If not, check if the second lat segment is a zero + if (tagName.charAt(lastDot - 1) == '0' && tagName.charAt(lastDot - 2) == '.') return true; + return false; + } public String getBranchRevision() { return branchRevision; } - } + } } |