src/hg/encode/encodePatchTdb/encodePatchTdb.c 1.4

1.4 2010/01/05 05:31:25 kent
Implementing mode=replace
Index: src/hg/encode/encodePatchTdb/encodePatchTdb.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/encode/encodePatchTdb/encodePatchTdb.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -b -B -U 4 -r1.3 -r1.4
--- src/hg/encode/encodePatchTdb/encodePatchTdb.c	5 Jan 2010 04:59:58 -0000	1.3
+++ src/hg/encode/encodePatchTdb/encodePatchTdb.c	5 Jan 2010 05:31:25 -0000	1.4
@@ -467,8 +467,28 @@
 sub->next = recordBefore->next;
 recordBefore->next = sub;
 }
 
+void substituteIntoView(struct raRecord *sub, struct raRecord *oldSub, struct raRecord *view)
+/* Substitute sub for oldSub as a child of view.  Assumes oldSub is in same file and after view. */
+{
+uglyf("substituteIntoView sub=%s oldSub=%s %p view=%s\n", sub->key, oldSub->key, oldSub, view->key);
+struct raRecord *recordBefore = NULL;
+struct raRecord *r, *prev = NULL;
+for (r = view; r != NULL; r = r->next)
+    {
+    if (r->next == oldSub)
+	{
+        recordBefore = prev;
+	break;
+	}
+    prev = r;
+    }
+assert(recordBefore != NULL);
+sub->next = oldSub->next;
+recordBefore->next = sub;
+}
+
 char *firstTagInText(char *text)
 /* Return the location of tag in text - skipping blank and comment lines and white-space */
 {
 char *s = text;
@@ -560,24 +580,25 @@
     char *parentRelease = raRecordFindTagVal(parent, "release");
     char *subRelease = raRecordFindTagVal(sub, "release");
     char *release = nonNullRelease(parentRelease, subRelease);
     struct raRecord *view = findRecordCompatibleWithRelease(parent->file, release, viewTrackName);
+    validateParentViewSub(parent, view, sub);
+    substituteParentText(parent, view, sub);
+    indentTdbText(sub, 4);
     struct raRecord *oldSub = findRecordCompatibleWithRelease(parent->file, release, sub->key);
-    if (oldSub)
-	{
         if (glReplace)
 	    {
-	    uglyAbort("Unfortunately really don't know how to update or replace");
+	if (oldSub == NULL)
+	    recordAbort(sub, "%s doesn't exist but using mode=replace\n", sub->key);
+	substituteIntoView(sub, oldSub, view);
 	    }
 	else
-	    recordAbort(sub, "record %s already exists - use mode=replace",
-	    	sub->key);
-	}
-    validateParentViewSub(parent, view, sub);
-    substituteParentText(parent, view, sub);
-    indentTdbText(sub, 4);
+        {
+	if (oldSub != NULL)
+	    recordAbort(sub, "record %s already exists - use mode=replace", sub->key);
     patchIntoEndOfView(sub, view);
     }
+    }
 else
     {
     recordAbort(parent, "Can only handle parents with views for now.");
     }