package org.jenkinsci.plugins.p4.workflow.source; import hudson.DescriptorExtensionList; import hudson.ExtensionPoint; import hudson.model.Describable; import jenkins.model.Jenkins; import org.jenkinsci.plugins.p4.workspace.Workspace; import java.io.Serializable; public abstract class AbstractSource implements ExtensionPoint, Describable<AbstractSource>, Serializable { private static final long serialVersionUID = 1L; public abstract Workspace getWorkspace(String charset, String format); public P4SyncDescriptor getDescriptor() { Jenkins j = Jenkins.getInstance(); if (j != null) { return (P4SyncDescriptor) j.getDescriptor(getClass()); } return null; } public static DescriptorExtensionList<AbstractSource, P4SyncDescriptor> all() { Jenkins j = Jenkins.getInstance(); if (j != null) { return j.<AbstractSource, P4SyncDescriptor>getDescriptorList(AbstractSource.class); } return null; } public static String getClientView(String src, String dest) { return new ClientViewMappingGenerator().generateClientView(src, dest); } } /** * Class used to generate client view mapping given a depot syntax and client syntax */ class ClientViewMappingGenerator { private static final String ELLIPSIS = "..."; /** * Generates client view mapping string. * e.g //depot/src/... //ws/src/... * <p> * This method handles the case where multiple items are specified in dpotSyntax delimitted * with a new line character \n, in addition to standard specification. * e.g //depot/src/...\n//depot/tgt/... * <p> * If multiple items are speicified in depot syntax, each client syntax will be appended with * the part of the depot syntax that follows //, to avoid ambiguity. * <p> * For instance //depot/src/...\n//depot/tgt/... with a client syntax of jenkins-job will generate the following * view, * <p> * //depot/src/... //jenkins-job/depot/src/... * //depot/tgt/... //jenkins-job/depot/tgt/... * * @param depotSyntax The left hand side of the client view * @param clientSyntax The right hand side of the client view * @return Client view mapping */ public String generateClientView(String depotSyntax, String clientSyntax) { StringBuffer view = new StringBuffer(); if (depotSyntax != null && !depotSyntax.isEmpty()) { String[] sources = depotSyntax.split("\n"); int viewCount = 0; int sourceCount = sources.length; String destination = clientSyntax; for (String source : sources) { boolean spaces = source.contains(" "); String sourceWithNoInitSlashes = source.substring(2); String[] srcSplit = sourceWithNoInitSlashes.split("/"); StringBuffer formattedSrc = new StringBuffer(); StringBuffer formattedDest = new StringBuffer(); if(spaces) { formattedSrc.append("\"//"); formattedDest.append("\"//"); } else { formattedSrc.append("//"); formattedDest.append("//"); } if (viewCount > 0) { view.append("\n"); } if (srcSplit != null && srcSplit.length > 0) { String lastSrc = srcSplit[srcSplit.length - 1]; boolean containsDots = lastSrc.contains(ELLIPSIS); int count = 0; for (String srcItem : srcSplit) { if (count > 0) { formattedSrc.append("/"); } formattedSrc.append(srcItem); count++; } //if multiple depots are specified in depotSyntax, append //each depot path to client syntax of client view if (sourceCount > 1) { StringBuffer tmpDestination = new StringBuffer(); destination = clientSyntax + "/" + sourceWithNoInitSlashes; String[] destsrcSplit = destination.split("/"); int dcount = 0; for (String destItem : destsrcSplit) { if (!destItem.contains(ELLIPSIS)) { if (dcount > 0) { tmpDestination.append("/"); } tmpDestination.append(destItem); dcount++; } } destination = tmpDestination.toString(); } if (containsDots) { formattedDest.append(destination + "/" + lastSrc); } else { formattedSrc.append("/" + ELLIPSIS); formattedDest.append(destination + "/" + ELLIPSIS); } } if(spaces) { formattedSrc.append("\""); formattedDest.append("\""); } view.append(formattedSrc.toString().replaceAll("\n", "")); view.append(" "); view.append(formattedDest.toString()); viewCount++; } } return view.toString(); } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#7 | 25564 | Paul Allen |
Merge branch 'local_map' MultiBranch support for 'HelixBranches' local and remote Mappings. Allows MultiBranches to map Depot paths external to the MultiBranch projects root. For example, a MultiBranch project with the following Jenkinsfiles: ProjA >> main //depot/projA/main/Jenkinsfile //depot/projA/main/src/... ProjA>> dev //depot/projA/dev/Jenkinsfile //depot/projA/dev/src/... An 'Includes' path for Branch Sources set to: //depot/projA/... Jenkins will now create two branches 'main' and 'dev'. The default Mapping is '...' so the 'src/...' and any other files under the branch root will appear in the project's workspace. To import an extenal location we can add another line to the mapping: ... //depot/external/stuff/... Now both branches 'main' and 'dev' will have a folder 'depot/external/stuff' with the mapped files. We can also use the `BRANCH_NAME` environment variable in the remote path uses the branch name. ... //depot/external/${BRANCH_NAME}/... and in 'main' you will now see the remote files in ' depot/external/main' along with the local project files mapped with '...' |
||
#6 | 24488 | Paul Allen |
Min version Jenkins 2.60.3 Upgrade dependencies and move to Java 8. |
||
#5 | 24439 | Paul Allen |
Move ViewMapHelper to shared class. JENKINS-52852 |
||
#4 | 24404 | Paul Allen |
Support spaces in depot path for MultiBranch and DepotSource Includes filters for leading white space (spaces/tabs). JENKINS-52652 |
||
#3 | 24403 | Paul Allen |
Support spaces in depot path for MultiBranch and DepotSource JENKINS-52604 |
||
#2 | 24402 | Paul Allen |
Fix Ellipsis detection in ClientViewMappingGenerator 'p4sync' was mistaking a single '.' for '...' when building the view. JENKINS-52572 |
||
#1 | 22400 | Paul Allen |
(tpeths) Enabling Graph support in p4sync DSL. #review-22378 |