[prev in list] [next in list] [prev in thread] [next in thread] 

List:       rpm-devel
Subject:    Re: [CVS] RPM: rpm/js/ rpmds-js.c rpmfi-js.c rpm/js/tscripts/ Fi.js
From:       Jeff Johnson <n3npq () mac ! com>
Date:       2009-04-27 20:32:17
Message-ID: BACB9047-78E9-4375-A359-5F82788908CE () mac ! com
[Download RAW message or body]

FYI: The RPM JS bindings (with unit tests) are largely as
complete as rpm-python for RDONLY spewage purposes. There
are other issues, specifically the bleeping notifier callback,
and what the IO class should look like (I increasingly loathe
the File class and its NSPR roots), that need to be solved
before it would make sense to attempt a JS installer equivalent
to, say, yum/smart/anaconda.

Here's the short list of known missing methods (h.sprintf()
and mi.pattern() are likely the most important, perhaps 20 mins
of work to add the methods). There's also a need to drill
in manifest constants, as well as a macro class capable of
doing add/del/expand, and that's likely gud enuf:

[jbj@fedora10 js]$ ./tjs
loading RPM classes.
undefined
undefined
undefined
undefined
NACK:  ack(mi.pattern(RPMTAG_NAME, 0, N))	caught 'TypeError:  
mi.pattern is not a function'
undefined
NACK:  ack(h.keys())	caught 'TypeError: h.keys is not a function'
NACK:  ack(h.unload(legacyHeader))	caught 'TypeError: h.unload is not  
a function'
NACK:  ack(h.setorigin(origin))	caught 'TypeError: h.setorigin is not  
a function'
NACK:  ack(h.getorigin())	caught 'TypeError: h.getorigin is not a  
function'
NACK:  ack(h.sprintf(qfmt))	caught 'TypeError: h.sprintf is not a  
function'
NACK:  ack(h.dsOfHeader())	caught 'TypeError: h.dsOfHeader is not a  
function'
NACK:  ack(h.dsFromHeader(tag,flags))	caught 'ReferenceError: tag is  
not defined'
NACK:  ack(h.fiFromHeader(this))	caught 'TypeError: h.fiFromHeader is  
not a function'
undefined
  ACK: nack(fi.fdigest)	got '00000000000000000000000000000000' not  
'00000000000000000000000000000000'
undefined
undefined
warning: pool mi: FIXME: made 4, count 1
Note: This is a harmless memory leak discovered while exiting, relax ...
warning: pool db: FIXME: made 3, count 0
Note: This is a harmless memory leak discovered while exiting, relax ...
[jbj@fedora10 js]$


Note that I've left several be-bugging flaws (as usual) to see if  
anyone is paying
attention. No hints, and I'm not holding my breath ...

Enjoy!

73 de Jeff

On Apr 27, 2009, at 4:20 PM, Jeff Johnson wrote:

>  RPM Package Manager, CVS Repository
>  http://rpm5.org/cvs/
>   
> ____________________________________________________________________________
>
>  Server: rpm5.org                         Name:   Jeff Johnson
>  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
>  Module: rpm                              Date:   27-Apr-2009 22:20:12
>  Branch: HEAD                             Handle: 2009042720201100
>
>  Modified files:
>    rpm/js                  rpmds-js.c rpmfi-js.c
>    rpm/js/tscripts         Fi.js
>
>  Log:
>    - js: Fi: add getters, handle JSCLASS_NEW_RESOLVE, always succeed  
> in
>    getprop.
>
>  Summary:
>    Revision    Changes     Path
>    1.9         +4  -5      rpm/js/rpmds-js.c
>    1.7         +174 -22    rpm/js/rpmfi-js.c
>    1.4         +44 -0      rpm/js/tscripts/Fi.js
>   
> ____________________________________________________________________________
>
>  patch -p0 <<'@@ .'
>  Index: rpm/js/rpmds-js.c
>   
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
>  $ cvs diff -u -r1.8 -r1.9 rpmds-js.c
>  --- rpm/js/rpmds-js.c	26 Apr 2009 20:21:41 -0000	1.8
>  +++ rpm/js/rpmds-js.c	27 Apr 2009 20:20:11 -0000	1.9
>  @@ -13,7 +13,6 @@
>
>   #include <rpmdb.h>
>
>  -#define	_RPMDS_INTERNAL
>   #include <rpmds.h>
>
>   #include "debug.h"
>  @@ -34,7 +33,7 @@
>       JSBool ok = (rpmdsNext(ds) >= 0) ? JS_TRUE : JS_FALSE;
>
>   if (_debug)
>  -fprintf(stderr, "==> %s(%p,%u,%p) ds %p[%d:%d] %s\n",  
> __FUNCTION__, cx, argc, vp, ds, ds->i, ds->Count,  
> JS_GetStringBytes(JS_ValueToString(cx, *vp)));
>  +fprintf(stderr, "==> %s(%p,%u,%p) ds %p[%d:%d] %s\n",  
> __FUNCTION__, cx, argc, vp, ds, rpmdsIx(ds), rpmdsCount(ds),  
> JS_GetStringBytes(JS_ValueToString(cx, *vp)));
>
>       if (!ok)
>   	goto exit;
>  @@ -73,7 +72,7 @@
>       *vp = JS_THIS(cx, vp);
>
>   if (_debug)
>  -fprintf(stderr, "==> %s(%p,%u,%p) ds %p[%d:%d] %s\n",  
> __FUNCTION__, cx, argc, vp, ds, ds->i, ds->Count,  
> JS_GetStringBytes(JS_ValueToString(cx, *vp)));
>  +fprintf(stderr, "==> %s(%p,%u,%p) ds %p[%d:%d] %s\n",  
> __FUNCTION__, cx, argc, vp, ds, rpmdsIx(ds), rpmdsCount(ds),  
> JS_GetStringBytes(JS_ValueToString(cx, *vp)));
>
>       return !JSVAL_IS_NULL(*vp);
>   }
>  @@ -221,9 +220,9 @@
>       case _IX:
>   	if (!JS_ValueToInt32(cx, *vp, &myint))
>   	    break;
>  -	if (myint != ds->i) {
>  +	if (myint != rpmdsIx(ds)) {
>   	    (void) rpmdsSetIx(ds, myint-1);
>  -	    /* XXX flush and recreate N and DNEVR with s rpmdsNext() step  
> */
>  +	    /* XXX flush and recreate N and DNEVR with a rpmdsNext() step  
> */
>   	    (void) rpmdsNext(ds);
>   	}
>   	ok = JS_TRUE;
>  @@ .
>  patch -p0 <<'@@ .'
>  Index: rpm/js/rpmfi-js.c
>   
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
>  $ cvs diff -u -r1.6 -r1.7 rpmfi-js.c
>  --- rpm/js/rpmfi-js.c	27 Apr 2009 01:01:14 -0000	1.6
>  +++ rpm/js/rpmfi-js.c	27 Apr 2009 20:20:11 -0000	1.7
>  @@ -31,10 +31,52 @@
>   /* --- Object properties */
>   enum rpmfi_tinyid {
>       _DEBUG	= -2,
>  +    _LENGTH     = -3,
>  +    _FC		= -4,
>  +    _FX		= -5,
>  +    _DC		= -6,
>  +    _DX		= -7,
>  +    _BN		= -8,
>  +    _DN		= -9,
>  +    _FN		= -10,
>  +    _VFLAGS	= -11,
>  +    _FFLAGS	= -12,
>  +    _FMODE	= -13,
>  +    _FSTATE	= -14,
>  +    _FDIGEST	= -15,
>  +    _FLINK	= -16,
>  +    _FSIZE	= -17,
>  +    _FRDEV	= -18,
>  +    _FMTIME	= -19,
>  +    _FUSER	= -20,
>  +    _FGROUP	= -21,
>  +    _FCOLOR	= -22,
>  +    _FCLASS	= -23,
>   };
>
>   static JSPropertySpec rpmfi_props[] = {
>       {"debug",	_DEBUG,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"length",	_LENGTH,	JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fc",	_FC,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fx",	_FX,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"dc",	_DC,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"dx",	_DX,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"bn",	_BN,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"dn",	_DN,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fn",	_FN,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"vflags",	_VFLAGS,	JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fflags",	_FFLAGS,	JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fmode",	_FMODE,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fstate",	_FSTATE,	JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fdigest",	_FDIGEST,	JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"flink",	_FLINK,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fsize",	_FSIZE,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"frdev",	_FRDEV,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fmtime",	_FMTIME,	JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fuser",	_FUSER,		JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fgroup",	_FGROUP,	JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fcolor",	_FCOLOR,	JSPROP_ENUMERATE,	NULL,	NULL},
>  +    {"fclass",	_FCLASS,	JSPROP_ENUMERATE,	NULL,	NULL},
>       {NULL, 0, 0, NULL, NULL}
>   };
>
>  @@ -67,6 +109,110 @@
>   	*vp = INT_TO_JSVAL(_debug);
>   	ok = JS_TRUE;
>   	break;
>  +    case _LENGTH:
>  +    case _FC:
>  +	*vp = INT_TO_JSVAL(rpmfiFC(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FX:
>  +	*vp = INT_TO_JSVAL(rpmfiFX(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _DC:
>  +	*vp = INT_TO_JSVAL(rpmfiDC(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _DX:
>  +	*vp = INT_TO_JSVAL(rpmfiDX(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _BN:
>  +        *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, rpmfiBN(fi)));
>  +        ok = JS_TRUE;
>  +        break;
>  +    case _DN:
>  +        *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, rpmfiDN(fi)));
>  +        ok = JS_TRUE;
>  +        break;
>  +    case _FN:
>  +        *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, rpmfiFN(fi)));
>  +        ok = JS_TRUE;
>  +        break;
>  +    case _VFLAGS:
>  +	*vp = INT_TO_JSVAL(rpmfiVFlags(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FFLAGS:
>  +	*vp = INT_TO_JSVAL(rpmfiFFlags(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FMODE:
>  +	*vp = INT_TO_JSVAL(rpmfiFMode(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FSTATE:
>  +	*vp = INT_TO_JSVAL(rpmfiFState(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FDIGEST:
>  +      {	int dalgo = 0;
>  +	size_t dlen = 0;
>  +	const unsigned char * digest = rpmfiDigest(fi, &dalgo, &dlen);
>  +	const unsigned char * s = digest;
>  +	size_t nb = 2 * dlen;
>  +	char * fdigest = memset(alloca(nb+1), 0, nb+1);
>  +	char *t = fdigest;
>  +	int i;
>  +
>  +	for (i = 0, s = digest, t = fdigest; i < dlen; i++, s++, t+= 2) {
>  +	    static const char hex[] = "0123456789abcdef";
>  +	    t[0] = hex[(s[0] >> 4) & 0xf];
>  +	    t[1] = hex[(s[0]     ) & 0xf];
>  +	}
>  +	*t = '\0';
>  +        *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, fdigest));
>  +        ok = JS_TRUE;
>  +      }	break;
>  +    case _FLINK:
>  +        *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,  
> rpmfiFLink(fi)));
>  +        ok = JS_TRUE;
>  +        break;
>  +    case _FSIZE:
>  +	*vp = INT_TO_JSVAL(rpmfiFSize(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FRDEV:
>  +	*vp = INT_TO_JSVAL(rpmfiFRdev(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FMTIME:
>  +	*vp = INT_TO_JSVAL(rpmfiFMtime(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FUSER:
>  +        *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,  
> rpmfiFUser(fi)));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FGROUP:
>  +        *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,  
> rpmfiFGroup(fi)));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FCOLOR:
>  +	*vp = INT_TO_JSVAL(rpmfiFColor(fi));
>  +	ok = JS_TRUE;
>  +	break;
>  +    case _FCLASS:
>  +      {	const char * FClass = rpmfiFClass(fi);
>  +	char * t;
>  +	if (FClass == NULL) FClass = "";
>  +	/* XXX spot fix for known embedded single quotes. */
>  +	t = xstrdup(FClass);
>  +	if (!strncmp(t, "symbolic link to `", sizeof("symbolic link to  
> `")-1))
>  +	   t[sizeof("symbolic link")-1] = '\0';
>  +        *vp = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, t));
>  +	t = _free(t);
>  +	ok = JS_TRUE;
>  +      }	break;
>       default:
>   	break;
>       }
>  @@ -74,6 +220,7 @@
>       if (!ok) {
>   _PROP_DEBUG_EXIT(_debug);
>       }
>  +ok = JS_TRUE;  /* XXX avoid immediate interp exit by always  
> succeeding. */
>       return ok;
>   }
>
>  @@ -92,6 +239,26 @@
>   	if (JS_ValueToInt32(cx, *vp, &_debug))
>   	    ok = JS_TRUE;
>   	break;
>  +    case _FX:
>  +	if (!JS_ValueToInt32(cx, *vp, &myint))
>  +	    break;
>  +	if (myint != rpmfiFX(fi)) {
>  +	    (void) rpmfiSetFX(fi, myint-1);
>  +	    /* XXX flush and recreate a {BN,DN,FN} with a rpmfiNext()  
> step */
>  +	    (void) rpmfiNext(fi);
>  +	}
>  +	ok = JS_TRUE;
>  +        break;
>  +    case _DX:
>  +	if (!JS_ValueToInt32(cx, *vp, &myint))
>  +	    break;
>  +	if (myint != rpmfiDX(fi)) {
>  +	    (void) rpmfiSetDX(fi, myint-1);
>  +	    /* XXX flush and recreate a {BN,DN,FN} with a rpmfiNext()  
> step */
>  +	    (void) rpmfiNextD(fi);
>  +	}
>  +	ok = JS_TRUE;
>  +        break;
>       default:
>   	break;
>       }
>  @@ -107,35 +274,20 @@
>   	JSObject **objp)
>   {
>       void * ptr = JS_GetInstancePrivate(cx, obj, &rpmfiClass, NULL);
>  -    static char hex[] = "0123456789abcdef";
>  -    JSString *idstr;
>  -    const char * name;
>  -    JSString * valstr;
>  -    char value[5];
>  +    rpmfi fi = ptr;
>       JSBool ok = JS_FALSE;
>
>   _RESOLVE_DEBUG_ENTRY(_debug);
>
>  -    if (flags & JSRESOLVE_ASSIGNING) {
>  +    if ((flags & JSRESOLVE_ASSIGNING)
>  +     || (fi == NULL)) { /* don't resolve to parent prototypes  
> objects. */
>  +	*objp = NULL;
>   	ok = JS_TRUE;
>   	goto exit;
>       }
>
>  -    if ((idstr = JS_ValueToString(cx, id)) == NULL)
>  -	goto exit;
>  +    *objp = obj;        /* XXX always resolve in this object. */
>
>  -    name = JS_GetStringBytes(idstr);
>  -    if (name[1] == '\0' && xisalpha(name[0])) {
>  -	value[0] = '0'; value[1] = 'x';
>  -	value[2] = hex[(name[0] >> 4) & 0xf];
>  -	value[3] = hex[(name[0]     ) & 0xf];
>  -	value[4] = '\0';
>  - 	if ((valstr = JS_NewStringCopyZ(cx, value)) == NULL
>  -	 || !JS_DefineProperty(cx, obj, name, STRING_TO_JSVAL(valstr),
>  -				NULL, NULL, JSPROP_ENUMERATE))
>  -	    goto exit;
>  -	*objp = obj;
>  -    }
>       ok = JS_TRUE;
>   exit:
>       return ok;
>  @@ -273,9 +425,9 @@
>   #else
>   JSClass rpmfiClass = {
>       "Fi", JSCLASS_NEW_RESOLVE | JSCLASS_HAS_PRIVATE,
>  -    JS_PropertyStub,   JS_PropertyStub, rpmfi_getprop,  
> JS_PropertyStub,
>  +    rpmfi_addprop, rpmfi_delprop, rpmfi_getprop, rpmfi_setprop,
>       (JSEnumerateOp)rpmfi_enumerate, (JSResolveOp)rpmfi_resolve,
>  -    JS_ConvertStub,	rpmfi_dtor,
>  +    rpmfi_convert,	rpmfi_dtor,
>       JSCLASS_NO_OPTIONAL_MEMBERS
>   };
>   #endif
>  @@ .
>  patch -p0 <<'@@ .'
>  Index: rpm/js/tscripts/Fi.js
>   
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
>  $ cvs diff -u -r1.3 -r1.4 Fi.js
>  --- rpm/js/tscripts/Fi.js	27 Apr 2009 11:37:55 -0000	1.3
>  +++ rpm/js/tscripts/Fi.js	27 Apr 2009 20:20:11 -0000	1.4
>  @@ -1,9 +1,53 @@
>   if (loglvl) print("--> Fi.js");
>
>  +var RPMTAG_NAME = 1000;
>  +var N = "popt";
>  +
>  +var ts = new Ts();
>  +// var mi = ts.mi(RPMTAG_NAME, 'popt');
>  +var mi = new Mi(ts, RPMTAG_NAME, N);
>  +ack("mi.length", 1);
>  +ack("mi.count", 1);
>  +ack("mi.instance", 0);  // zero before iterating
>  +
>  +// var h = new Hdr();
>  +var h = mi.next()
>  +nack("mi.instance", 0); // non-zero when iterating
>  +
>   var fi = new Fi(h);
>   ack("typeof fi;", "object");
>   ack("fi instanceof Fi;", true);
>   ack("fi.debug = 1;", 1);
>   ack("fi.debug = 0;", 0);
>
>  +ack("fi.fc", undefined);
>  +ack("fi.fx", undefined);
>  +ack("fi.dc", undefined);
>  +ack("fi.dx", undefined);
>  +
>  +ack("fi.dx = 0;", 0);
>  +ack("++fi.dx;", 1);
>  +ack("++fi.dx;", 2);
>  +
>  +ack("fi.fx = -1;", -1);
>  +ack("++fi.fx;", 0);
>  +ack("++fi.fx;", 1);
>  +
>  +ack("fi.bn", undefined);
>  +ack("fi.dn", undefined);
>  +ack("fi.fn", undefined);
>  +ack("fi.vflags", undefined);
>  +ack("fi.fflags", undefined);
>  +ack("fi.fmode", undefined);
>  +ack("fi.fstate", undefined);
>  +nack("fi.fdigest", "00000000000000000000000000000000");
>  +ack("fi.flink", undefined);
>  +ack("fi.fsize", undefined);
>  +ack("fi.frdev", undefined);
>  +ack("fi.fmtime", undefined);
>  +ack("fi.fuser", undefined);
>  +ack("fi.fgroup", undefined);
>  +ack("fi.fcolor", undefined);
>  +nack("fi.fclass", "symbolic link to `libpopt.so.0.0.0'");
>  +
>   if (loglvl) print("<-- Fi.js");
>  @@ .
> ______________________________________________________________________
> RPM Package Manager                                    http://rpm5.org
> CVS Sources Repository                                rpm-cvs@rpm5.org

______________________________________________________________________
RPM Package Manager                                    http://rpm5.org
Developer Communication List                        rpm-devel@rpm5.org
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic