11package hudson .plugins .perforce ;
22
3+ import hudson .plugins .perforce .config .DepotType ;
34import com .tek42 .perforce .Depot ;
45import com .tek42 .perforce .PerforceException ;
56import com .tek42 .perforce .model .Changelist ;
2223import hudson .matrix .MatrixRun ;
2324import hudson .model .*;
2425import hudson .model .listeners .ItemListener ;
26+ import hudson .plugins .perforce .config .CleanTypeConfig ;
27+ import hudson .plugins .perforce .config .MaskViewConfig ;
28+ import hudson .plugins .perforce .config .WorkspaceCleanupConfig ;
2529import hudson .plugins .perforce .utils .MacroStringHelper ;
2630import hudson .plugins .perforce .utils .ParameterSubstitutionException ;
2731import hudson .remoting .VirtualChannel ;
5458import java .io .StringWriter ;
5559import java .net .InetAddress ;
5660import java .util .*;
61+ import java .util .concurrent .atomic .AtomicLong ;
5762import java .util .logging .Level ;
5863import java .util .logging .Logger ;
5964import java .util .regex .Matcher ;
@@ -278,7 +283,13 @@ public class PerforceSCM extends SCM {
278283 private String p4Charset = null ;
279284 private String p4CommandCharset = null ;
280285
281- // Plugin constructor, (only?) used when a job configuration is saved
286+ /**
287+ * SCM constructor, (only?) used when a job configuration is saved.
288+ * This constructor uses data classes from {@link hudson.plugins.perforce.config}
289+ * to allow proper handling of hierarchical data in Stapler. In the current
290+ * state, these classes are not being used outside this constructor.
291+ */
292+ // TODO: move data to configuration classes during the refactoring
282293 @ DataBoundConstructor
283294 public PerforceSCM (
284295 String p4User ,
@@ -314,7 +325,11 @@ public PerforceSCM(
314325 PerforceRepositoryBrowser browser ,
315326 String excludedUsers ,
316327 String excludedFiles ,
317- boolean excludedFilesCaseSensitivity ) {
328+ boolean excludedFilesCaseSensitivity ,
329+ DepotType depotType ,
330+ WorkspaceCleanupConfig cleanWorkspace ,
331+ MaskViewConfig useViewMask
332+ ) {
318333
319334 this .configVersion = 1L ;
320335
@@ -341,8 +356,39 @@ public PerforceSCM(
341356
342357 this .p4UpstreamProject = Util .fixEmptyAndTrim (p4UpstreamProject );
343358
344- this .projectPath = Util .fixEmptyAndTrim (projectPath );
345-
359+ //TODO: move optional entries to external classes
360+ // Get data from the depot type
361+ if (depotType != null ) {
362+ this .p4Stream = depotType .getP4Stream ();
363+ this .clientSpec = depotType .getClientSpec ();
364+ this .projectPath = Util .fixEmptyAndTrim (depotType .getProjectPath ());
365+ this .useStreamDepot = depotType .useP4Stream ();
366+ this .useClientSpec = depotType .useClientSpec ();
367+ this .useViewMask = depotType .useProjectPath ();
368+ }
369+
370+ // Get data from workspace cleanup settings
371+ if (cleanWorkspace != null ) {
372+ setWipeRepoBeforeBuild (cleanWorkspace .isWipeRepoBeforeBuild ());
373+
374+ CleanTypeConfig cleanType = cleanWorkspace .getCleanType ();
375+ if (cleanType != null ) {
376+ setWipeBeforeBuild (cleanType .isWipe ());
377+ setQuickCleanBeforeBuild (cleanType .isQuick ());
378+ setRestoreChangedDeletedFiles (cleanType .isRestoreChangedDeletedFiles ());
379+ }
380+ }
381+
382+ // Setup view mask
383+ if (useViewMask != null ) {
384+ setUseViewMask (true );
385+ setViewMask (hudson .Util .fixEmptyAndTrim (useViewMask .getViewMask ()));
386+ setUseViewMaskForPolling (useViewMask .isUseViewMaskForPolling ());
387+ setUseViewMaskForSyncing (useViewMask .isUseViewMaskForSyncing ());
388+ setUseViewMaskForChangeLog (useViewMask .isUseViewMaskForChangeLog ());
389+
390+ }
391+
346392 this .clientOwner = Util .fixEmptyAndTrim (clientOwner );
347393
348394 if (p4SysRoot != null ) {
@@ -464,6 +510,7 @@ protected Depot getDepot(Launcher launcher, FilePath workspace, AbstractProject
464510 return depot ;
465511 }
466512
513+
467514 /**
468515 * Override of SCM.buildEnvVars() in order to setup the last change we have
469516 * sync'd to as a Hudson
@@ -1809,45 +1856,14 @@ public String getDisplayName() {
18091856
18101857 @ Override
18111858 public SCM newInstance (StaplerRequest req , JSONObject formData ) throws FormException {
1812- PerforceSCM newInstance = (PerforceSCM )super .newInstance (req , formData );
1813- String depotType = req .getParameter ("p4.depotType" );
1814- boolean useStreamDepot = depotType .equals ("stream" );
1815- boolean useClientSpec = depotType .equals ("file" );
1816- newInstance .setUseStreamDepot (useStreamDepot );
1817- if (useStreamDepot ) {
1818- newInstance .setP4Stream (req .getParameter ("p4Stream" ));
1819- }
1820- else {
1821- newInstance .setUseClientSpec (useClientSpec );
1822- if (useClientSpec ) {
1823- newInstance .setClientSpec (req .getParameter ("clientSpec" ));
1824- }
1825- else {
1826- newInstance .setProjectPath (req .getParameter ("projectPath" ));
1827- }
1828- }
1829- newInstance .setUseViewMask (req .getParameter ("p4.useViewMask" ) != null );
1830- newInstance .setViewMask (Util .fixEmptyAndTrim (req .getParameter ("p4.viewMask" )));
1831- newInstance .setUseViewMaskForPolling (req .getParameter ("p4.useViewMaskForPolling" ) != null );
1832- newInstance .setUseViewMaskForSyncing (req .getParameter ("p4.useViewMaskForSyncing" ) != null );
1833- newInstance .setUseViewMaskForChangeLog (req .getParameter ("p4.useViewMaskForChangeLog" ) != null );
1834-
1835- String cleanType = req .getParameter ("p4.cleanType" );
1836- boolean useWipe = false ;
1837- boolean useQuickClean = false ;
1838- if (cleanType != null && req .getParameter ("p4.cleanWorkspace" ) != null ){
1839- useWipe = cleanType .equals ("wipe" );
1840- useQuickClean = cleanType .equals ("quick" );
1841- }
1842- newInstance .setWipeBeforeBuild (useWipe );
1843- newInstance .setQuickCleanBeforeBuild (useQuickClean );
1844-
1845- String wipeRepo = req .getParameter ("p4.wipeRepoBeforeBuild" );
1846- newInstance .setWipeRepoBeforeBuild (wipeRepo != null );
1847-
1848- newInstance .setRestoreChangedDeletedFiles (req .getParameter ("p4.restoreChangedDeletedFiles" ) != null );
1849-
1850- return newInstance ;
1859+ return (PerforceSCM )super .newInstance (req , formData );
1860+ }
1861+
1862+ /**Generates a random key for p4.config.instanceID*/
1863+ private static final AtomicLong P4_INSTANCE_COUNTER = new AtomicLong ();
1864+ public String generateP4InstanceID () {
1865+ // There's no problem even if the counter reaches overflow
1866+ return Long .toString (P4_INSTANCE_COUNTER .incrementAndGet ());
18511867 }
18521868
18531869 /**
0 commit comments