Index: /tags/ipp-20100610/ippTools/share/pubtool_definerun.sql
===================================================================
--- /tags/ipp-20100610/ippTools/share/pubtool_definerun.sql	(revision 28373)
+++ /tags/ipp-20100610/ippTools/share/pubtool_definerun.sql	(revision 28374)
@@ -1,4 +1,4 @@
 -- Get runs to publish
-SELECT
+SELECT DISTINCT
     client_id,
     stage_id,
@@ -6,14 +6,20 @@
 FROM (
     -- Get diffs to publish
-    SELECT
+    SELECT DISTINCT
         client_id,
         diff_id AS stage_id,
-        label AS src_label
+        diffRun.label AS src_label
     FROM publishClient
     JOIN diffRun
+    JOIN diffInputSkyfile USING(diff_id)
+    JOIN warpRun ON warpRun.warp_id = diffInputSkyfile.warp1 -- Only JOINing input, not reference!
+    JOIN fakeRun USING(fake_id)
+    JOIN camRun USING(cam_id)
+    JOIN chipRun USING(chip_id)
+    JOIN rawExp USING(exp_id)
     WHERE publishClient.stage = 'diff'
         AND publishClient.active = 1
-        AND diffRun.state = 'full'
-        AND (diffRun.magicked > 0 OR diffRun.diff_mode = 4 OR publishClient.magicked = 0)
+        AND diffRun.state IN ('full', 'cleaned', 'goto_cleaned')
+        AND (diffRun.magicked != 0 OR diffRun.diff_mode = 4 OR publishClient.magicked = 0)
     -- WHERE hook %s
     UNION
@@ -22,14 +28,15 @@
         client_id,
         cam_id AS stage_id,
-        label AS src_label
+        camRun.label AS src_label
     FROM publishClient
     JOIN camRun
+    JOIN chipRun USING(chip_id)
+    JOIN rawExp USING(exp_id)
     WHERE publishClient.stage = 'camera'
         AND publishClient.active = 1
-        AND camRun.state = 'full'
-        AND (camRun.magicked > 0 OR publishClient.magicked = 0)
+        AND camRun.state IN ('full', 'cleaned', 'goto_cleaned')
+        AND (camRun.magicked != 0 OR publishClient.magicked = 0)
     -- WHERE hook %s
     ) AS publishToDo
 -- Only get stuff that hasn't been published
 LEFT JOIN publishRun USING(client_id, stage_id)
-WHERE publishRun.client_id IS NULL
Index: /tags/ipp-20100610/ippTools/share/pubtool_pending.sql
===================================================================
--- /tags/ipp-20100610/ippTools/share/pubtool_pending.sql	(revision 28373)
+++ /tags/ipp-20100610/ippTools/share/pubtool_pending.sql	(revision 28374)
@@ -26,6 +26,6 @@
         AND publishClient.active = 1
         AND publishRun.state = 'new'
-        AND diffRun.state = 'full'
-        AND (diffRun.magicked > 0 OR diffRun.diff_mode = 4 OR publishClient.magicked = 0)
+        AND diffRun.state IN ('full', 'cleaned', 'goto_cleaned')
+        AND (diffRun.magicked != 0 OR diffRun.diff_mode = 4 OR publishClient.magicked = 0)
         -- WHERE hook %s
     UNION
@@ -47,6 +47,6 @@
         AND publishClient.active = 1
         AND publishRun.state ='new'
-        AND camRun.state = 'full'
-        AND (camRun.magicked > 0 OR publishClient.magicked = 0)
+        AND camRun.state IN ('full', 'cleaned', 'goto_cleaned')
+        AND (camRun.magicked != 0 OR publishClient.magicked = 0)
         -- WHERE hook %s
 ) AS publishToDo
Index: /tags/ipp-20100610/ippTools/src/pubtool.c
===================================================================
--- /tags/ipp-20100610/ippTools/src/pubtool.c	(revision 28373)
+++ /tags/ipp-20100610/ippTools/src/pubtool.c	(revision 28374)
@@ -151,37 +151,78 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    psMetadata *where = psMetadataAlloc(); // WHERE conditions
+    psMetadata *diffWhere = psMetadataAlloc(); // WHERE conditions for diffs
+    psMetadata *camWhere = psMetadataAlloc(); // WHERE conditions for cams
 
     // required
 
     // optional
-    PXOPT_COPY_S64(config->args, where, "-client_id", "client_id", "==");
-    pxAddLabelSearchArgs(config, where, "-label", "label", "=="); // define using newExp label
+    PXOPT_COPY_S64(config->args, diffWhere, "-client_id", "client_id", "==");
+    pxAddLabelSearchArgs(config, diffWhere, "-label", "diffRun.label", "==");
+    pxAddLabelSearchArgs(config, diffWhere, "-data_group", "diffRun.data_group", "LIKE");
+    PXOPT_COPY_TIME(config->args, diffWhere, "-dateobs_begin", "rawExp.dateobs", ">=");
+    PXOPT_COPY_TIME(config->args, diffWhere, "-dateobs_end", "rawExp.dateobs", "<=");
+    PXOPT_COPY_STR(config->args, diffWhere, "-filter", "rawExp.filter", "LIKE");
+    PXOPT_COPY_STR(config->args, diffWhere, "-obs_mode", "rawExp.obs_mode", "LIKE");
+
+    PXOPT_COPY_S64(config->args, camWhere, "-client_id", "client_id", "==");
+    pxAddLabelSearchArgs(config, camWhere, "-label", "camRun.label", "==");
+    pxAddLabelSearchArgs(config, camWhere, "-data_group", "camRun.data_group", "LIKE");
+    PXOPT_COPY_TIME(config->args, camWhere, "-dateobs_begin", "rawExp.dateobs", ">=");
+    PXOPT_COPY_TIME(config->args, camWhere, "-dateobs_end", "rawExp.dateobs", "<=");
+    PXOPT_COPY_STR(config->args, camWhere, "-filter", "rawExp.filter", "LIKE");
+    PXOPT_COPY_STR(config->args, camWhere, "-obs_mode", "rawExp.obs_mode", "LIKE");
+
+    PXOPT_LOOKUP_STR(set_label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_BOOL(rerun, config->args, "-rerun", false);
+    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = pxDataGet("pubtool_definerun.sql"); // Query to run
     if (!query) {
         psError(PXTOOLS_ERR_SYS, false, "Failed to retreive SQL statement");
-        psFree(where);
-        return false;
+        psFree(diffWhere);
+        psFree(camWhere);
+        return false;
+    }
+
+    if (!rerun) {
+        psStringAppend(&query, "\nWHERE publishRun.client_id IS NULL");
+    }
+
+    if (limit) {
+        psString limitString = psDBGenerateLimitSQL(limit);
+        psStringAppend(&query, "\n%s", limitString);
+        psFree(limitString);
     }
 
     if (!psDBTransaction(config->dbh)) {
         psError(PS_ERR_UNKNOWN, false, "Database error");
-        psFree(where);
-        return false;
-    }
-
-    psString whereClause = psStringCopy(""); // Additional constraints to add to query
-    if (psListLength(where->list)) {
-        psString clause = psDBGenerateWhereConditionSQL(where, NULL);
-        psStringAppend(&whereClause, "\n AND %s", clause);
+        psFree(diffWhere);
+        psFree(camWhere);
+        return false;
+    }
+
+    psString whereDiff = psStringCopy(""); // Additional constraints to add to query
+    if (psListLength(diffWhere->list)) {
+        psString clause = psDBGenerateWhereConditionSQL(diffWhere, NULL);
+        psStringAppend(&whereDiff, "\n AND %s", clause);
         psFree(clause);
     }
-    psFree(where);
-
-    if (!p_psDBRunQueryF(config->dbh, query, whereClause, whereClause)) {
+    psFree(diffWhere);
+
+    psString whereCam = psStringCopy(""); // Additional constraints to add to query
+    if (psListLength(camWhere->list)) {
+        psString clause = psDBGenerateWhereConditionSQL(camWhere, NULL);
+        psStringAppend(&whereCam, "\n AND %s", clause);
+        psFree(clause);
+    }
+    psFree(camWhere);
+
+    if (!p_psDBRunQueryF(config->dbh, query, whereDiff, whereCam)) {
         psError(PS_ERR_UNKNOWN, false, "Database error");
         psFree(query);
-        psFree(whereClause);
+        psFree(whereDiff);
+        psFree(whereCam);
         if (!psDBRollback(config->dbh)) {
             psError(PS_ERR_UNKNOWN, false, "Database error");
@@ -190,5 +231,6 @@
     }
     psFree(query);
-    psFree(whereClause);
+    psFree(whereDiff);
+    psFree(whereCam);
 
     psArray *output = p_psDBFetchResult(config->dbh); // Output of SELECT statement
@@ -206,11 +248,21 @@
     }
 
+    if (pretend) {
+        if (!ippdbPrintMetadatas(stdout, output, "publishRun", !simple)) {
+            psError(psErrorCodeLast(), false, "Failed to print array");
+            psFree(output);
+            return false;
+        }
+        psFree(output);
+        return true;
+    }
+
     for (int i = 0; i < output->n; i++) {
         psMetadata *row = output->data[i]; // Row of interest
         psS64 client = psMetadataLookupS64(NULL, row, "client_id"); // Client identifier
         psS64 stage = psMetadataLookupS64(NULL, row, "stage_id");   // Stage identifier
-        char *label = psMetadataLookupStr(NULL, row, "src_label");   // label from correct source
-
-        if (!publishRunInsert(config->dbh, 0, client, stage, label, "new")) {
+        const char *label = psMetadataLookupStr(NULL, row, "src_label");   // label from correct source
+
+        if (!publishRunInsert(config->dbh, 0, client, stage, set_label ? set_label : label, "new")) {
             psError(PS_ERR_UNKNOWN, false, "Unable to add fileset");
             psFree(output);
@@ -241,5 +293,5 @@
     PXOPT_COPY_STR(config->args, where, "-stage", "publishClient.stage", "==");
     PXOPT_COPY_STR(config->args, where, "-comment", "publishClient.comment", "LIKE");
-    PXOPT_COPY_STR(config->args, where, "-label", "publishRun.label", "==");
+    pxAddLabelSearchArgs(config, where, "-label", "publishRun.label", "==");
 
     // optional
Index: /tags/ipp-20100610/ippTools/src/pubtoolConfig.c
===================================================================
--- /tags/ipp-20100610/ippTools/src/pubtoolConfig.c	(revision 28373)
+++ /tags/ipp-20100610/ippTools/src/pubtoolConfig.c	(revision 28374)
@@ -62,6 +62,16 @@
     // -definerun
     psMetadata *definerunArgs = psMetadataAlloc();
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_label", 0, "set label", NULL);
     psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-client_id", 0, "search by client_id", 0);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK, "set and search by label", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-data_group", PS_META_DUPLICATE_OK, "search by data_group", NULL);
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-dateobs_begin", 0, "search for exposures by time (>=)", NULL);
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-dateobs_end", 0, "search for exposures by time (<=)", NULL);
+    psMetadataAddStr(definerunArgs,  PS_LIST_TAIL, "-filter", 0, "search for filter", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-obs_mode", 0, "search by observation mode", NULL);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-rerun", 0, "Re-run publish?", false);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-pretend", 0, "Pretend to define?", false);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0, "use simple output format?", false);
+    psMetadataAddU64(definerunArgs, PS_LIST_TAIL, "-limit",  0, "limit result set", 0);
 
     // -pending
@@ -70,5 +80,5 @@
     psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-stage", 0, "search on source", NULL);
     psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-comment", 0, "search on comment (LIKE)", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-label", 0, "search on label", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK, "search on label", NULL);
     psMetadataAddBool(pendingArgs, PS_LIST_TAIL, "-simple",  0, "use simple output format?", false);
     psMetadataAddU64(pendingArgs, PS_LIST_TAIL, "-limit",  0, "limit result set", 0);
