Index: /trunk/Ohana/src/dvomerge/Makefile
===================================================================
--- /trunk/Ohana/src/dvomerge/Makefile	(revision 39300)
+++ /trunk/Ohana/src/dvomerge/Makefile	(revision 39301)
@@ -25,8 +25,5 @@
 dvoutils        : $(BIN)/dvoutils.$(ARCH)
 
-# all: dvomerge dvomerge_client dvoconvert dvosecfilt dvosecfilt_client dvorepair dvoverify dvoverify_client dvoutils
-all: dvoconvert dvosecfilt dvosecfilt_client dvorepair dvoverify dvoverify_client dvoutils
-
-#  $(SRC)/dvomergeContinue.$(ARCH).o
+all: dvomerge dvomerge_client dvoconvert dvosecfilt dvosecfilt_client dvorepair dvoverify dvoverify_client dvoutils
 
 DVOMERGE = \
@@ -37,5 +34,4 @@
 $(SRC)/dvomergeUpdate_threaded.$(ARCH).o \
 $(SRC)/dvomergeHistory.$(ARCH).o \
-$(SRC)/dvomergeFromList.$(ARCH).o \
 $(SRC)/dvomergeImageIDs.$(ARCH).o \
 $(SRC)/dvo_image_merge_dbs.$(ARCH).o \
@@ -47,4 +43,5 @@
 $(SRC)/args.$(ARCH).o \
 $(SRC)/psps_ids.$(ARCH).o \
+$(SRC)/cptlist.$(ARCH).o \
 $(SRC)/SkyTablePopulatedRange.$(ARCH).o \
 $(SRC)/LoadCatalog.$(ARCH).o \
@@ -72,4 +69,5 @@
 $(SRC)/args.$(ARCH).o \
 $(SRC)/psps_ids.$(ARCH).o \
+$(SRC)/cptlist.$(ARCH).o \
 $(SRC)/SkyTablePopulatedRange.$(ARCH).o \
 $(SRC)/LoadCatalog.$(ARCH).o \
@@ -91,4 +89,5 @@
 $(SRC)/help.$(ARCH).o \
 $(SRC)/args.$(ARCH).o \
+$(SRC)/cptlist.$(ARCH).o \
 $(SRC)/SkyTablePopulatedRange.$(ARCH).o \
 $(SRC)/LoadCatalog.$(ARCH).o \
@@ -105,4 +104,5 @@
 $(SRC)/Shutdown.$(ARCH).o \
 $(SRC)/help.$(ARCH).o \
+$(SRC)/cptlist.$(ARCH).o \
 $(SRC)/args.$(ARCH).o
 
@@ -117,4 +117,5 @@
 $(SRC)/Shutdown.$(ARCH).o \
 $(SRC)/help.$(ARCH).o \
+$(SRC)/cptlist.$(ARCH).o \
 $(SRC)/args.$(ARCH).o
 
Index: /trunk/Ohana/src/dvomerge/include/dvomerge.h
===================================================================
--- /trunk/Ohana/src/dvomerge/include/dvomerge.h	(revision 39300)
+++ /trunk/Ohana/src/dvomerge/include/dvomerge.h	(revision 39301)
@@ -45,5 +45,8 @@
 char  *UPDATE_CATFORMAT;
 char  *UPDATE_CATCOMPRESS;
-char  *RESTRICT_CPT;
+
+char  *CPTLIST_FILENAME;
+char **CPTLIST;
+int   NCPTLIST;
 
 int    MATCH_BY_EXTERN_ID;
@@ -208,5 +211,5 @@
 int        dvomergeFromList       PROTO((int argc, char **argv));
 int 	   dvomergeUpdate_threaded PROTO((int argc, char **argv));
-int        dvomergeUpdate_catalogs PROTO((char *input, char *output, SkyTable *outsky, SkyList *inlist, int NsecfiltInput, int NsecfiltOutput, IDmapType *IDmap, int *secfiltMap));
+int        dvomergeUpdate_catalogs PROTO((char *input, char *output, SkyList *inlist, SkyTable *outsky, int NsecfiltInput, int NsecfiltOutput, IDmapType *IDmap, int *secfiltMap));
 
 int 	   dvo_image_match_dbs_by_time_and_photcode PROTO((IDmapType *IDmap, FITS_DB *tgt, FITS_DB *src));
@@ -262,2 +265,3 @@
 int dvorepairFixStackIDs (int argc, char **argv);
 
+char **load_cptlist (char *filename, int *nlist);
Index: /trunk/Ohana/src/dvomerge/src/args.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/args.c	(revision 39300)
+++ /trunk/Ohana/src/dvomerge/src/args.c	(revision 39301)
@@ -77,8 +77,11 @@
   }
 
-  RESTRICT_CPT = NULL;
+  NCPTLIST = 0;
+  CPTLIST = NULL;
+  CPTLIST_FILENAME = NULL;
   if ((N = get_argument (*argc, argv, "-restrict-cpt"))) {
     remove_argument (N, argc, argv);
-    RESTRICT_CPT = strcreate (argv[N]);
+    CPTLIST_FILENAME = strcreate (argv[N]);
+    CPTLIST = load_cptlist (CPTLIST_FILENAME, &NCPTLIST);
     remove_argument (N, argc, argv);
   }
@@ -122,4 +125,5 @@
     NTHREADS = MAX(0, atoi(argv[N]));
     remove_argument (N, argc, argv);
+    myAbort ("threads deprecated for now");
   }
 
@@ -266,8 +270,9 @@
   }
 
-  RESTRICT_CPT = NULL;
+  NCPTLIST = 0;
+  CPTLIST = NULL;
   if ((N = get_argument (*argc, argv, "-restrict-cpt"))) {
     remove_argument (N, argc, argv);
-    RESTRICT_CPT = strcreate (argv[N]);
+    CPTLIST = load_cptlist (argv[N], &NCPTLIST);
     remove_argument (N, argc, argv);
   }
@@ -311,4 +316,5 @@
     NTHREADS = MAX(0, atoi(argv[N]));
     remove_argument (N, argc, argv);
+    myAbort ("threads deprecated for now");
   }
 
Index: /trunk/Ohana/src/dvomerge/src/cptlist.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/cptlist.c	(revision 39301)
+++ /trunk/Ohana/src/dvomerge/src/cptlist.c	(revision 39301)
@@ -0,0 +1,34 @@
+# include "dvomerge.h"
+
+char **load_cptlist (char *filename, int *nlist) {
+
+  int NLIST = 100;
+  
+  char **list = NULL;
+  ALLOCATE(list, char *, NLIST);
+
+  int i;
+  for (i = 0; i < NLIST; i++) {
+    ALLOCATE(list[i], char, DVO_MAX_PATH);
+    memset(list[i], 0, DVO_MAX_PATH);
+  }
+  
+  FILE *listfile = fopen(filename, "r");
+  myAssert(listfile, "error opening list");
+
+  int j;
+  for (i = 0; fscanf (listfile, "%s", list[i]) != EOF; i++) {
+    if (i == NLIST - 1) {
+      NLIST += 100;
+      REALLOCATE(list, char *, NLIST);
+      for (j = i + 1; j < NLIST; j++) {
+	ALLOCATE(list[j], char, DVO_MAX_PATH);
+	memset(list[j], 0, DVO_MAX_PATH);
+      }
+    }
+  }      
+  *nlist = i;
+  fclose(listfile);
+
+  return list;
+}
Index: /trunk/Ohana/src/dvomerge/src/dvomerge.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/dvomerge.c	(revision 39300)
+++ /trunk/Ohana/src/dvomerge/src/dvomerge.c	(revision 39301)
@@ -11,26 +11,16 @@
 
   if (argc == 6) {
-    if (!strcasecmp (argv[2], "and")) {
-      if (VERIFY) {
-	fprintf (stderr, "WARNING / ERROR : dvomerge (input1) and (input2) into (output) : VERIFY mode not implemented\n");
-	exit (3);
-      }
-      if (IMAGES_ONLY) {
-	fprintf (stderr, "ERROR : dvomerge (input1) and (input2) into (output) : not compatible with '-images-only'\n");
-	exit (5);
-      }
-      dvomergeCreate (argc, argv);
-    } else {
-      if (VERIFY) {
-	fprintf (stderr, "WARNING / ERROR : dvomerge (input) into (output) from (list) : VERIFY mode not implemented\n");
-	exit (3);
-      }
-      if (IMAGES_ONLY) {
-	fprintf (stderr, "ERROR : dvomerge (input) input (output) from (list) : not compatible with '-images-only'\n");
-	exit (5);
-      }
-      dvomergeFromList (argc, argv);
+    if (strcasecmp (argv[2], "and")) dvomerge_usage();
+    if (VERIFY) {
+      fprintf (stderr, "WARNING / ERROR : dvomerge (input1) and (input2) into (output) : VERIFY mode not implemented\n");
+      exit (3);
     }
+    if (IMAGES_ONLY) {
+      fprintf (stderr, "ERROR : dvomerge (input1) and (input2) into (output) : not compatible with '-images-only'\n");
+      exit (5);
+    }
+    dvomergeCreate (argc, argv);
   }
+
   if ((argc == 4) || (argc == 5)) {
     if (NTHREADS) {
@@ -40,4 +30,5 @@
     }
   }
+
   dvomerge_args_free ();
   ohana_memcheck (TRUE);
@@ -53,5 +44,4 @@
    we also have varients on Update:
    Continue  : dvomerge (in) into (out) continue -- merge only unmerged tables into the existing db
-   From List : dvomerge (in) into (out) from (list) -- merge only specified tables into the existing db
 
    neither of the 2 above modes update the image table
Index: /trunk/Ohana/src/dvomerge/src/dvomergeFromList.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/dvomergeFromList.c	(revision 39300)
+++ /trunk/Ohana/src/dvomerge/src/dvomergeFromList.c	(revision 39301)
@@ -1,5 +1,3 @@
 # include "dvomerge.h"
-
-char **load_cptlist (char *filename, int *nlist);
 
 // merge from list implies 'continue' (ie, we must have already done a partial merge)
@@ -25,4 +23,5 @@
   listname = argv[5];
 
+  int Ncptlist;
   char *cptlist = load_cptlist (listname, &Ncptlist);
 
@@ -89,9 +88,9 @@
 
   // loop over the populated input regions
-  for (i = 0; i < Nlist; i++) {
-    if (VERBOSE) fprintf (stderr, "input: %s\n", list[i]);
+  for (i = 0; i < Ncptlist; i++) {
+    if (VERBOSE) fprintf (stderr, "input: %s\n", cptlist[i]);
 
-    sprintf (inputfile,  "%s/%s", input,  list[i]);
-    sprintf (outputfile, "%s/%s", output, list[i]);
+    sprintf (inputfile,  "%s/%s", input,  cptlist[i]);
+    sprintf (outputfile, "%s/%s", output, cptlist[i]);
 
     OutputStatus *outstat = OutputStatusInit (1);
@@ -161,33 +160,2 @@
 }
 
-char **load_cptlist (char *filename, int *nlist) {
-
-  int NLIST = 100;
-  
-  char **list = NULL;
-  ALLOCATE(list, char *, NLIST);
-
-  int i;
-  for (i = 0; i < NLIST; i++) {
-    ALLOCATE(list[i], char, DVO_MAX_PATH);
-    memset(list[i], 0, DVO_MAX_PATH);
-  }
-  
-  FILE *listfile = fopen(filename, "r");
-  myAssert(listfile, "error opening list");
-
-  for (i = 0; fscanf (listfile, "%s", list[i]) != EOF; i++) {
-    if (i == NLIST - 1) {
-      NLIST += 100;
-      REALLOCATE(list, char *, NLIST);
-      for (j = i + 1; j < NLIST; j++) {
-	ALLOCATE(list[j], char, DVO_MAX_PATH);
-	memset(list[j], 0, DVO_MAX_PATH);
-      }
-    }
-  }      
-  *nlist = i;
-  fclose(listfile);
-
-  return list;
-}
Index: /trunk/Ohana/src/dvomerge/src/dvomergeUpdate.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/dvomergeUpdate.c	(revision 39300)
+++ /trunk/Ohana/src/dvomerge/src/dvomergeUpdate.c	(revision 39301)
@@ -96,9 +96,11 @@
   SkyTableSetFilenames (insky, input, "cpt");
 
-  // XXX apply this...generate the subset matching the user-selected region
+  // generate the subset matching the user-selected region
   inlist = SkyListByPatch (insky, -1, &UserPatch);
 
   // modify the list if we are restricting:
-  inlist = SkyListSubset (inlist, cptlist);
+  if (CPTLIST) {
+    inlist = SkyListMatchList (inlist, CPTLIST, NCPTLIST);
+  }
 
   // generate an output table populated at the desired depth
@@ -117,5 +119,5 @@
   SetPhotcodeTable(NULL);
 
-  int status = dvomergeUpdate_catalogs (input, output, outsky, inlist, NsecfiltInput, NsecfiltOutput, &IDmap, secfiltMap);
+  int status = dvomergeUpdate_catalogs (input, output, inlist, outsky, NsecfiltInput, NsecfiltOutput, &IDmap, secfiltMap);
 
   // save the output sky table copy
Index: /trunk/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c	(revision 39300)
+++ /trunk/Ohana/src/dvomerge/src/dvomergeUpdate_catalogs.c	(revision 39301)
@@ -12,5 +12,5 @@
 int dvomergeUpdate_parallel_group (HostTableGroup *group, char *absinput, char *absoutput);
 
-int dvomergeUpdate_catalogs (char *input, char *output, SkyTable *outsky, SkyList *inlist, int NsecfiltInput, int NsecfiltOutput, IDmapType *IDmap, int *secfiltMap) {
+int dvomergeUpdate_catalogs (char *input, char *output, SkyList *inlist, SkyTable *outsky, int NsecfiltInput, int NsecfiltOutput, IDmapType *IDmap, int *secfiltMap) {
 
   off_t i, j;
@@ -76,4 +76,11 @@
       outlist = SkyListByBounds (outsky, -1, inlist[0].regions[i][0].Rmin - dPos, inlist[0].regions[i][0].Rmax + dPos, inlist[0].regions[i][0].Dmin - dPos, inlist[0].regions[i][0].Dmax + dPos);
     }
+
+    if (CPTLIST) {
+      outlist = SkyListMatchList (outlist, CPTLIST, NCPTLIST);
+    }
+    
+    // XXX validate MATCHED_TABLES
+    myAssert (outlist->Nregions == inlist->Nregions, "oops");
 
     OutputStatus *outstat = OutputStatusInit (outlist->Nregions);
@@ -303,4 +310,5 @@
     if (UPDATE_CATFORMAT)    { strextend (&command, "-update-catformat %s", UPDATE_CATFORMAT); }
     if (UPDATE_CATCOMPRESS)  { strextend (&command, "-update-catcompress %s", UPDATE_CATCOMPRESS); }
+    if (CPTLIST_FILENAME)    { strextend (&command, "-restrict-cpt %s", CPTLIST_FILENAME); }
     if (REPAIR_BY_OBJID)     { strextend (&command, "-repair-by-objid"); }
 
Index: /trunk/Ohana/src/dvomerge/src/dvomerge_client.c
===================================================================
--- /trunk/Ohana/src/dvomerge/src/dvomerge_client.c	(revision 39300)
+++ /trunk/Ohana/src/dvomerge/src/dvomerge_client.c	(revision 39301)
@@ -75,4 +75,9 @@
   inlist = SkyListByPatch (insky, -1, &UserPatch);
 
+  // modify the list if we are restricting:
+  if (CPTLIST) {
+    inlist = SkyListMatchList (inlist, CPTLIST, NCPTLIST);
+  }
+
   // generate an output table populated at the desired depth
   outsky = SkyTableLoadOptimal (output, NULL, GSCFILE, TRUE, SKY_DEPTH, VERBOSE);
@@ -86,5 +91,5 @@
   if (REPLACE_TYCHO) replace_tycho_init();
 
-  dvomergeUpdate_catalogs (input, output, outsky, inlist, NsecfiltInput, NsecfiltOutput, IDmap, secfiltMap);
+  dvomergeUpdate_catalogs (input, output, inlist, outsky, NsecfiltInput, NsecfiltOutput, IDmap, secfiltMap);
 
   exit (0);
Index: /trunk/Ohana/src/libdvo/include/dvo.h
===================================================================
--- /trunk/Ohana/src/libdvo/include/dvo.h	(revision 39300)
+++ /trunk/Ohana/src/libdvo/include/dvo.h	(revision 39301)
@@ -1071,4 +1071,5 @@
 SkyTable  *SkyTableLoadOptimal 	   PROTO((char *catdir, char *SKYFILE, char *GSCFILE, int readwrite, int depth, int VERBOSE));
 int        SkyTableSetDepth    	   PROTO((SkyTable *sky, int depth));
+SkyList   *SkyListMatchList        PROTO((SkyList *inlist, char **cptlist, int Ncptlist));
 SkyList   *SkyRegionByIndex        PROTO((SkyTable *table, int index));
 SkyList   *SkyRegionByCPT          PROTO((SkyTable *table, char *filename));
Index: /trunk/Ohana/src/libdvo/src/skyregion_ops.c
===================================================================
--- /trunk/Ohana/src/libdvo/src/skyregion_ops.c	(revision 39300)
+++ /trunk/Ohana/src/libdvo/src/skyregion_ops.c	(revision 39301)
@@ -154,4 +154,46 @@
     }
   }
+  list[0].Nregions = N;
+  return (list);
+}
+
+/* find regions at all levels which match list of names */
+SkyList *SkyListMatchList (SkyList *inlist, char **cptlist, int Ncptlist) {
+
+  int i, j;
+  SkyList *list;
+  
+  int N = 0;
+  int NREGIONS = 10;
+  ALLOCATE (list, SkyList, 1);
+  ALLOCATE (list[0].regions, SkyRegion *, NREGIONS);
+  ALLOCATE (list[0].filename, char *, NREGIONS);
+  list[0].Nregions = N;
+  list[0].ownElements = FALSE; // this list is only holding a view to the elements
+  strcpy (list[0].hosts, inlist[0].hosts);
+
+  SkyRegion **regions = inlist[0].regions;
+
+  for (i = 0; i < inlist[0].Nregions; i++) {
+    int found = FALSE;
+    for (j = 0; !found && (j < Ncptlist); j++) {
+      int Nchar = strlen (cptlist[j]);
+      if (strncasecmp (regions[i][0].name, cptlist[j], Nchar)) continue;
+
+      list[0].regions[N] = regions[i];
+      list[0].filename[N] = inlist[0].filename[i];
+      N++;
+      if (N >= NREGIONS) {
+	NREGIONS += 10;
+	REALLOCATE (list[0].regions, SkyRegion *, NREGIONS);
+	REALLOCATE (list[0].filename, char *, NREGIONS);
+      }
+      found = TRUE;
+    }
+    // we do not care if one of the regions does not match.  do we care if any of the
+    // cptfile do not match?
+  }
+  SkyListFree (inlist);
+
   list[0].Nregions = N;
   return (list);
