Index: trunk/ippTools/share/Makefile.am
===================================================================
--- trunk/ippTools/share/Makefile.am	(revision 29553)
+++ trunk/ippTools/share/Makefile.am	(revision 29561)
@@ -238,4 +238,6 @@
 	magictool_exposure.sql \
 	magicdstool_clearstatefaults.sql \
+	magicdstool_change_file_data_state.sql \
+	magicdstool_change_run_state.sql \
 	magicdstool_completed_runs.sql \
 	magicdstool_completedrevert.sql \
@@ -252,4 +254,6 @@
 	magicdstool_getskycells.sql \
 	magicdstool_revertdestreakedfile.sql \
+	magicdstool_revertupdated.sql \
+	magicdstool_setfiletoupdate.sql \
 	magicdstool_tocleanup.sql \
 	magicdstool_todestreak_camera.sql \
Index: trunk/ippTools/share/chiptool_setimfiletoupdate.sql
===================================================================
--- trunk/ippTools/share/chiptool_setimfiletoupdate.sql	(revision 29553)
+++ trunk/ippTools/share/chiptool_setimfiletoupdate.sql	(revision 29561)
@@ -11,6 +11,7 @@
     AND (chipRun.state = 'cleaned' OR chipRun.state = 'update')
     AND (chipProcessedImfile.data_state = 'cleaned')
-    -- don't queue update if the associated magicDSFile exists
+    -- don't queue update if the associated magicDSFile exists and isn't cleaned
     AND (chipRun.magicked = 0 
-      OR (magicDSRun.state = 'cleaned' OR magicDSRun.state = 'new')
-            AND magicDSFile.component IS NULL)
+      OR ((magicDSRun.state = 'cleaned' OR magicDSRun.state = 'update')
+            AND (magicDSFile.data_state = 'cleaned`' OR magicDSFile.data_state = 'update'))
+    )
Index: trunk/ippTools/share/magicdstool_change_file_data_state.sql
===================================================================
--- trunk/ippTools/share/magicdstool_change_file_data_state.sql	(revision 29561)
+++ trunk/ippTools/share/magicdstool_change_file_data_state.sql	(revision 29561)
@@ -0,0 +1,8 @@
+-- handle changes in data_state.
+UPDATE magicDSFile
+    JOIN magicDSRun USING(magic_ds_id)
+SET 
+    magicDSFile.data_state = '%s'
+WHERE
+    magic_ds_id = %lld
+    AND component = '%s'
Index: trunk/ippTools/share/magicdstool_change_run_state.sql
===================================================================
--- trunk/ippTools/share/magicdstool_change_run_state.sql	(revision 29561)
+++ trunk/ippTools/share/magicdstool_change_run_state.sql	(revision 29561)
@@ -0,0 +1,15 @@
+-- change state of magicDSRun from goto_cleaned to cleaned or goto_purged to purged
+-- when all of the constituant imfiles are in the right state
+-- arguments are new state (cleaned or purged) chip_id and new state again for 
+-- the chipProcessedImfile sub query
+UPDATE magicDSRun
+    SET magicDSRun.state = '%s'
+WHERE
+    magicDSRun.magic_ds_id = %lld
+    AND (SELECT
+        COUNT(magic_ds_id)
+        FROM magicDSFile
+        WHERE
+            magicDSFile.magic_ds_id = magicDSRun.magic_ds_id
+            AND data_state != '%s'
+        ) = 0
Index: trunk/ippTools/share/magicdstool_revertupdated.sql
===================================================================
--- trunk/ippTools/share/magicdstool_revertupdated.sql	(revision 29561)
+++ trunk/ippTools/share/magicdstool_revertupdated.sql	(revision 29561)
@@ -0,0 +1,7 @@
+UPDATE magicDSRun 
+    JOIN magicDSFile using(magic_ds_id)
+SET magicDSFile.fault = 0
+WHERE
+    magicDSRun.state = 'update'
+    AND magicDSFile.data_state = 'update'
+    AND magicDSFile.fault != 0
Index: trunk/ippTools/share/magicdstool_setfiletoupdate.sql
===================================================================
--- trunk/ippTools/share/magicdstool_setfiletoupdate.sql	(revision 29561)
+++ trunk/ippTools/share/magicdstool_setfiletoupdate.sql	(revision 29561)
@@ -0,0 +1,9 @@
+UPDATE magicDSRun
+    JOIN magicDSFile USING(magic_ds_id)
+SET magicDSRun.state = 'update', 
+    magicDSFile.data_state = 'update',
+    magicDSFile.fault = 0
+    -- set hook %s
+WHERE magic_ds_id = %lld
+    AND (magicDSRun.state = 'cleaned' OR magicDSRun.state = 'update')
+    AND (magicDSFile.data_state = 'cleaned')
Index: trunk/ippTools/share/magicdstool_todestreak_camera.sql
===================================================================
--- trunk/ippTools/share/magicdstool_todestreak_camera.sql	(revision 29553)
+++ trunk/ippTools/share/magicdstool_todestreak_camera.sql	(revision 29561)
@@ -2,4 +2,5 @@
     magicDSRun.magic_ds_id,
     magicDSRun.magic_id,
+    magicDSRun.state,
     chipRun.exp_id,
     camRun.magicked,
Index: trunk/ippTools/share/magicdstool_todestreak_chip.sql
===================================================================
--- trunk/ippTools/share/magicdstool_todestreak_chip.sql	(revision 29553)
+++ trunk/ippTools/share/magicdstool_todestreak_chip.sql	(revision 29561)
@@ -2,4 +2,5 @@
     magicDSRun.magic_ds_id,
     magicDSRun.magic_id,
+    magicDSRun.state,
     chipRun.exp_id,
     chipRun.magicked,
@@ -37,9 +38,10 @@
     ON magicDSRun.label = Label.label
 WHERE
-    magicDSRun.state = 'new'
+    ((magicDSRun.state = 'new' AND magicDSFile.component IS NULL)
+     OR (magicDSRun.state = 'update' AND magicDSFile.data_state = 'update'
+         AND magicDSFile.fault = 0))
     AND magicDSRun.stage = 'chip'
     AND (chipRun.state = 'full' OR (chipRun.state = 'update' and chipProcessedImfile.data_state = 'full'))
     AND chipProcessedImfile.fault = 0
     AND chipProcessedImfile.quality = 0
-    AND magicDSFile.component IS NULL
     AND (Label.active OR Label.active IS NULL)
Index: trunk/ippTools/share/magicdstool_todestreak_diff.sql
===================================================================
--- trunk/ippTools/share/magicdstool_todestreak_diff.sql	(revision 29553)
+++ trunk/ippTools/share/magicdstool_todestreak_diff.sql	(revision 29561)
@@ -3,4 +3,5 @@
     magicDSRun.magic_ds_id,
     magicRun.magic_id,
+    magicDSRun.state,
     magicRun.exp_id,
     magicDSRun.label,
@@ -50,4 +51,5 @@
     magicDSRun.magic_ds_id,
     magicRun.magic_id,
+    magicDSRun.state,
     magicRun.exp_id,
     magicDSRun.label,
Index: trunk/ippTools/share/magicdstool_todestreak_raw.sql
===================================================================
--- trunk/ippTools/share/magicdstool_todestreak_raw.sql	(revision 29553)
+++ trunk/ippTools/share/magicdstool_todestreak_raw.sql	(revision 29561)
@@ -2,4 +2,5 @@
     magicDSRun.magic_ds_id,
     magicRun.magic_id,
+    magicDSRun.state,
     magicRun.exp_id,
     magicDSRun.label,
Index: trunk/ippTools/share/magicdstool_todestreak_warp.sql
===================================================================
--- trunk/ippTools/share/magicdstool_todestreak_warp.sql	(revision 29553)
+++ trunk/ippTools/share/magicdstool_todestreak_warp.sql	(revision 29561)
@@ -2,4 +2,5 @@
     magicDSRun.magic_ds_id,
     magicRun.magic_id,
+    magicDSRun.state,
     magicRun.exp_id,
     magicDSRun.label,
Index: trunk/ippTools/share/magicdstool_torevert_chip.sql
===================================================================
--- trunk/ippTools/share/magicdstool_torevert_chip.sql	(revision 29553)
+++ trunk/ippTools/share/magicdstool_torevert_chip.sql	(revision 29561)
@@ -22,5 +22,7 @@
     JOIN rawExp ON chipRun.exp_id = rawExp.exp_id
 WHERE magicDSRun.stage = 'chip'
-    AND ((magicDSRun.state = 'new' AND magicDSFile.fault > 0)
+    AND (((magicDSRun.state = 'new' OR (magicDSRun.state = 'update'))
+            AND magicDSFile.fault > 0)
+            -- why don't we require a fault for these states?
          OR ((magicDSRun.state = 'goto_censored' OR magicDSRun.state = 'goto_restored')
               AND ((backup_path_base IS NOT NULL) OR (recovery_path_base IS NOT NULL))
