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.");
}