package org.jenkinsci.plugins.p4.tasks; import hudson.AbortException; import hudson.FilePath.FileCallable; import hudson.remoting.VirtualChannel; import java.io.File; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import org.jenkinsci.plugins.p4.changes.P4ChangeEntry; import org.jenkinsci.plugins.p4.client.ClientHelper; import org.jenkinsci.plugins.p4.populate.Populate; import org.jenkinsci.plugins.p4.review.ReviewProp; import org.jenkinsci.plugins.p4.workspace.Workspace; import com.perforce.p4java.impl.generic.core.Label; public class CheckoutTask extends AbstractTask implements FileCallable<Boolean>, Serializable { private static final long serialVersionUID = 1L; private static Logger logger = Logger.getLogger(CheckoutTask.class .getName()); private final Populate populate; private CheckoutStatus status; private int head; private Object buildChange; private int review; /** * Constructor * * @param populate */ public CheckoutTask(Populate populate) { this.populate = populate; } public void initialise() throws AbortException { ClientHelper p4 = getConnection(); try { // fetch and calculate change to sync to or review to unshelve. status = getStatus(getWorkspace()); head = p4.getClientHead(); review = getReview(getWorkspace()); buildChange = getBuildChange(getWorkspace()); // try to get change-number if automatic label if (buildChange instanceof String) { String label = (String) buildChange; if (p4.isLabel(label)) { Label labelSpec = p4.getLabel(label); String revSpec = labelSpec.getRevisionSpec(); if (revSpec != null && !revSpec.isEmpty() && revSpec.startsWith("@")) { try { int change = Integer.parseInt(revSpec.substring(1)); buildChange = change; } catch (NumberFormatException e) { // leave buildChange as is } } } } } catch (Exception e) { String err = "P4: Unable to initialise CheckoutTask: " + e; logger.severe(err); p4.log(err); throw new AbortException(err); } finally { p4.disconnect(); } } /** * Invoke sync on build node (master or remote node). * * @return true if updated, false if no change. */ public Boolean invoke(File workspace, VirtualChannel channel) throws IOException { ClientHelper p4 = getConnection(); try { // Check connection (might be on remote slave) if (!checkConnection(p4)) { return false; } // Tidy the workspace before sync/build p4.tidyWorkspace(populate); // Sync workspace to label, head or specified change p4.syncFiles(buildChange, populate); // Unshelve review if specified if (status == CheckoutStatus.SHELVED) { p4.unshelveFiles(review); } } catch (Exception e) { String msg = "Unable to update workspace: " + e; logger.warning(msg); throw new AbortException(msg); } finally { p4.disconnect(); } return true; } /** * Get the build status for the parameter map. * * @param map * @return */ private CheckoutStatus getStatus(Workspace workspace) { CheckoutStatus status = CheckoutStatus.HEAD; String value = workspace.get(ReviewProp.STATUS.toString()); if (value != null && !value.isEmpty()) { status = CheckoutStatus.parse(value); } return status; } /** * Get the sync point from the parameter map. Returns the head if no change * found in the map. * * @param map * @return */ private Object getBuildChange(Workspace workspace) { // Use head as the default Object build = this.head; // if change is specified then update String change = workspace.get(ReviewProp.CHANGE.toString()); if (change != null && !change.isEmpty()) { try { build = Integer.parseInt(change); } catch (NumberFormatException e) { } } // if label is specified then update String label = workspace.get(ReviewProp.LABEL.toString()); if (label != null && !label.isEmpty()) { try { // if build is a change-number passed as a label build = Integer.parseInt(label); } catch (NumberFormatException e) { build = label; } } return build; } /** * Get the unshelve point from the parameter map. * * @param map * @return */ private int getReview(Workspace workspace) { int review = 0; String value = workspace.get(ReviewProp.REVIEW.toString()); if (value != null && !value.isEmpty()) { try { review = Integer.parseInt(value); } catch (NumberFormatException e) { } } return review; } public List<Integer> getChanges(Object last) { List<Integer> changes = new ArrayList<Integer>(); // Add changes to this build. ClientHelper p4 = new ClientHelper(getCredential(), getListener(), getClient()); try { changes = p4.listChanges(last, buildChange); } catch (Exception e) { String err = "Unable to get changes: " + e; logger.severe(err); p4.log(err); e.printStackTrace(); } finally { p4.disconnect(); } // Include shelf if a review if (status == CheckoutStatus.SHELVED) { changes.add(review); } return changes; } public List<Object> getChangesFull(Object last) { List<Object> changesFull = new ArrayList<Object>(); List<Integer> changes = new ArrayList<Integer>(); // Add changes to this build. ClientHelper p4 = new ClientHelper(getCredential(), getListener(), getClient()); try { if (status == CheckoutStatus.SHELVED) { P4ChangeEntry cl = new P4ChangeEntry(); cl.setChange(p4, review); changesFull.add(cl); } changes = p4.listChanges(last, buildChange); for (Integer change : changes) { P4ChangeEntry cl = new P4ChangeEntry(); cl.setChange(p4, change); changesFull.add(cl); } } catch (Exception e) { String err = "Unable to get changes: " + e; logger.severe(err); p4.log(err); e.printStackTrace(); } finally { p4.disconnect(); } return changesFull; } public CheckoutStatus getStatus() { return status; } // Returns the number of the build change not the review change public Object getSyncChange() { return buildChange; } public Object getBuildChange() { if (status == CheckoutStatus.SHELVED) { return review; } return buildChange; } public int getReview() { return review; } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 11337 | Paul Allen | Merge down latest changes from MAIN | ||
//guest/paul_allen/dev/p4-jenkins/ublox/src/main/java/org/jenkinsci/plugins/p4/CheckoutTask.java | |||||
#8 | 11106 | mjoubert |
Changelist report ordering. Review files needs to be at the top of the change pages so developers can easily see what their changes are. #review @pallen |
||
#7 | 11080 | Paul Allen |
#review-11081 Removed unused code/comments. @mjoubert |
||
#6 | 11078 | Paul Allen |
Tidy up changes and unused methods. Unit tests look good. @mjoubert |
||
#5 | 11072 | mjoubert |
Committing review to DEV branch for further investigation @pallen |
||
#4 | 11063 | mjoubert |
Approve changes for Dev branch. Unit tests are failing; needs investigation. @pallen |
||
#3 | 11055 | Paul Allen | Run auto format to tidy up changes. | ||
#2 | 11054 | Paul Allen | Import of Morne Joubert changes. | ||
#1 | 11053 | Paul Allen | Branching using p4-jenkins | ||
//guest/perforce_software/p4jenkins/main/src/main/java/org/jenkinsci/plugins/p4/CheckoutTask.java | |||||
#14 | 10939 | Paul Allen |
Tidy up changes. - Moved duration timings to ClientHelper and measure each task individually. - White space/formatting on P4ChangeEntry. - Temporarily backed-out p4-plugin.properties file (could damage builds - need to understand requirements) |
||
#13 | 10937 | Paul Allen |
(mjoubert) pull request P4_CHANGELIST variable Adding a local properties file solves the problem better. I can set my build name for example to #${BUILD_NUMBER}.${PROPFILE,file="p4-plugin.properties",property="buildChange"} or use the env-inject plugin to use it later. We could add other items i suppose |
||
#12 | 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 |
||
#11 | 10775 | Paul Allen |
Fix change detection when using a moving label If a build was pinned or built from a label, the label name was recorded <buildChange>. If the label is updated between builds then comparing against an earlier build will give you the wrong result. This fix stores the automatic label ‘Revision’ field and stores this in <buildChange>. NOTE: you will need to run a manual build to flush the label, so that the last build has a change number. JENKINS-25300 |
||
#10 | 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. |
||
#9 | 10466 | Paul Allen |
Fix first build when pinned at change-number. On first build the logic would treat a pinned changelist build as a label, causing a processing error later for change reporting. |
||
#8 | 9987 | Paul Allen | Better logging for slave connections. | ||
#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 | 9803 | Paul Allen | Merging using p4-jenkins | ||
#4 | 9787 | 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/CheckoutTask.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/CheckoutTask.java | |||||
#14 | 9371 | Paul Allen | Fix issue when label could be empty (called by Swarm or Review URL). | ||
#13 | 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 |
||
#12 | 9069 | Paul Allen |
Adding initial support for tagging Jenkins builds as Perforce Automatic Labels. Only implements TagAction (manual labels); TagNotifier and test cases TODO. |
||
#11 | 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) |
||
#10 | 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. |
||
#9 | 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. |
||
#8 | 8926 | Paul Allen |
Bug fix when unshelving files with the Template workspace option. p4-java was unable to switch the worksapce view (without the -f flag) if there were files open. - Improved logging (as this error was hidden) - Added test case for this condition. |
||
#7 | 8924 | Paul Allen | Sync workspace to last change in workspace (not depot). | ||
#6 | 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 |
||
#5 | 8765 | Paul Allen | Update status to include SUBMITTED and sync to change. | ||
#4 | 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) |
||
#3 | 8725 | Paul Allen |
Minor fixes: - Improved tidy workspace method - Fix for template clients - After an unshelf revert -k files - Minor bug in CheckoutTask - Clear callback urls to prevet reuse |
||
#2 | 8715 | Paul Allen |
#review-8716 [Basic Swarm-Jenkins cycle DONE] Support Job's build notification and then POST's the pass/fail call-back URLs to Swarm. |
||
#1 | 8694 | Paul Allen | Added support for unshelve and revert -w behaviour for builds. |