package org.jenkinsci.plugins.p4; import hudson.AbortException; import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; import hudson.matrix.MatrixConfiguration; import hudson.matrix.MatrixExecutionStrategy; import hudson.matrix.MatrixBuild; import hudson.matrix.MatrixProject; import hudson.model.TaskListener; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Computer; import hudson.model.Job; import hudson.model.Node; import hudson.model.Run; import hudson.scm.ChangeLogParser; import hudson.scm.PollingResult; import hudson.scm.SCMDescriptor; import hudson.scm.SCMRevisionState; import hudson.scm.SCM; import hudson.util.FormValidation; import hudson.util.ListBoxModel; import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.logging.Logger; import jenkins.model.Jenkins; import net.sf.json.JSONObject; import org.jenkinsci.plugins.p4.browsers.P4Browser; import org.jenkinsci.plugins.p4.changes.P4ChangeEntry; import org.jenkinsci.plugins.p4.changes.P4ChangeParser; import org.jenkinsci.plugins.p4.changes.P4ChangeSet; import org.jenkinsci.plugins.p4.changes.P4Revision; import org.jenkinsci.plugins.p4.client.ClientHelper; import org.jenkinsci.plugins.p4.client.ConnectionHelper; import org.jenkinsci.plugins.p4.credentials.P4CredentialsImpl; import org.jenkinsci.plugins.p4.filters.Filter; import org.jenkinsci.plugins.p4.matrix.MatrixOptions; import org.jenkinsci.plugins.p4.populate.ForceCleanImpl; import org.jenkinsci.plugins.p4.populate.Populate; import org.jenkinsci.plugins.p4.review.ReviewProp; import org.jenkinsci.plugins.p4.tagging.TagAction; import org.jenkinsci.plugins.p4.tasks.CheckoutTask; import org.jenkinsci.plugins.p4.tasks.HostnameTask; import org.jenkinsci.plugins.p4.tasks.PollTask; import org.jenkinsci.plugins.p4.workspace.TemplateWorkspaceImpl; import org.jenkinsci.plugins.p4.workspace.Workspace; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; import com.perforce.p4java.impl.generic.core.Label; public class PerforceScm extends SCM { private static Logger logger = Logger .getLogger(PerforceScm.class.getName()); private final String credential; private final Workspace workspace; private final List<Filter> filter; private final Populate populate; private final P4Browser browser; private transient List<Integer> changes; private transient P4Revision parentChange; public String getCredential() { return credential; } public Workspace getWorkspace() { return workspace; } public List<Filter> getFilter() { return filter; } public Populate getPopulate() { return populate; } @Override public P4Browser getBrowser() { return browser; } public List<Integer> getChanges() { return changes; } /** * Create a constructor that takes non-transient fields, and add the * annotation @DataBoundConstructor to it. Using the annotation helps the * Stapler class to find which constructor that should be used when * automatically copying values from a web form to a class. */ @DataBoundConstructor public PerforceScm(String credential, Workspace workspace, List<Filter> filter, Populate populate, P4Browser browser) { this.credential = credential; this.workspace = workspace; this.filter = filter; this.populate = populate; this.browser = browser; } public PerforceScm(String credential, Workspace workspace, Populate populate) { this.credential = credential; this.workspace = workspace; this.filter = null; this.populate = populate; this.browser = null; } /** * Calculate the state of the workspace of the given build. The returned * object is then fed into compareRemoteRevisionWith as the baseline * SCMRevisionState to determine if the build is necessary, and is added to * the build as an Action for later retrieval. */ @Override public SCMRevisionState calcRevisionsFromBuild(Run<?, ?> run, FilePath buildWorkspace, Launcher launcher, TaskListener listener) throws IOException, InterruptedException { // Method not required by Perforce return null; } /** * This method does the actual polling and returns a PollingResult. The * change attribute of the PollingResult the significance of the changes * detected by this poll. */ @Override public PollingResult compareRemoteRevisionWith(Job<?, ?> job, Launcher launcher, FilePath buildWorkspace, TaskListener listener, SCMRevisionState baseline) throws IOException, InterruptedException { PollingResult state = PollingResult.NO_CHANGES; Node node = workspaceToNode(buildWorkspace); // Delay polling if build is in progress if (job.isBuilding()) { listener.getLogger().println("Build in progress, polling delayed."); return PollingResult.NO_CHANGES; } if (job instanceof MatrixProject) { if (isBuildParent(job)) { // Poll PARENT only EnvVars envVars = job.getEnvironment(node, listener); state = pollWorkspace(envVars, listener, buildWorkspace); } else { // Poll CHILDREN only MatrixProject matrixProj = (MatrixProject) job; Collection<MatrixConfiguration> configs = matrixProj .getActiveConfigurations(); for (MatrixConfiguration config : configs) { EnvVars envVars = config.getEnvironment(node, listener); state = pollWorkspace(envVars, listener, buildWorkspace); // exit early if changes found if (state == PollingResult.BUILD_NOW) { return PollingResult.BUILD_NOW; } } } } else { EnvVars envVars = job.getEnvironment(node, listener); state = pollWorkspace(envVars, listener, buildWorkspace); } return state; } /** * Construct workspace from environment and then look for changes. * * @param envVars * @param listener * @return * @throws InterruptedException * @throws IOException */ private PollingResult pollWorkspace(EnvVars envVars, TaskListener listener, FilePath buildWorkspace) throws InterruptedException, IOException { PrintStream log = listener.getLogger(); // set NODE_NAME to Node or default "master" if not set Node node = workspaceToNode(buildWorkspace); String nodeName = node.getNodeName(); nodeName = (nodeName.isEmpty()) ? "master" : nodeName; envVars.put("NODE_NAME", envVars.get("NODE_NAME", nodeName)); Workspace ws = (Workspace) workspace.clone(); ws.setExpand(envVars); // don't call setRootPath() here, polling is often on the master // Set EXPANDED client String client = ws.getFullName(); log.println("P4: Polling on: " + nodeName + " with:" + client); // Set EXPANDED pinned label/change String pin = populate.getPin(); if (pin != null && !pin.isEmpty()) { pin = ws.getExpand().format(pin, false); ws.getExpand().set(ReviewProp.LABEL.toString(), pin); } // Create task PollTask task = new PollTask(filter); task.setCredential(credential); task.setWorkspace(ws); task.setListener(listener); task.setLimit(pin); // Execute remote task changes = buildWorkspace.act(task); // Report changes if (!changes.isEmpty()) { return PollingResult.BUILD_NOW; } return PollingResult.NO_CHANGES; } /** * The checkout method is expected to check out modified files into the * project workspace. In Perforce terms a 'p4 sync' on the project's * workspace. Authorisation */ @Override public void checkout(Run<?, ?> run, Launcher launcher, FilePath buildWorkspace, TaskListener listener, File changelogFile, SCMRevisionState baseline) throws IOException, InterruptedException { PrintStream log = listener.getLogger(); boolean success = true; // Clone workspace (this SCM object seems to get reused) Workspace ws = (Workspace) workspace.clone(); // Set environment EnvVars envVars = run.getEnvironment(listener); envVars.put("NODE_NAME", envVars.get("NODE_NAME", "master")); ws.setExpand(envVars); // Set workspace root (check for parallel execution) String root = buildWorkspace.getRemote(); if (root.contains("@")) { root = root.replace("@", "%40"); String client = ws.getFullName(); String name = buildWorkspace.getName(); String[] parts = name.split("@"); String exec = parts[1]; // Template workspace to .cloneN (where N is the @ number) String charset = ws.getCharset(); boolean pin = ws.isPinHost(); String template = client + ".clone" + exec; ws = new TemplateWorkspaceImpl(charset, pin, client, template); ws.setExpand(envVars); } ws.setRootPath(root); if (ws.isPinHost()) { String hostname = getHostName(buildWorkspace); ws.setHostName(hostname); } else { ws.setHostName(""); } // Set label for changes to build if (changes != null) { if (!changes.isEmpty()) { String label = Integer.toString(changes.get(0)); ws.getExpand().set(ReviewProp.LABEL.toString(), label); } } // Create task CheckoutTask task = new CheckoutTask(populate); task.setListener(listener); task.setCredential(credential); task.setWorkspace(ws); task.initialise(); // Add tagging action to build, enabling label support. TagAction tag = new TagAction(run); tag.setCredential(credential); tag.setWorkspace(ws); tag.setBuildChange(task.getSyncChange()); run.addAction(tag); // Invoke build. String node = ws.getExpand().get("NODE_NAME"); Job<?, ?> job = run.getParent(); if (run instanceof MatrixBuild) { parentChange = task.getSyncChange(); if (isBuildParent(job)) { log.println("Building Parent on Node: " + node); success &= buildWorkspace.act(task); } else { listener.getLogger().println("Skipping Parent build..."); success = true; } } else { if (job instanceof MatrixProject) { if (parentChange != null) { log.println("Using parent change: " + parentChange); task.setBuildChange(parentChange); } log.println("Building Child on Node: " + node); } else { log.println("Building on Node: " + node); } success &= buildWorkspace.act(task); } // Only write change log if build succeeded and changeLogFile has been // set. if (success) { if (changelogFile != null) { // Calculate changes prior to build (based on last build) listener.getLogger().println("P4 Task: saving built changes."); List<P4ChangeEntry> changes = calculateChanges(run, task); P4ChangeSet.store(changelogFile, changes); listener.getLogger().println("... done\n"); } else { listener.getLogger() .println( "P4 Task: changeLogFile not set. Not saving built changes."); } } else { String msg = "P4: Build failed"; logger.warning(msg); throw new AbortException(msg); } } // Get Matrix Execution options private MatrixExecutionStrategy getMatrixExecutionStrategy(Job<?, ?> job) { if (job instanceof MatrixProject) { MatrixProject matrixProj = (MatrixProject) job; return matrixProj.getExecutionStrategy(); } return null; } boolean isBuildParent(Job<?, ?> job) { MatrixExecutionStrategy matrix = getMatrixExecutionStrategy(job); if (matrix instanceof MatrixOptions) { return ((MatrixOptions) matrix).isBuildParent(); } else { // if user hasn't configured "Perforce: Matrix Options" execution // strategy, default to false return false; } } private List<P4ChangeEntry> calculateChanges(Run<?, ?> run, CheckoutTask task) { List<P4ChangeEntry> list = new ArrayList<P4ChangeEntry>(); // Look for all changes since the last build Run<?, ?> lastBuild = run.getPreviousSuccessfulBuild(); if (lastBuild != null) { TagAction lastTag = lastBuild.getAction(TagAction.class); if (lastTag != null) { P4Revision lastChange = lastTag.getBuildChange(); if (lastChange != null) { List<P4ChangeEntry> changes; changes = task.getChangesFull(lastChange); for (P4ChangeEntry c : changes) { list.add(c); } } } } // if empty, look for shelves in current build. The latest change // will not get listed as 'p4 changes n,n' will return no change if (list.isEmpty()) { P4Revision lastRevision = task.getBuildChange(); if (lastRevision != null) { List<P4ChangeEntry> changes; changes = task.getChangesFull(lastRevision); for (P4ChangeEntry c : changes) { list.add(c); } } } // still empty! No previous build, so add current if (list.isEmpty()) { list.add(task.getCurrentChange()); } return list; } @Override public void buildEnvVars(AbstractBuild<?, ?> build, Map<String, String> env) { super.buildEnvVars(build, env); TagAction tagAction = build.getAction(TagAction.class); if (tagAction != null) { // Set P4_CHANGELIST value if (tagAction.getBuildChange() != null) { String change = getChangeNumber(tagAction); env.put("P4_CHANGELIST", change); } // Set P4_CLIENT workspace value if (tagAction.getClient() != null) { String client = tagAction.getClient(); env.put("P4_CLIENT", client); } // Set P4_PORT connection if (tagAction.getPort() != null) { String port = tagAction.getPort(); env.put("P4_PORT", port); } // Set P4_USER connection if (tagAction.getUser() != null) { String user = tagAction.getUser(); env.put("P4_USER", user); } // Set P4_TICKET connection if (tagAction.getTicket() != null) { String ticket = tagAction.getTicket(); env.put("P4_TICKET", ticket); } } } private String getChangeNumber(TagAction tagAction) { P4Revision buildChange = tagAction.getBuildChange(); if (!buildChange.isLabel()) { // its a change, so return... return buildChange.toString(); } try { // it is really a change number, so add change... int change = Integer.parseInt(buildChange.toString()); return String.valueOf(change); } catch (NumberFormatException n) { } ConnectionHelper p4 = new ConnectionHelper(getCredential(), null); String name = buildChange.toString(); try { Label label = p4.getLabel(name); String spec = label.getRevisionSpec(); if (spec != null && !spec.isEmpty()) { if (spec.startsWith("@")) { spec = spec.substring(1); } return spec; } else { // a label, but no RevisionSpec return name; } } catch (Exception e) { // not a label return name; } finally { p4.disconnect(); } } /** * The checkout method should, besides checking out the modified files, * write a changelog.xml file that contains the changes for a certain build. * The changelog.xml file is specific for each SCM implementation, and the * createChangeLogParser returns a parser that can parse the file and return * a ChangeLogSet. */ @Override public ChangeLogParser createChangeLogParser() { return new P4ChangeParser(); } /** * Called before a workspace is deleted on the given node, to provide SCM an * opportunity to perform clean up. */ @Override public boolean processWorkspaceBeforeDeletion(Job<?, ?> job, FilePath workspace, Node node) throws IOException, InterruptedException { // CASTING: is this safe? AbstractProject<?, ?> project = (AbstractProject<?, ?>) job; PerforceScm scm = (PerforceScm) project.getScm(); String scmCredential = scm.getCredential(); Run<?, ?> run = job.getLastBuild(); if (run == null) { logger.warning("P4: No previous builds found"); return true; } // exit early if client workspace is undefined String client = "unset"; try { EnvVars envVars = run.getEnvironment(null); client = envVars.get("P4_CLIENT"); } catch (Exception e) { logger.warning("P4: Unable to read P4_CLIENT"); return true; } // exit early if client workspace does not exist ConnectionHelper connection = new ConnectionHelper(scmCredential, null); try { if (!connection.isClient(client)) { return true; } } catch (Exception e) { logger.warning("P4: Not able to get connection"); return true; } // Remove have entries from client workspace ClientHelper p4 = new ClientHelper(scmCredential, null, client); try { ForceCleanImpl forceClean = new ForceCleanImpl(false, false, populate.isQuiet(), null); logger.info("P4: unsyncing client: " + client); p4.syncFiles(new P4Revision(0), forceClean); } catch (Exception e) { logger.warning("P4: Not able to unsync client: " + client); return true; } finally { p4.disconnect(); } return true; } /** * Returns the ScmDescriptor<?> for the SCM object. The ScmDescriptor is * used to create new instances of the SCM. */ @Override public SCMDescriptor<PerforceScm> getDescriptor() { return (DescriptorImpl) super.getDescriptor(); } public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); /** * The relationship of Descriptor and SCM (the describable) is akin to class * and object. What this means is that the descriptor is used to create * instances of the describable. Usually the Descriptor is an internal class * in the SCM class named DescriptorImpl. The Descriptor should also contain * the global configuration options as fields, just like the SCM class * contains the configurations options for a job. * * @author pallen * */ @Extension public static class DescriptorImpl extends SCMDescriptor<PerforceScm> { /** * public no-argument constructor */ public DescriptorImpl() { super(PerforceScm.class, P4Browser.class); load(); } @Override public SCM newInstance(StaplerRequest req, JSONObject formData) throws FormException { PerforceScm scm = (PerforceScm) super.newInstance(req, formData); return scm; } /** * Returns the name of the SCM, this is the name that will show up next * to CVS and Subversion when configuring a job. */ @Override public String getDisplayName() { return "Perforce Software"; } /** * The configure method is invoked when the global configuration page is * submitted. In the method the data in the web form should be copied to * the Descriptor's fields. To persist the fields to the global * configuration XML file, the save() method must be called. Data is * defined in the global.jelly page. * */ @Override public boolean configure(StaplerRequest req, JSONObject json) throws FormException { save(); return true; } /** * Credentials list, a Jelly config method for a build job. * * @return A list of Perforce credential items to populate the jelly * Select list. */ public ListBoxModel doFillCredentialItems() { return P4CredentialsImpl.doFillCredentialItems(); } public FormValidation doCheckCredential(@QueryParameter String value) { return P4CredentialsImpl.doCheckCredential(value); } } /** * This methods determines if the SCM plugin can be used for polling */ @Override public boolean supportsPolling() { return true; } /** * This method should return true if the SCM requires a workspace for * polling. Perforce however can report submitted, pending and shelved * changes without needing a workspace */ @Override public boolean requiresWorkspaceForPolling() { return true; } /** * Helper: find the Remote/Local Computer used for build * * @param workspace * @return */ private static Computer workspaceToComputer(FilePath workspace) { Jenkins jenkins = Jenkins.getInstance(); if (workspace.isRemote()) { for (Computer computer : jenkins.getComputers()) { if (computer.getChannel() == workspace.getChannel()) { return computer; } } } return null; } /** * Helper: find the Node for slave build or return current instance. * * @param workspace * @return */ private static Node workspaceToNode(FilePath workspace) { Computer computer = workspaceToComputer(workspace); if (computer != null) { return computer.getNode(); } Jenkins jenkins = Jenkins.getInstance(); return jenkins; } /** * Remote execute to find hostname. * * @param buildWorkspace * @return */ private static String getHostName(FilePath buildWorkspace) { try { HostnameTask task = new HostnameTask(); String hostname = buildWorkspace.act(task); return hostname; } catch (Exception e) { return ""; } } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#163 | 29868 | Sandeep Kumar |
Merge pull request #196 from jenkinsci/StreamAtChange Add stream at change in StreamWorkspace and P4Sync |
||
#162 | 29829 | Sandeep Kumar |
PerforceScm does not override equals method. So comparing will give different result every time. Replace equals with instanceof |
||
#161 | 29673 | Sandeep Kumar |
Merge pull request #188 from jenkinsci/CodeRefactoring Code Cleanup |
||
#160 | 28786 | Paul Allen |
Merge pull request #133 from nephre/force_sync_when_p4cleanworkspace Force sync and populate have list on P4_CLEANWORKSPACE |
||
#159 | 28497 | Paul Allen |
Moved the User session configuration to Credentials. The global configuration settings are not accessible during slave execution. Moving the configuration under Credentials allows users easily try out the cache for specific users/p4d servers. |
||
#158 | 28464 | Paul Allen |
Formalise user session cache. Added Jelly options to Global Configuration. User cache is disabled by default. Ticket Minimum life is set to 30 minutes. JENKINS-60141 |
||
#157 | 28008 | Paul Allen |
Merge pull request #129 from nephre/polling_per_change Add support for controlling polling per change filter behavior with build parameter. JENKINS-66169 |
||
#156 | 27492 | Paul Allen |
Add new Filter to build with the latest change found during polling. JENKINS-63879 |
||
#155 | 27442 | Paul Allen |
Added global - hide Server messages option. JENKINS-59750 |
||
#154 | 27240 | Paul Allen |
Merge pull request #95 from lystor/bug-56248 JENKINS-56248: P4Plugin Polls Workspaces With Disabled Polling (poll: false) |
||
#153 | 26860 | Paul Allen |
Global option to include changes since last successful build. JENKINS-64030 |
||
#152 | 26673 | Paul Allen |
Code cleanup - remove calls to Deprecated methods - Deprecated classes like AbstractStepImpl, AbstractStepDescriptorImpl and AbstractSynchronousStepExecution for P4TaggingStep |
||
#151 | 26363 | Paul Allen |
Merge pull request #117 from mlynnyk/tagAction-issue. tagAction should not be written to config.xml |
||
#150 | 26236 | matthew_smeeth | Added extra debugging for executor number. | ||
#149 | 26204 | Paul Allen |
Merge pull request #111 from p4charu/jenkinsci-master JENKINS-60144: Check if the template ws exists when deleting jenkins project |
||
#148 | 26163 | Paul Allen |
Pre-load build environment. buildEnvironment() is called by Jenkins and tagAction may not be set - so use old pre-load behaviour. JENKINS-60074 |
||
#147 | 26121 | Paul Allen |
Merge pull request #104 from williambrode/JENKINS-52806 Fix for p4 environment variables being wrong in parallel pipeline syncs. |
||
#146 | 26112 | Paul Allen |
Merge pull request #110 from p4charu/jenkinsci-master Fix for JENKINS-58639. If last build is not completely built look for last build… |
||
#145 | 25973 | Paul Allen | Fix JavaDoc issues | ||
#144 | 25851 | Paul Allen |
Set range query default to 1000. The plugin will query the last 1000 changes when looking within a workspace view. |
||
#143 | 25850 | Paul Allen |
Merge pull request #101 from williambrode/master Lower print out for null changelog to logger.fine() |
||
#142 | 25849 | Paul Allen |
Merge pull request #102 from stuartrowe/JENKINS-58504 [JENKINS-58504] Only set the script path for pipeline script checkout |
||
#141 | 25826 | Paul Allen |
Global option to limit change query. By default 'Head change query limit' is set to 0 (no limit) and the plugin will query all changes when looking within a workspace view. For large servers set the value to a range based on commit rate and job queue duration. e.g. 200 global commits/hour and jobs are queued for no longer than 10 hours, so 2000 change query limit (200*10). JENKINS-58116 JENKINS-57870 |
||
#140 | 25736 | Paul Allen |
Cleanup step - use checkbox state and ignore Global option. The global options for deleting the client is ignored and the cleanup checkbox state is used. The Global option for deleting files still applies, but some what irrelevant as Jenkins can manage this in other steps. Note that the RemoveClientTask is used for cleaning up temp clients in polling and checkout steps as wall as deleting a Jenkins Job. JENKINS-47107 |
||
#139 | 25439 | Paul Allen |
Skip polling if Job is in WaitingItem Queue. JENKINS-56037 JENKINS-56286 |
||
#138 | 25437 | Paul Allen |
Skip build if polling finds no/null change. JENKINS-55075 |
||
#137 | 25123 | Paul Allen |
Added Pipeline Job support and tests for declarative and scripted. JENKINS-39107 |
||
#136 | 25115 | Paul Allen |
Merge pull request #91 from p4charu/jenkinsci-master Fixed JENKINS-39107 and JENKINS-55826 |
||
#135 | 25015 | Paul Allen | Enable/Disable MultiBranch Scan per change using Polling Filter. | ||
#134 | 25014 | Paul Allen |
Scan per change support for MultiBranch with remote Jenkinsfiles. Only the 'Polling per Change' Filter is supported; need to disable or support the other filter types. JENKINS-53936 |
||
#133 | 24944 | Paul Allen |
Merge pull request #86 from p4charu/jenkinsci-master JENKINS-51632 and minor code cleanup |
||
#132 | 24942 | Paul Allen |
Deep clone of Workspace objects. WorkspaceSpec was not cloned and caused the View to change. JENKINS-54695 |
||
#131 | 24792 | Paul Allen |
Cleanup Global workspace used during polling. The tempoary workspace is recreated by the polling event from details stored in the previous builld's metadata. JENKINS-50975 |
||
#130 | 24777 | Paul Allen |
Global Library to use UUID for client name and delete after use. Add a new 'Delete the Perforce Client after checkout' option (for Manual clients) which normaly is false, but set to true for Global Library checkouts. JENKINS-50975 |
||
#129 | 24662 | Paul Allen |
Undo *SCMSource rename to original *ScmSource. Reslove configuration loading issue due to 1.9.0 bad release. |
||
#128 | 24591 | Paul Allen |
Merge pull request #79 from kroutley/disablePollingBypass. [JENKINS-53224] Disable polling bypass |
||
#127 | 24529 | Paul Allen |
Swarm Commit Event support, refactoring and test. JENKINS-52605 (Fix doc in 'Includes' help bubble for MultiBranch) JENKINS-52066 (Improve Swarm Commit and Branch Event support) |
||
#126 | 24501 | Paul Allen | Refactor to use P4SCMXxx naming convention. | ||
#125 | 24497 | Paul Allen |
Force use of revision for Head. Update P4Head->P4Path revision with P4Revision to avoid builds on unbounded 'latest'. |
||
#124 | 24492 | Paul Allen |
Initial work for MultiBranch Event trigger. JENKINS-52066 (Triggered Events and not Polling per change) |
||
#123 | 24487 | Paul Allen | Perforce Connection Refactor. | ||
#122 | 23959 | Paul Allen | Cleanup findbugs warnings. | ||
#121 | 23943 | Paul Allen |
Poll per change for Pipeline. JENKINS-47427 |
||
#120 | 23941 | Paul Allen |
Track Credentials at build time. Unable to track when the Job is configured as Pipeline Jobs may use one or more credentials in the Jenkinsfile. JENKINS-44706 |
||
#119 | 23652 | Paul Allen |
Use getPreviousCompletedBuild() The lastBuild from getPreviousBuild() may be in progress or blocked. Case#00319764 |
||
#118 | 23626 | Paul Allen |
Do not change the workspace root during polling. JENKINS-48434 |
||
#117 | 23590 | Paul Allen |
Fix file limits for change reporting. JENKINS-47602 |
||
#116 | 23239 | Paul Allen |
Add configuration parameter for choosing whether to allow auto-submission of config changes to perforce. This can avoid creating floods of changelists at the cost of requiring a manual changelist submit. A scheduled task may be alleviate the need to manually submit the updated changes while still reducing the number of changelists created. @Tsaukpaetra https://swarm.workshop.perforce.com/reviews/23186 |
||
#115 | 23234 | Paul Allen |
Avoid resetting workspace root during polling operation. Ideally, workspaces shouldn't need to be reconfigured every poll, but adjusting the polling logic to only create-if-not-exists is beyond my scope. JENKINS-46908 @Tsaukpaetra https://swarm.workshop.perforce.com/reviews/23183 |
||
#114 | 23218 | Paul Allen |
Merge pull request #63 from ADTRAN/JENKINS-34052 [FIX JENKINS-34052] Poll for concurrent jobs |
||
#113 | 23192 | Paul Allen | Workaround for EXECUTOR_NUMBER not being set. | ||
#112 | 23190 | Paul Allen |
Merge pull request #62 from fbyrne/standardize-nodename-var. Standardize the evaluation of what NODE_NAME in p4 workspace name generation |
||
#111 | 23155 | Paul Allen |
Remove Workspace cloning for better concurrent builds. Remove Workspace cloning and encourage users to make use of EXECUTOR_NUMBER in the Jenkins job name. JENKINS-41432 |
||
#110 | 23065 | Paul Allen | Null check on changelogFile before writing log. | ||
#109 | 23018 | Paul Allen |
Support null changelogFile if checkout sets changelog:false JENKINS-46352 |
||
#108 | 22987 | Paul Allen |
Clean up changelogFilename reporting for HUDSON_CHANGELOG_FILE. JENKINS-37442 |
||
#107 | 22970 | Paul Allen |
Merge pull request #57 from jfperusse-bhvr/fix-changelog-errors Fix changelog issues caused by NullPointerException in getSwarm JENKINS-47336 |
||
#106 | 22926 | Paul Allen |
Expose P4_REVIEW and P4_REVIEW_STATUS. Extended test coverage and removed duplicate code for building the environment. |
||
#105 | 22856 | Paul Allen |
Remove guessBrowser() and lookup browser when used. guessBrowser() gets called a lot and each lookup opens a Perforce connection. JENKINS-46810 |
||
#104 | 22821 | Paul Allen |
Merge pull request #53 from jenkinsci/TagAction-order Get Last TagAction. JENKINS-37618 JENKINS-45613 |
||
#103 | 22684 | Paul Allen | Added @Symbol to Extension classes for Pipeline Syntax. | ||
#102 | 22408 | Paul Allen |
Set SCM Environment for Jenkins 2.60+ JENKINS-37584 JENKINS-40885 |
||
#101 | 22396 | Paul Allen |
MultiBranch support for Perforce Swarm Reviews. A work in progress - adds Swarm API support to find branches and reviews from a Swarm project. #review-22354 |
||
#100 | 22372 | Paul Allen |
Update Repository Browser for use with Pipeline. May fix the following: JENKINS-43069 JENKINS-37094 |
||
#99 | 22128 | Paul Allen |
Helix Graph support for Jenkins. JENKINS-40354 |
||
#98 | 22021 | Paul Allen |
Set environment to expand client name for Publish and Remove Client. JENKINS-43378 |
||
#97 | 21937 | Paul Allen |
Only reports changes since the last build. Previously the build summary reported all changes since the last successful build. JENKINS-40747 |
||
#96 | 21794 | Paul Allen |
Merge pull request #39 from Dohbedoh/JENKINS-34825 Jenkins 34825 |
||
#95 | 21659 | Paul Allen |
Cleanup TagAction. Only call get method on TagAction once per entry. Fetch values at construction or workspace creation, not on demand. |
||
#94 | 21642 | Paul Allen |
Merge pull request #37 from i386/feature/JENKINS-41459 JENKINS-41459 fixes NPE when credential is null |
||
#93 | 21324 | Paul Allen |
Create syncID to track syncs when polling. Original design used the client name to track the sync from previous builds, however as polling is on the master if NODE_NAME is used it breaks with slaves. JENKINS-40356 |
||
#92 | 21271 | Paul Allen |
Prevent NPE on polling if no previous builds. JENKINS-40356 |
||
#91 | 21270 | Paul Allen |
Prevent NPE on polling if no previous builds. JENKINS-40356 |
||
#90 | 21215 | Paul Allen |
Polling fix for Multi client support in Pipeline. Jenkins polls for each SCM checkout, so must poll each workplace and therefore need to lookup last build information for each sync. Polling now uses same lookup as Change Summary. Added extra test cases multi sync poll and poll again. JENKINS-38401 JENKINS-37462 JENKINS-39652 |
||
#89 | 21207 | Paul Allen |
Multi client support in Pipeline. If two or more `p4sync` operations are called in one Pipeline script, they MUST have different client names. During a build, multiple entries are added to the build history; on subsequent builds they are used in the three following situations: - Polling: largest change number across all the checkouts is used. - Change Summary: last change with the same client name is used. - Environment: last change recorded (regardless of client). Added two test cases to cover basic multi sync build/poll situations. JENKINS-38401 JENKINS-37462 JENKINS-39652 |
||
#88 | 21154 | Paul Allen | P4HOST support for connection. | ||
#87 | 21153 | Paul Allen |
Merge pull request #32 from pyssling/master Use latest change for all builds when polling JENKINS-40048 |
||
#86 | 21077 | Paul Allen |
Switch polling back to build.xml Change in Polling behaviour; use last build details in the build.xml file. It gathers 'last' change details on the master thread and not a slave thread. JENKINS-37462 - updated and improved test case |
||
#85 | 21024 | Paul Allen |
Allow concurrent use a Client during polling. Prevents Jenkins from blocking trigger events when polling and a build is in progress. JENKINS-38425 |
||
#84 | 20986 | Paul Allen |
Ground work for MultiJob support. Pushed validate up to ConnectionHelper and added new Perforce functions. |
||
#83 | 20873 | Paul Allen | Support Pin to a change in a counter. | ||
#82 | 20818 | Paul Allen |
Global limits for changes and files. Max number of change lists to show for a build (default 10) Max number of files to list in a change (default 50) |
||
#81 | 20787 | Paul Allen |
Polling Fix for use with quiet period. Switched all uses of change/label to P4Revision object and implemented Comparable. The changes to build are now calculated at build time (after the quiet period) not during the polling phase. JENKINS-36883 #review-20780 |
||
#80 | 20667 | Paul Allen |
Merge pull request #28 from tangkun75/master Workspace's root path overwritten to "null" when enabling polling in Pipeline job |
||
#79 | 20226 | Paul Allen |
Support for Multiple SCMs Plugin. Optional dependency on multiple-scms and helper method for safely casting SCM object to PerforceSCM instance, especially in the scenario where the SCM object is a MultiSCM instance. JENKINS-32064 |
||
#78 | 20201 | Paul Allen | Moved set to null checked block. | ||
#77 | 20190 | Karl Wirth |
Expose HUDSON_CHANGELOG_FILE environment variable. JENKINS-37442 #p4karl |
||
#76 | 20179 | Paul Allen | Javadoc fixes for java 8 builds. | ||
#75 | 19890 | Paul Allen |
Set environment before removing workspace. Verify NPE with test case. JENKINS-36422 |
||
#74 | 19764 | Paul Allen | Simplify RemoveClientTask by using AbstractTask. | ||
#73 | 19612 | Paul Allen | Polling fix, if no previous build. | ||
#72 | 19593 | Paul Allen | More minor fixes to satisfy FindBugs Analysis. | ||
#71 | 19581 | Paul Allen | Minor fixes to satisfy FindBugs Analysis. | ||
#70 | 19574 | Paul Allen | Support for guessBrowser and getKey. | ||
#69 | 19516 | Paul Allen | Merge pull request #23 from Dohbedoh/JENKINS-29979 | ||
#68 | 19454 | Paul Allen |
Hide P4_TICKET for secure systems. An option in the global configuration to hide the P4_TICKET variable (not set by default). JENKINS-24591 |
||
#67 | 19374 | Paul Allen |
Poll on Master (without workspace) New Polling Filter ‘Poll on Master using Last Build’. Only polls on the master and fetches it change from the last Build. Note that 0 is assumed if no previous build is found. JENKINS-32814 |
||
#66 | 18440 | Paul Allen |
Prevent Delete actions on the Publish step. Limit reconcile to -ae (add/edit) JENKINS-28448 |
||
#65 | 18336 | Paul Allen |
Merge pull request #22 from ADTRAN/master Fix polling on workflow jobs. (JENKINS-29598) |
||
#64 | 18335 | Paul Allen |
Slave support for Clean Up Workspace. Will remove the client and/or versioned files. Other non versioned files are removed by Jenkins not the p4 plugin. Uncomment lines 67,68 in RemoveClientTask.java to fix Jenkins bug. JENKINS-24003 |
||
#63 | 17303 | Paul Allen |
Unsync Perforce versioned files on cleanup. Don’t rely on Jenkins to Delete Perforce versioned files as some OS ACLs can’t delete them. JENKINS-24003 |
||
#62 | 17263 | Paul Allen |
Added enable/disable option for auto versioning. Global option to activate Perforce versioning of Jenkins Configurations. |
||
#61 | 16836 | Paul Allen |
Versioning for Jenkins configuration pages. Add credential, depot path location and client workspace name, everything else should be automatic. JENKINS-25145 |
||
#60 | 16820 | Paul Allen |
Delete client workspace and files on a delete Jenkins Job Global Perforce options for delete files and/or delete client. JENKINS-32454 |
||
#59 | 16819 | Paul Allen |
Clear change-list cache after build (polling or build now). JENKINS-31862 |
||
#58 | 16815 | Paul Allen |
Enable early binding for CHARSET Expose CHARSET to AbstractTask to allow the charset to be set at the point the client workspace is set as current in ClientHelper. |
||
#57 | 16514 | Paul Allen |
Unshelve and resolve build step. Implements a classic Jenkins Build step (i.e. not Workflow). Must provide a shelf change number and resolve options. The shelf change number supports variable expansion ${VAR}. |
||
#56 | 15752 | Paul Allen |
Update workspace before parallel cloning. Parallel builds clone the workspace using a template, but the base workspace needs to save any changes before the clone. |
||
#55 | 15750 | Paul Allen |
Use a P4Revision object and not int/String as Object. In sure that there is no ambiguity with the revision specifier. Should fix change summary when using the Workflow plugin. JENKINS-30425 |
||
#54 | 15665 | Paul Allen |
Create a template workspace for parallel builds. If Jenkins attempts a parallel build it creates a workspace@2 directory. This change creates a new template workspace (appended with .clone2) and substitutes the `@` to `%40` in the root path. JENKINS-29387 |
||
#53 | 15663 | Paul Allen |
Added P4_USER and P4_TICKET environment variables. Added Perforce environment variables to the buildEnv documentation. JENKINS-24591 |
||
#52 | 15379 | Paul Allen |
Ground-work for Workflow-DSL (Split out Sven’s DSL changes to the core) @sven_erik_knop |
||
#51 | 15345 | Paul Allen |
Fixed issue with workflow-plugin when setting changelog to false. @niconorsk |
||
#50 | 14838 | Paul Allen |
Check if the workspace exists before cleanup. JENKINS-29030 |
||
#49 | 14779 | Paul Allen |
Add shelved changes to built changes list. JENKINS-25724 |
||
#48 | 14040 | Paul Allen | Delay polling if a build is in progress. | ||
#47 | 13777 | Paul Allen | (matthauck) Fix JENKINS-28726: Allow for default matrix execution strategy | ||
#46 | 13701 | Paul Allen |
Move Labelling into a Task. Logging improvements. |
||
#45 | 13681 | Paul Allen |
Abstracted Expand class from Workspace. Added support for Label variable expansion in the name and description. |
||
#44 | 12977 | Paul Allen | Quiet option for Populate. | ||
#43 | 12976 | Paul Allen | Improved logging to include 'actual' Perforce command. | ||
#42 | 12953 | Paul Allen |
Update logging to support expand/collapse divs. - Additional Publish logging |
||
#41 | 12932 | Paul Allen |
New Populate CheckOnly Implementation. No tidy or sync steps only a have list update. Intended for use with polling and triggering other Jenkins jobs. #review-12933 @mjoubert |
||
#40 | 12931 | Paul Allen |
#review-12907 @mjoubert Added P4PORT to env for command line calls. |
||
#39 | 12199 | Paul Allen |
Fix for change number on matrix builds. If the Matrix build was for a shelved change then the children would sync at the shelved change and not the submitted change. |
||
#38 | 11941 | Paul Allen |
Minor updates. Update credentials to 1.22 and remove old p4java snapshot repo. Includes name refactor (project -> job) |
||
#37 | 11626 | Paul Allen |
Workflow support. - Updated the plugin to the latest LTS Jenkins release 1.580.3. - Updated P4Java to 2014.1 Tested with simple ‘static’ workspace, there may be limitations with ‘manual’ workspace. Plan to add DSL support by extending the SCMStep class. #review-11537 JENKINS-24206 |
||
#36 | 11561 | Paul Allen |
Avoid writing `null` client root. Added protection to prevent a null client root value being written during polling. The client root is not set during polling as the workspace could be polled from another node. Change also prevents updates to Static workspaces. JENKINS-26589 |
||
#35 | 11531 | Paul Allen |
Resolve hostname on the remote slave. Avoid the Node object as resolving DNS on the remote host will be the same way as the Perforce Workspace. |
||
#34 | 11492 | Paul Allen | Minor Fix: first parent builds and label namespace | ||
#33 | 11475 | Paul Allen |
Build children at parent's change. The change calculated by the parent is passed to the children. This avoids change drift for long builds with delayed executors. |
||
#32 | 11472 | Paul Allen |
Pin the Workspace to the build host. Added a check box under the Workspace configuration to allow Jenkins to Pin the workspace, by setting the Host field. The hostname is resolved from the Computer object or InetAddress. |
||
#31 | 11460 | Paul Allen | Set the Host field in the client to NODE_NAME. | ||
#30 | 11451 | Paul Allen |
Fix for ${NODE_NAME} evaluation. Use Jesse Glick’s workspaceToNode() method to evaluate the Node given a FilePath object. |
||
#29 | 11367 | Paul Allen |
Fixes to Remote slave polling - Missing Serializable on Filter classes - Pass a list of changes using return |
||
#28 | 11335 | Paul Allen | Remote slave support for Polling. | ||
#27 | 11334 | Paul Allen |
Remote slave support for Publish Perforce Publish commands need to be executed from the remote slave. - Includes refactoring into task package |
||
#26 | 11269 | Paul Allen |
Poll parent if Matrix 'Build Parent' is set. If the 'Build Parent' option under Configuration Matrix' --> 'Execution Strategy' --> 'Perforce: Matrix options' is set then polling will only check the parent and not the children for changes. |
||
#25 | 11093 | Paul Allen | Trigger Swarm for pass/fail for multi builds. | ||
#24 | 11084 | Paul Allen |
(mjoubert) Fully populate changelog.xml Replaces sparse change log which only recorded the change number. The change is now recorded in full allowing faster page load times. The number of files listed in the change is limited to 50; to view larger changes please add a repo browser such as Swarm, Fisheye, P4Web, etc… |
||
#23 | 11034 | Paul Allen |
Set default for NODE_NAME. Builds on the master might not expand NODE_NAME leaving and empty string. |
||
#22 | 10942 | Paul Allen |
Set value for NODE_NAME for SCM Polling NODE_NAME is hard to calculate in the Polling step, so set the default to ‘master’. |
||
#21 | 10914 | Paul Allen |
SCM Polling Use client path syntax for listing have changes as using a windows path on a linux master will fail. Exit early from polling if a change is found. |
||
#20 | 10907 | Paul Allen |
Minor fixes for Parent builds. - Disable ‘*’ substitution (too dangerous on large systems). - Skip change calculation when skipping parent. |
||
#19 | 10906 | Paul Allen |
Matrix Polling and Parent control - Polling for Matrix builds calculates changes based on children. - Parent build disabled when using "Matrix options for Perforce" in the Matrix Configuration (can be enabled by checking the “Build parent” box). - Parent Build now substitutes ${var} with ‘*’ for the workspace view. e.g. //depot/${os}/… //ws/${os}/… becomes… //depot/*/… //ws/*/… instead of… //depot/os/… //ws/os/… |
||
#18 | 10899 | Paul Allen |
Prevent error when deleting unbuilt jobs. If a job has no previous build it could fail with a null pointer. JENKINS-25491 |
||
#17 | 10879 | Paul Allen |
Fix null formatTags in Workspace, by loading label from the cloned workspace. JENKINS-25596 |
||
#16 | 10854 | Paul Allen |
Clone Workspace Object Seems Jenkins makes re-entrant calls to the PerforceScm Object and caused the Workspace Object to get trampled. JENKINS-25547 |
||
#15 | 10841 | Paul Allen |
Support for 2014.1 reconcile by MODTIME Feature allows a user check the option ‘Sync with MODTIME for consistency check’ under the ‘Populate’ option to enable reconcile to check files based on MODTIME. Includes test case for MODTIME and minor fix for fetching a Label when there is no previous change. JENKINS-25341 |
||
#14 | 10802 | Paul Allen |
Test cases for SCM Polling Added test case for Polling with Limits (pinning) and Incremental. |
||
#13 | 10801 | Paul Allen |
Improvements to SCM Polling Moved change list calculation into a new class CheckoutChanges. Should enable normal build to build every thing and poll to follow polling behaviour: limit based on pin and per-change if set. JENKINS-25300 |
||
#12 | 10755 | Paul Allen |
Separate name space for 'label' parameter. Perforce Review endpoint added `label`, `change`, `status`, `pass`, and `fail` parameter into the environment, which is a shared name space. This clashed with the default `label` matrix name and causing users issues. The change prefixes the review parameters with `p4.` on addition to the environment. |
||
#11 | 10525 | Paul Allen |
Update Changelist calculation. Changed the SCM Polling and change listing reporting to calculate the last change based on the highest reported 'have' entry from 'p4 cstat' and then list using 'p4 changes'. JENKINS-24978 JENKINS-24607 |
||
#10 | 10084 | Paul Allen | Polling will trigger on 'cstat' OR 'sync -n'. | ||
#9 | 9990 | Paul Allen | Remove unnecessary setting of Root. | ||
#8 | 9984 | Paul Allen |
Set P4_CHANGELIST to change for Automatic Labels. P4_CHANGELIST is set to a change number or label if defined in Populate as pinned or a build parameter. |
||
#7 | 9980 | Paul Allen |
Changed error reporting to use AbortException. - Use direct access of scm attributes, not via build.getProject().getScm() - Improved logging around labels/changes. |
||
#6 | 9851 | Paul Allen | Merging using p4-jenkins | ||
#5 | 9819 | Paul Allen | Merging using p4-jenkins | ||
#4 | 9803 | Paul Allen | Merging using p4-jenkins | ||
#3 | 9769 | Paul Allen | Copying using p4-jenkins | ||
#2 | 9738 | Paul Allen | Merging using p4-jenkins | ||
#1 | 9690 | Paul Allen |
[Branching using p4-jenkins] Release 1.0.1 |
||
//guest/paul_allen/dev/p4-jenkins/p4-client/src/main/java/org/jenkinsci/plugins/p4/PerforceScm.java | |||||
#1 | 9672 | Paul Allen | Refactor name from 'p4_client' to 'p4'. | ||
//guest/paul_allen/dev/p4-jenkins/p4-client/src/main/java/org/jenkinsci/plugins/p4_client/PerforceScm.java | |||||
#32 | 9495 | Paul Allen |
Fix Polling issue; using the wrong client. Removed static classes and internal referenced to PerforceScm attributes, to avoid threading issues. |
||
#31 | 9472 | Paul Allen |
Added support to pin build at a label in the populate configuration. - includes help and updates to tests. |
||
#30 | 9430 | Paul Allen |
Polling SCM: skip filter check if no filters - added more logging for Polling errors. |
||
#29 | 9429 | Paul Allen |
Fix SCM Polling bug. Client workspace was not set (unless by an earlier build). - Move listChanges method to ClientHelper. |
||
#28 | 9115 | Paul Allen |
Initial implementation of workspace Cleanup and Sync options. - Includes 3 modes: Automatic Clean/Sync, Force Clean/Sync, Sync Only Automatic Clean/Sync Uses reconcile to clean up workspace and sync changes. Force Clean/Sync Force sync of all files (does not remove files yet...) Sync Only Normal sync with no cleanup TODO: - remove of files in Force Clean/Sync mode - Inline help - Update docs - Add unit/functional tests |
||
#27 | 9091 | Paul Allen |
Added Changelist build filtering for SCM polling: - Configuration uses 'repeatableHeteroProperty' - Filter on Perforce username - Filter on Perforce Depot path (no wildcard support) |
||
#26 | 9069 | Paul Allen |
Adding initial support for tagging Jenkins builds as Perforce Automatic Labels. Only implements TagAction (manual labels); TagNotifier and test cases TODO. |
||
#25 | 9055 | Paul Allen |
Label support. Build at a label using the pram 'label'. This includes adding the label to the ChangeEntry, building the change reports and Browser links to Swarm. (TPI-102) |
||
#24 | 9038 | Paul Allen |
Improved error messages for Form Validate field checks. Uses Perforce Server messages (TPI-80) |
||
#23 | 8969 | Paul Allen |
Adds all contributing change-lists for the build to the change log (using p4 cstat). - Includes exception logging for server connection to the Jenkins console. |
||
#22 | 8940 | Paul Allen |
Major refactor for the ConnectionHelper class to simplify serialisation. Fixed remote Jenkins JNLP slave connection issue. ClientHelper now extends ConnectionHelper and takes on all methods that require a client workspace. P4StandardCredentials is sent to the remote node instead of Credentials ID due to an issue accessing the Credentials store over a remote connection. For simplicity Client ID (workspace name) is serialised instead of the Workspace object. |
||
#21 | 8929 | Paul Allen |
Clean up doCheck Warnings on configuration page (TPI-80). - Added check exceptions to log as warnings. |
||
#20 | 8915 | Paul Allen |
Support for ChangeLog and RepoBrowser. - Added RepoBrowser for Swarm (porting the others should be easy) - ChangeLog XML file now only stores the changelist number all other information is fetched from Perforce |
||
#19 | 8771 | Paul Allen |
Perforce Server 12.1 min check for: Build configuration and password/ticket credentials. Includes: - Added logging for Perforce connections (fine) and set connection pool to 2. - Add 'none' to empty charset list (connection bug?) - Supress P4Java errors for syncing ubinary, xtext, unicode |
||
#18 | 8770 | Paul Allen |
Implemented SCM hook for when Jenkins deletes a workspace. The PerforceScm plugin deletes the workspace, but leaves Jenkins to clean up the local files and directories. (includes dummy 'p4 cstat' code for change reporting) |
||
#17 | 8762 | Paul Allen |
Console Ouptut logging for SCM build steps. - Removed SLF4J and used old style logger (matching Jenkins) - Set Client Host filed to null, Jenkins sometimes gives an IP address. - Test p4java setps in SCM tasks for success(true/false) |
||
#16 | 8744 | Paul Allen |
Support basic SCM Polling. When Jenkins has "Poll SCM" checked the Perforce SCM provider just runs a 'p4 sync -n' on the Workspace. Simple and Fast. |
||
#15 | 8738 | Paul Allen |
Workspace Name Formatter. For Template and Stream workspaces it allows the substitution of the following tags: ${node} The name given to the slave Jenkins node. ${hostname} The hostname for the slave Jenkins node. ${project} The name of the Jenkins build Job. ${hash} Unique hash code of the Jenkins node. |
||
#14 | 8737 | Paul Allen |
Added basic Help for SCM Configuration page. Tidy up descriptions and fix (null:null) in Credential summary. |
||
#13 | 8694 | Paul Allen | Added support for unshelve and revert -w behaviour for builds. | ||
#12 | 8688 | Paul Allen | (Work in progress) Able to call build from review Action and pass URL params. | ||
#11 | 8664 | Paul Allen | Simplified connection to Perforce to get around the SCM initilisation (or lack of). | ||
#10 | 8663 | Paul Allen | Rollout of charset for all Workspace modes. | ||
#9 | 8661 | Paul Allen | Workspace auto fill | ||
#8 | 8641 | Paul Allen | Added workspace helper (setClient) and template/stream types. | ||
#7 | 8640 | Paul Allen |
Added Workspace and Singleton descriptor. Removed old connection code. |
||
#6 | 8639 | Paul Allen |
Added hint URL to Credentials page when no Credentials are defined. Minor refactor and UX changes. |
||
#5 | 8629 | Paul Allen |
Added p4java with connection/authorisation helper classes. Included SSL support and detection of Unicode servers. |
||
#4 | 8613 | Paul Allen | Tidy up unused Credentials data and for debug added getId() to SelectList title. | ||
#3 | 8612 | Paul Allen | Job can now select and save/load Credential choice (some cleanup TODO) | ||
#2 | 8611 | Paul Allen | Basic implementation of Credentials Store | ||
#1 | 8598 | Paul Allen | Experimentation with data binding for Jelly files and ExtensionPoint/Descriptor |