svn merge -r90150:90340 svn+ssh://svn.lindenlab.com/svn/linden/branches/qar-699_combo-merge --> release

QAR-699 - Combo merge for QAR-687, QAR-637, QAR-586

 * QAR-687 - Test build with libs on S3
 * QAR-637 Test dynamic sound throttle
 * QAR-586 Test new http features branch
master
Kyle Ambroff 2008-06-21 07:39:52 +00:00
parent af080d1c62
commit dc3f5ff87c
12 changed files with 530 additions and 382 deletions

View File

@ -63,7 +63,6 @@ set(cmake_SOURCE_FILES
PNG.cmake
Python.cmake
QuickTime.cmake
Smartheap.cmake
TemplateCheck.cmake
UI.cmake
UnixInstall.cmake

View File

@ -55,28 +55,31 @@ class LLKeyThrottleImpl
protected:
struct Entry {
U32 count;
BOOL blocked;
bool blocked;
Entry() : count(0), blocked(FALSE) { }
Entry() : count(0), blocked(false) { }
};
typedef std::map<T, Entry> EntryMap;
EntryMap * prevMap;
EntryMap * currMap;
EntryMap* prevMap;
EntryMap* currMap;
U32 countLimit;
// maximum number of keys allowed per interval
U64 intervalLength; // each map covers this time period (usec or frame number)
U64 startTime; // start of the time period (usec or frame number)
// currMap started counting at this time
// prevMap covers the previous interval
LLKeyThrottleImpl() : prevMap(0), currMap(0),
countLimit(0), intervalLength(1),
startTime(0) { };
LLKeyThrottleImpl() :
prevMap(NULL),
currMap(NULL),
countLimit(0),
intervalLength(1),
startTime(0)
{}
static U64 getTime()
{
@ -93,7 +96,9 @@ template< class T >
class LLKeyThrottle
{
public:
LLKeyThrottle(U32 limit, F32 interval, BOOL realtime = TRUE) // realtime = FALSE for frame-based throttle, TRUE for usec real-time throttle
// @param realtime = FALSE for frame-based throttle, TRUE for usec
// real-time throttle
LLKeyThrottle(U32 limit, F32 interval, BOOL realtime = TRUE)
: m(* new LLKeyThrottleImpl<T>)
{
setParameters( limit, interval, realtime );
@ -149,7 +154,7 @@ public:
}
U32 prevCount = 0;
BOOL prevBlocked = FALSE;
bool prevBlocked = false;
typename LLKeyThrottleImpl<T>::EntryMap::const_iterator prev = m.prevMap->find(id);
if (prev != m.prevMap->end())
@ -198,17 +203,17 @@ public:
noteAction(id);
typename LLKeyThrottleImpl<T>::Entry& curr = (*m.currMap)[id];
curr.count = llmax(m.countLimit, curr.count);
curr.blocked = TRUE;
curr.blocked = true;
}
// returns TRUE if key is blocked
BOOL isThrottled(const T& id) const
// returns true if key is blocked
bool isThrottled(const T& id) const
{
if (m.currMap->empty()
&& m.prevMap->empty())
{
// most of the time we'll fall in here
return FALSE;
return false;
}
// NOTE, we ignore the case where id is in the map but the map is stale.
@ -226,7 +231,7 @@ public:
{
return entry->second.blocked;
}
return FALSE;
return false;
}
// Get the throttling parameters

View File

@ -112,6 +112,15 @@ LLCurl::Responder::~Responder()
{
}
// virtual
void LLCurl::Responder::error(
U32 status,
const std::string& reason,
const LLSD&)
{
error(status, reason);
}
// virtual
void LLCurl::Responder::error(U32 status, const std::string& reason)
{
@ -124,38 +133,16 @@ void LLCurl::Responder::result(const LLSD& content)
}
// virtual
void LLCurl::Responder::completedRaw(U32 status, const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
void LLCurl::Responder::completedRaw(
U32 status,
const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
if (isGoodStatus(status))
{
LLSD content;
LLBufferStream istr(channels, buffer.get());
LLSDSerialize::fromXML(content, istr);
/*
const S32 parseError = -1;
if(LLSDSerialize::fromXML(content, istr) == parseError)
{
mStatus = 498;
mReason = "Client Parse Error";
}
*/
completed(status, reason, content);
}
else if (status == 400)
{
// Get reason from buffer
char tbuf[4096];
S32 len = 4096;
buffer->readAfter(channels.in(), NULL, (U8*)tbuf, len);
tbuf[len] = 0;
completed(status, std::string(tbuf), LLSD());
}
else
{
completed(status, reason, LLSD());
}
LLSD content;
LLBufferStream istr(channels, buffer.get());
LLSDSerialize::fromXML(content, istr);
completed(status, reason, content);
}
// virtual
@ -167,10 +154,7 @@ void LLCurl::Responder::completed(U32 status, const std::string& reason, const L
}
else
{
// *NOTE: This is kind of messed up. This should probably call
// the full error method which then provides a default impl
// which calls the thinner method.
error(status, reason);
error(status, reason, content);
}
}

View File

@ -84,17 +84,31 @@ public:
return((200 <= status) && (status < 300));
}
virtual void error(
U32 status,
const std::string& reason,
const LLSD& content);
//< called by completed() on bad status
virtual void error(U32 status, const std::string& reason);
// called with non-200 status codes
//< called by default error(status, reason, content)
virtual void result(const LLSD& content);
// Override point for clients that may want to use this class when the response is some other format besides LLSD
virtual void completedRaw(U32 status, const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer);
//< called by completed for good status codes.
virtual void completed(U32 status, const std::string& reason, const LLSD& content);
virtual void completedRaw(
U32 status,
const std::string& reason,
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer);
/**< Override point for clients that may want to use this
class when the response is some other format besides LLSD
*/
virtual void completed(
U32 status,
const std::string& reason,
const LLSD& content);
/**< The default implemetnation calls
either:
* result(), or

View File

@ -205,9 +205,7 @@ static void request(
Injector* body_injector,
LLCurl::ResponderPtr responder,
const F32 timeout = HTTP_REQUEST_EXPIRY_SECS,
const LLSD& headers = LLSD(),
S32 offset = 0,
S32 bytes = 0)
const LLSD& headers = LLSD())
{
if (!LLHTTPClient::hasPump())
{
@ -216,7 +214,7 @@ static void request(
}
LLPumpIO::chain_t chain;
LLURLRequest *req = new LLURLRequest(method, url);
LLURLRequest* req = new LLURLRequest(method, url);
req->checkRootCertificate(true);
// Insert custom headers is the caller sent any
@ -235,7 +233,7 @@ static void request(
//to not use the proxy (read: llurlrequest.cpp)
if ((iter->first == "Pragma") && (iter->second.asString() == ""))
{
req->useProxy(FALSE);
req->useProxy(false);
}
header << iter->first << ": " << iter->second.asString() ;
lldebugs << "header = " << header.str() << llendl;
@ -258,34 +256,27 @@ static void request(
chain.push_back(LLIOPipe::ptr_t(body_injector));
}
if (method == LLURLRequest::HTTP_GET && (offset > 0 || bytes > 0))
{
std::string range = llformat("Range: bytes=%d-%d", offset,offset+bytes-1);
req->addHeader(range.c_str());
}
chain.push_back(LLIOPipe::ptr_t(req));
theClientPump->addChain(chain, timeout);
}
void LLHTTPClient::getByteRange(const std::string& url,
S32 offset, S32 bytes,
ResponderPtr responder,
const LLSD& headers,
const F32 timeout)
void LLHTTPClient::getByteRange(
const std::string& url,
S32 offset,
S32 bytes,
ResponderPtr responder,
const LLSD& hdrs,
const F32 timeout)
{
// *FIX: Why is the headers argument ignored? Phoenix 2008-04-28
request(
url,
LLURLRequest::HTTP_GET,
NULL,
responder,
timeout,
LLSD(), // WTF? Shouldn't this be used?
offset,
bytes);
LLSD headers = hdrs;
if(offset > 0 || bytes > 0)
{
std::string range = llformat("bytes=%d-%d", offset, offset+bytes-1);
headers["Range"] = range;
}
request(url,LLURLRequest::HTTP_GET, NULL, responder, timeout, headers);
}
void LLHTTPClient::head(const std::string& url, ResponderPtr responder, const F32 timeout)

View File

@ -174,6 +174,26 @@ LLSD LLHTTPNode::del(const LLSD&) const
throw NotImplemented();
}
// virtual
void LLHTTPNode::options(ResponsePtr response, const LLSD& context) const
{
//llinfos << "options context: " << context << llendl;
// default implementation constructs an url to the documentation.
std::string host = context[CONTEXT_REQUEST]["headers"]["host"].asString();
if(host.empty())
{
response->status(400, "Bad Request -- need Host header");
return;
}
std::ostringstream ostr;
ostr << "http://" << host << "/web/server/api";
ostr << context[CONTEXT_REQUEST]["path"].asString();
static const std::string DOC_HEADER("X-Documentation-URL");
response->addHeader(DOC_HEADER, ostr.str());
response->status(200, "OK");
}
// virtual
LLHTTPNode* LLHTTPNode::getChild(const std::string& name, LLSD& context) const
@ -386,6 +406,13 @@ void LLHTTPNode::Response::methodNotAllowed()
status(405, "Method Not Allowed");
}
void LLHTTPNode::Response::addHeader(
const std::string& name,
const std::string& value)
{
mHeaders[name] = value;
}
void LLHTTPNode::describe(Description& desc) const
{
desc.shortInfo("unknown service (missing describe() method)");

View File

@ -82,33 +82,79 @@ public:
*/
//@{
public:
virtual LLSD get() const;
virtual LLSD put(const LLSD& input) const;
virtual LLSD post(const LLSD& input) const;
virtual LLSD del(const LLSD& context) const;
virtual LLSD get() const;
virtual LLSD put(const LLSD& input) const;
virtual LLSD post(const LLSD& input) const;
virtual LLSD del(const LLSD& context) const;
class Response : public LLRefCount
{
protected:
virtual ~Response();
class Response : public LLRefCount
{
protected:
virtual ~Response();
public:
virtual void result(const LLSD&) = 0;
virtual void status(S32 code, const std::string& message) = 0;
public:
/**
* @brief Return the LLSD content and a 200 OK.
*/
virtual void result(const LLSD&) = 0;
void status(S32 code);
void notFound(const std::string& message);
void notFound();
void methodNotAllowed();
};
/**
* @brief return status code and reason string on http header,
* but do not return a payload.
*/
virtual void status(S32 code, const std::string& message) = 0;
typedef LLPointer<Response> ResponsePtr;
/**
* @brief Return no body, just status code and 'UNKNOWN ERROR'.
*/
void status(S32 code);
virtual void get(ResponsePtr, const LLSD& context) const;
virtual void put(ResponsePtr, const LLSD& context, const LLSD& input) const;
virtual void post(ResponsePtr, const LLSD& context, const LLSD& input) const;
virtual void del(ResponsePtr, const LLSD& context) const;
void notFound(const std::string& message);
void notFound();
void methodNotAllowed();
/**
* @breif Add a name: value http header.
*
* No effort is made to ensure the response is a valid http
* header.
* The headers are stored as a map of header name : value.
* Though HTTP allows the same header name to be transmitted
* more than once, this implementation only stores a header
* name once.
* @param name The name of the header, eg, "Content-Encoding"
* @param value The value of the header, eg, "gzip"
*/
void addHeader(const std::string& name, const std::string& value);
protected:
/**
* @brief Headers to be sent back with the HTTP response.
*
* Protected class membership since derived classes are
* expected to use it and there is no use case yet for other
* uses. If such a use case arises, I suggest making a
* headers() public method, and moving this member data into
* private.
*/
LLSD mHeaders;
};
typedef LLPointer<Response> ResponsePtr;
virtual void get(ResponsePtr, const LLSD& context) const;
virtual void put(
ResponsePtr,
const LLSD& context,
const LLSD& input) const;
virtual void post(
ResponsePtr,
const LLSD& context,
const LLSD& input) const;
virtual void del(ResponsePtr, const LLSD& context) const;
virtual void options(ResponsePtr, const LLSD& context) const;
//@}

View File

@ -57,10 +57,13 @@
static const char HTTP_VERSION_STR[] = "HTTP/1.0";
static const std::string CONTEXT_REQUEST("request");
static const std::string CONTEXT_RESPONSE("response");
static const std::string CONTEXT_VERB("verb");
static const std::string CONTEXT_HEADERS("headers");
static const std::string HTTP_VERB_GET("GET");
static const std::string HTTP_VERB_PUT("PUT");
static const std::string HTTP_VERB_POST("POST");
static const std::string HTTP_VERB_DELETE("DELETE");
static const std::string HTTP_VERB_OPTIONS("OPTIONS");
static LLIOHTTPServer::timing_callback_t sTimingCallback = NULL;
static void* sTimingCallbackData = NULL;
@ -130,6 +133,7 @@ private:
LLSD mGoodResult;
S32 mStatusCode;
std::string mStatusMessage;
LLSD mHeaders;
};
LLIOPipe::EStatus LLHTTPPipe::process_impl(
@ -164,7 +168,7 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
static LLTimer timer;
timer.reset();
std::string verb = context[CONTEXT_REQUEST]["verb"];
std::string verb = context[CONTEXT_REQUEST][CONTEXT_VERB];
if(verb == HTTP_VERB_GET)
{
mNode.get(LLHTTPNode::ResponsePtr(mResponse), context);
@ -185,6 +189,10 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
{
mNode.del(LLHTTPNode::ResponsePtr(mResponse), context);
}
else if(verb == HTTP_VERB_OPTIONS)
{
mNode.options(LLHTTPNode::ResponsePtr(mResponse), context);
}
else
{
mResponse->methodNotAllowed();
@ -231,7 +239,9 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
case STATE_GOOD_RESULT:
{
context[CONTEXT_RESPONSE]["contentType"] = "application/xml";
LLSD headers = mHeaders;
headers["Content-Type"] = "application/xml";
context[CONTEXT_RESPONSE][CONTEXT_HEADERS] = headers;
LLBufferStream ostr(channels, buffer.get());
LLSDSerialize::toXML(mGoodResult, ostr);
@ -240,7 +250,9 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl(
case STATE_STATUS_RESULT:
{
context[CONTEXT_RESPONSE]["contentType"] = "text/plain";
LLSD headers = mHeaders;
headers["Content-Type"] = "text/plain";
context[CONTEXT_RESPONSE][CONTEXT_HEADERS] = headers;
context[CONTEXT_RESPONSE]["statusCode"] = mStatusCode;
context[CONTEXT_RESPONSE]["statusMessage"] = mStatusMessage;
LLBufferStream ostr(channels, buffer.get());
@ -287,6 +299,7 @@ void LLHTTPPipe::Response::result(const LLSD& r)
mPipe->mStatusMessage = "OK";
mPipe->mGoodResult = r;
mPipe->mState = STATE_GOOD_RESULT;
mPipe->mHeaders = mHeaders;
mPipe->unlockChain();
}
@ -302,6 +315,7 @@ void LLHTTPPipe::Response::status(S32 code, const std::string& message)
mPipe->mStatusCode = code;
mPipe->mStatusMessage = message;
mPipe->mState = STATE_STATUS_RESULT;
mPipe->mHeaders = mHeaders;
mPipe->unlockChain();
}
@ -389,17 +403,24 @@ LLIOPipe::EStatus LLHTTPResponseHeader::process_impl(
}
ostr << HTTP_VERSION_STR << " " << code << " " << message << "\r\n";
std::string type = context[CONTEXT_RESPONSE]["contentType"].asString();
if (!type.empty())
{
ostr << "Content-Type: " << type << "\r\n";
}
S32 content_length = buffer->countAfter(channels.in(), NULL);
if(0 < content_length)
{
ostr << "Content-Length: " << content_length << "\r\n";
}
// *NOTE: This guard can go away once the LLSD static map
// iterator is available. Phoenix. 2008-05-09
LLSD headers = context[CONTEXT_RESPONSE][CONTEXT_HEADERS];
if(headers.isDefined())
{
LLSD::map_iterator iter = headers.beginMap();
LLSD::map_iterator end = headers.endMap();
for(; iter != end; ++iter)
{
ostr << (*iter).first << ": " << (*iter).second.asString()
<< "\r\n";
}
}
ostr << "\r\n";
LLChangeChannel change(channels.in(), channels.out());
@ -606,11 +627,12 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
read_next_line = true;
LLMemoryStream header((U8*)buf, len);
header >> mVerb;
if((HTTP_VERB_GET == mVerb)
|| (HTTP_VERB_POST == mVerb)
|| (HTTP_VERB_PUT == mVerb)
|| (HTTP_VERB_DELETE == mVerb))
|| (HTTP_VERB_DELETE == mVerb)
|| (HTTP_VERB_OPTIONS == mVerb))
{
header >> mAbsPathAndQuery;
header >> mVersion;
@ -721,7 +743,7 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
{
// hey, hey, we should have everything now, so we pass it to
// a content handler.
context[CONTEXT_REQUEST]["verb"] = mVerb;
context[CONTEXT_REQUEST][CONTEXT_VERB] = mVerb;
const LLHTTPNode* node = mRootNode.traverse(mPath, context);
if(node)
{
@ -765,7 +787,7 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl(
= mBuildContext["remote-host"];
context[CONTEXT_REQUEST]["remote-port"]
= mBuildContext["remote-port"];
context[CONTEXT_REQUEST]["headers"] = mHeaders;
context[CONTEXT_REQUEST][CONTEXT_HEADERS] = mHeaders;
const LLChainIOFactory* protocolHandler
= node->getProtocolHandler();

View File

@ -28,7 +28,6 @@ include(LScript)
include(Linking)
include(Mozlib)
include(NDOF)
include(Smartheap)
include(TemplateCheck)
include(UI)
include(UnixInstall)

View File

@ -327,6 +327,23 @@ namespace tut
ensure_starts_with("large echo status", result, "HTTP/1.0 200 OK\r\n");
}
template<> template<>
void HTTPServiceTestObject::test<8>()
{
// test the OPTIONS http method -- the default implementation
// should return the X-Documentation-URL
std::ostringstream http_request;
http_request << "OPTIONS / HTTP/1.0\r\nHost: localhost\r\n\r\n";
bool timeout = false;
std::string result = makeRequest("/", http_request.str(), timeout);
ensure_starts_with("OPTIONS verb ok", result, "HTTP/1.0 200 OK\r\n");
ensure_contains(
"Doc url header exists",
result,
"X-Documentation-URL: http://localhost");
}
/* TO DO:
test generation of not found and method not allowed errors
*/

View File

@ -1,7 +1,7 @@
<?xml version="1.0" ?>
<llsd>
<map>
<key>binaries</key>
<key>installables</key>
<map>
<key>GL</key>
<map>
@ -16,23 +16,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>7b147162449c216a016dc2bfe2a4380c</string>
<string>0bd2795a2afe09f6c563f2f888f24cc9</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/GL-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>d78e3e4d8c33e5233d88ec8096307ee8</string>
<string>85f2ed989f853beb3d6cc94413b35f1a</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/GL-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>e0736f3f17fe980ef68b8a65ef90011d</string>
<string>e6ba152b7edd4ad2c9db4f9ff7bd38e1</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/GL-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -49,23 +49,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>d7500212b654e9380c4dc24166285407</string>
<string>025bb5e76fd964b89c508d88d37bb802</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/SDL-1.2.5-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>c7f3da1da96ccc1f26ec92634e7771b8</string>
<string>a28fe914d3f3241c824aabba69f1d946</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/SDL-1.2.5-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>1c081cc35730919781e23b916a56722e</string>
<string>149626b0c10d7eb8b9f9be96b5318218</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/SDL-1.2.5-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -78,23 +78,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>ee3014eda3d5f912c1e3ec21bbdddcaf</string>
<string>10b11783907b72712daef3ed5803d56d</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/apr_suite-1.2.8-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-darwin-20080618.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>4b0f2cc3ec66162be6cf0b13186bc838</string>
<string>b99f6bd3548c4f4613fe95320e14dbf3</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/apr_suite-1.2.8-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-20080618.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>979257a1b24d9200be58872d9c658114</string>
<string>352c46f39773b9415f8a9bf868c4c305</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/apr_suite-1.2.8-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-windows-20080618.tar.bz2</uri>
</map>
</map>
</map>
@ -111,23 +111,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>19aae45edfd29a269cd10af7729489e7</string>
<string>b6109b75e53c72e021625e375ba52080</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/ares-1.3.0-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-darwin-20080618.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>8b163aa08cf4a5b70f93519137fa6cf0</string>
<string>1e800e34d2799abb0797f05c6e38ea1a</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/ares-1.3.0-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-linux-20080618.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>bbbe5e5f8504125e2ab813f666fd61ba</string>
<string>085a62de4c264d6a3718ad789aacd297</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/ares-1.3.0-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-windows-20080618.tar.bz2</uri>
</map>
</map>
</map>
@ -153,23 +153,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>4afb62f563bb2fd9d43fc071e2eeb167</string>
<string>792601ce1f38067c086394842852fa11</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/boost-1.32.0-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>14aba81fa0993e420882314a3fea5127</string>
<string>e65f06e2500db0bbc34506194ac49f6a</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/boost-1.32.0-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>2b627d2a598f883950c21bae52738176</string>
<string>6f03592f4db4c177c7b255520283f547</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/boost-1.32.0-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -186,23 +186,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>722c0e0eccf28b00e0f759362ef81ddf</string>
<string>73965ddba50e5c4d46d50a966b472626</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/curl-7.16.0-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>cd89f34324acf1222078298974c1dfb3</string>
<string>a7791ee5ca19f208808f71730c3c2feb</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/curl-7.16.0-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>08d17bc997494a852537b0c7b4425d47</string>
<string>fb42c5b40e34b043cee236aa216b141e</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/curl-7.16.0-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -215,9 +215,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>e4f5109f8c119613d7b2c3706d786e43</string>
<string>feb9d72c373c5dd4c6b88ed02e2b2bf0</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/elfio-1.0.3-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -234,23 +234,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>93760196ea3e851b1a334743816e189d</string>
<string>7b9380e6bac8d9ba5e6ff20da5cad91a</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/expat-1.95.8-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20080617.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>8e990a9e3c30c7c37c147ac0df70a323</string>
<string>e59d8314185e3d87d72ff90d6cff0d30</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/expat-1.95.8-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>e58538aae9982209e095bbf6660c8d6b</string>
<string>abd100b16dbe4621019a229af0411f5d</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/expat-1.95.8-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-windows-20080617.tar.bz2</uri>
</map>
</map>
</map>
@ -296,9 +296,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>6630fea6b036f3e937608b3d4186adfa</string>
<string>9af6a1ed39fa540bfcaa402b0ea22f78</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/fontconfig-2.2.3-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -315,23 +315,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>b34eb8af0a2b736a1d70d8b32b3e009d</string>
<string>cd8a8f8af5a01fac015e5b0325daa2ae</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/freetype-2.1.5-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>a52b44f89b7422c565da5f4a5c7f582c</string>
<string>83e7aafe0807c2adec68f67b5738d856</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/freetype-2.1.5-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>5b1aae54ea3313a9f424719323eb5ad3</string>
<string>b22d33d86567561eb116aa2ccd024d88</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/freetype-2.1.5-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -348,23 +348,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>64ea2fca2ca9457b9305ec416c574a61</string>
<string>23bd9a75e5a2365a827461e6c324f52b</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/glh_linear-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>6fd9c490b7460e2b433381050495e48e</string>
<string>2965646aea1d2a6aec1fbc431c02733f</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/glh_linear-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>e286dc9f7ce90856a7ac291874b6fc34</string>
<string>38b9ddfe8dceff55ee4351016a937d1b</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/glh_linear-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -377,9 +377,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>6df3889822deb8b80ac6f6d421a35137</string>
<string>589a8385979d2b0561daaec2148f8b77</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/google-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-linux-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -392,9 +392,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>5e0e4ee938b56a118c90d51447009ba9</string>
<string>c829b638b6eef71ca63418cb9aea46a2</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/gstreamer-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -411,16 +411,16 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>72801a23b43586b822c8a1dfc1a6e313</string>
<string>83eddf6114f1e306c61fbda16ad02f0c</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/gtk-atk-pango-glib-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>492b04de6ba02167cef7a04e8dc5e748</string>
<string>d963750bcd333a108b3697d220c87d09</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/gtk-atk-pango-glib-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -470,23 +470,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>62cc07ef64f31f493f55e618c915125b</string>
<string>30b12debc3efce275a335b824dda22d2</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/jpeglib-6b-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>6bb623a88116002124686248ebd35fd9</string>
<string>9297565a09754fdf2b58cefef60450c7</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/jpeglib-6b-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>b28852df715401eae575ccd9d5c84cf1</string>
<string>475ab2d2f4b769834bd3f35562b8c445</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/jpeglib-6b-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -503,23 +503,56 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>a351af91b5a102d1b6fe95b5d1ab4347</string>
<string>4db422310f3b35710e44f69ecda19195</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-darwin-20080610.tar.bz2</uri>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>155ecb6f704c1082aa6565537ada024b</string>
<string>5a70296632fa973e6484f60de067088c</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-linux-20080610.tar.bz2</uri>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>5cd4c0db91e3687290de685203634ab8</string>
<string>15528c24ca657b524d9ab3ccbb33c766</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-windows-20080611.tar.bz2</uri>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
<key>kdu-binaries</key>
<map>
<key>copyright</key>
<string>see kdu</string>
<key>description</key>
<string>see kdu</string>
<key>license</key>
<string>kdu</string>
<key>packages</key>
<map>
<key>darwin</key>
<map>
<key>md5sum</key>
<string>480fbeeb47c9b9c4a2f947e310c9821c</string>
<key>url</key>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-darwin-20080617.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>ca87644e377a6cf16db4ba6dbd2f8689</string>
<key>url</key>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-linux-20080617.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>87af253b1d76437290355e8e20029377</string>
<key>url</key>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-windows-20080617.tar.bz2</uri>
</map>
</map>
</map>
@ -536,23 +569,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>2e41f3710b5769e58d2e00944feb7bee</string>
<string>90488b309856a82a152348db177a44c5</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/libpng-1.2.18-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>642dd0ba1fa7ac55fae555cd622b36f6</string>
<string>b47eca741c218e13e6838583c9169b64</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/libpng-1.2.18-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>0274c3d4a3b7cce8eede207348438f3b</string>
<string>96ad03239a2b1d50584dcaf66162e03e</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/libpng-1.2.18-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -569,9 +602,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>8c39ea5d1feebbe9b8ee5d5933eeabe5</string>
<string>0591314df0293ba948b0445b0215a18d</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/libstdc++-6.0-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.0-linux-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -588,9 +621,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>cf68933edc8d556d6901179a7993bbc0</string>
<string>495f01afa67ed1ae59b7b8005cfa55ff</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/libuuid-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -603,9 +636,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>3a71ea5ff924e70c6786ef2c202f553b</string>
<string>4b5d2dcfe8a49b73fb69f10aab441092</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/libxml-2.6.24-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -618,23 +651,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>e2969baf0e39f6a586141a75c3360330</string>
<string>056ad496f0ec2bf386d50f694f6bade3</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/llmozlib-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>55ab8be3f18e27095f7ecae7d90804d5</string>
<string>c80e060867b07dd3e3c1dce70f2316eb</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/llmozlib-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>73a0bc8ea770a4035175161d2b1e903f</string>
<string>4bf828c670fb9848c7d2a91bf4eccafc</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/llmozlib-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -651,16 +684,16 @@
<key>linux</key>
<map>
<key>md5sum</key>
<string>461891f44070780d9ca0b26988b6f44e</string>
<string>13802606c5f6e98af7cfa72cc85e3a92</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/mesa-7.0-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>e0a27aef7b2de0d5c78c753f72214e8d</string>
<string>82cdcdcb2d0615389a7480485ea35f4c</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/mesa-7.0-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -689,7 +722,7 @@
<key>ndofdev</key>
<map>
<key>copyright</key>
<string>(c) 2008 Linden Lab.</string>
<string>Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved.</string>
<key>description</key>
<string>in use on windows and darwin for joystick support.</string>
<key>license</key>
@ -699,23 +732,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>dae6e00c7eed6bacdecd639c4f5cef1d</string>
<string>15df716b66bd83e2198450eed93197cd</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/ndofdev-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-darwin-20080618.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>ccaf379968c886258d5390d06ff1a2c0</string>
<string>489612b246b2f4b2f239611d786c79de</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/ndofdev-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-20080618.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>af8249252bcd3782606bf17cdc145ea4</string>
<string>03cbdf59996f468f907f11cb9c64f93f</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/ndofdev-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-windows-20080618.tar.bz2</uri>
</map>
</map>
</map>
@ -732,23 +765,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>59d3f15d89d9433f931f480878f46d4c</string>
<string>8d9bb71c06f6494cc767965145f31c63</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>54a29d28fbce6dd6abb875975a42acf1</string>
<string>1e912aef160c1d8f46f4194942922654</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>2800543038e88c233976a2301e67325f</string>
<string>9667525f28adb4ad54bbc883b14324ac</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/ogg-vorbis-1.03-1.1.2-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -761,23 +794,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>5da0ef41618a024795508f5c93d61754</string>
<string>a708e7b41b91852b060bb3d62112b4d7</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/openSSL-0.9.7c-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>fb54b93f881e587363b134f42e2f1c0b</string>
<string>727f2a9399b7f414260a03fdf700aef4</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/openSSL-0.9.7c-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>0f0e8ea5014f2112f2d04a85a0b8720e</string>
<string>8a75180cae12d268071c090abb031ba5</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/openSSL-0.9.7c-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -794,23 +827,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>e169d2372539fc96b72dc59aa7a656e6</string>
<string>85b34723ab22591ebbc51c474588c2e0</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/openjpeg-1.2-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>8b2733f8e4b7d58db7392d7a6837675f</string>
<string>406ceca1c85b64df18deed95f3b7854c</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/openjpeg-1.2-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>9f7ae7023fad3c823a303c57610973c5</string>
<string>33ceb9232a59c0399ef4d239373c3e42</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/openjpeg-1.2-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -879,23 +912,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>fe8045e47dc505786e1d45d480190f96</string>
<string>1116d9ba0c34c042788421d4e520e747</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/tut-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>2e28af0b6124a472b9aac6f2225dca8d</string>
<string>da7872a8a5cfe5d14ceeeebe73e58d6b</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/tut-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>953cc124943a05e474687a127d2e88d9</string>
<string>aa5e69f024bb408fac41d77d1101ccb6</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/tut-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -914,7 +947,7 @@
<key>md5sum</key>
<string>6353aff33d7d03b22055aec76f53a866</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/unistd-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/unistd-windows-20080611.tar.bz2</uri>
</map>
</map>
</map>
@ -929,23 +962,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>121199818b827e147179c3d3494815e1</string>
<string>4d786ce5732b70cf230f0eebcec9571c</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-darwin-20080610.tar.bz2</uri>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>c58f03002a9c452d4c8cb1874d3ac44b</string>
<string>3b7dc33c106e1c4c10fc515249ac7bda</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-linux-20080610.tar.bz2</uri>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-linux-20080613.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>fce352d6d99233b2dac1cd51add0f0d1</string>
<string>ef09fcc8dea5d5fc911667f03c8b8a99</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-windows-20080611.tar.bz2</uri>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -962,23 +995,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>d116c41b95ec41adee7bbfdbf2c74ffb</string>
<string>f3e2f3428913bf8b8d70d28a3d079811</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/xmlrpc-epi-0.51-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-darwin-20080613.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
<string>dd08d9f03c9fb84406aa31494e4e5663</string>
<string>0cc87341785bf23c253e6e69a7c16ca0</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/xmlrpc-epi-0.51-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-20080618.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>e904dd2653fdb9dac15cc452a74f4bcb</string>
<string>ef96676498fef5c2bd1a1de0144163e2</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/xmlrpc-epi-0.51-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-windows-20080613.tar.bz2</uri>
</map>
</map>
</map>
@ -995,30 +1028,23 @@
<key>darwin</key>
<map>
<key>md5sum</key>
<string>99be09df2ec92282293761cd9ae242ac</string>
<string>6f5d1799ffacaec4b61d53051443c672</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/zlib-1.1.4-darwin-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-darwin-20080618.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>i686</key>
<map>
<key>md5sum</key>
<string>7efbde55728369e76ab9d46bff60c87f</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~aaronb/install_pkgs/zlib-1.2.1-linux-i686.tar.gz</uri>
</map>
<key>md5sum</key>
<string>a93da3d0a1fcf05c70d545991e0be227</string>
<string>4140bc104e828c5c33f251a2d5bfe144</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/zlib-1.1.4-linux-20080610.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-linux-20080618.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
<string>7058b7aeded6d8bb10bd0de8539f8392</string>
<string>bebeba689d2a8d19cfde150582a4f85a</string>
<key>url</key>
<uri>http://int.codex.lindenlab.com/~jenn/install_pkgs/zlib-1.1.4-windows-20080611.tar.bz2</uri>
<uri>https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-windows-20080618.tar.bz2</uri>
</map>
</map>
</map>

View File

@ -121,7 +121,7 @@ class LicenseDefinition(object):
self._definition = definition
class BinaryDefinition(object):
class InstallableDefinition(object):
def __init__(self, definition):
#probably looks like:
# { packages : {platform...},
@ -223,9 +223,9 @@ class Installer(object):
if os.path.exists(self._install_filename):
install = llsd.parse(file(self._install_filename, 'rb').read())
try:
for name in install['binaries']:
self._installables[name] = BinaryDefinition(
install['binaries'][name])
for name in install['installables']:
self._installables[name] = InstallableDefinition(
install['installables'][name])
except KeyError:
pass
try:
@ -236,7 +236,7 @@ class Installer(object):
if os.path.exists(self._installed_filename):
installed = llsd.parse(file(self._installed_filename, 'rb').read())
try:
bins = installed['binaries']
bins = installed['installables']
for name in bins:
self._installed[name] = InstalledPackage(bins[name])
except KeyError:
@ -254,29 +254,31 @@ class Installer(object):
for name in self._licenses:
state['licenses'][name] = self._licenses[name]._definition
#print "self._installables:",self._installables
state['binaries'] = {}
state['installables'] = {}
for name in self._installables:
state['binaries'][name] = self._installables[name]._definition
state['installables'][name] = \
self._installables[name]._definition
self._write(self._install_filename, state)
if self._installed_changed:
state = {}
state['binaries'] = {}
bin = state['binaries']
state['installables'] = {}
bin = state['installables']
for name in self._installed:
#print "installed:",name,self._installed[name]._installed
bin[name] = self._installed[name]._installed
self._write(self._installed_filename, state)
def is_valid_license(self, bin):
"@brief retrun true if we have valid license info for binary."
binary = self._installables[bin]._definition
if 'license' not in binary:
"@brief retrun true if we have valid license info for installable."
installable = self._installables[bin]._definition
if 'license' not in installable:
print >>sys.stderr, "No license info found for", bin
print >>sys.stderr, 'Please add the license with the',
print >>sys.stderr, '--add-installable option. See', sys.argv[0], '--help'
print >>sys.stderr, '--add-installable option. See', \
sys.argv[0], '--help'
return False
if binary['license'] not in self._licenses:
lic = binary['license']
if installable['license'] not in self._licenses:
lic = installable['license']
print >>sys.stderr, "Missing license info for '" + lic + "'.",
print >>sys.stderr, 'Please add the license with the',
print >>sys.stderr, '--add-license option. See', sys.argv[0],
@ -285,11 +287,11 @@ class Installer(object):
return True
def list_installables(self):
"Return a list of all known binaries."
"Return a list of all known installables."
return self._installables.keys()
def detail_binary(self, name):
"Return a binary definition detail"
def detail_installable(self, name):
"Return a installable definition detail"
return self._installables[name]._definition
def list_licenses(self):
@ -304,43 +306,49 @@ class Installer(object):
"Return a list of installed packages."
return self._installed.keys()
def _update_field(self, binary, field, value):
def _update_field(self, description, field, value, multiline=False):
"""Given a block and a field name, add or update it.
@param binary[in,out] a dict containing all the details about a binary.
@param description a dict containing all the details of a description.
@param field the name of the field to update.
@param value the value of the field to update; if omitted, interview
will ask for value.
@param multiline boolean specifying whether field is multiline or not.
"""
if value:
binary[field] = value
description[field] = value
else:
if field in binary:
if field in description:
print "Update value for '" + field + "'"
print "(Leave blank to keep current value)"
print "Current Value: '" + binary[field] + "'"
print "Current Value: '" + description[field] + "'"
else:
print "Specify value for '" + field + "'"
new_value = raw_input("Enter New Value: ")
if field in binary and not new_value:
if not multiline:
new_value = raw_input("Enter New Value: ")
else:
print "Please enter " + field + ". End input with EOF (^D)."
new_value = sys.stdin.read()
if field in description and not new_value:
pass
elif new_value:
binary[field] = new_value
description[field] = new_value
self._install_changed = True
return True
def _update_installable(self, name, platform, url, md5sum):
"""Update installable entry with specific package information.
@param binary[in,out] a dict containing all the details about a binary.
@param installable[in,out] a dict containing installable details.
@param platform Platform info, i.e. linux/i686, windows/i686 etc.
@param url URL of tar file
@param md5sum md5sum of tar file
"""
binary = self._installables[name]._definition
installable = self._installables[name]._definition
path = platform.split('/')
if 'packages' not in binary:
binary['packages'] = {}
update = binary['packages']
if 'packages' not in installable:
installable['packages'] = {}
update = installable['packages']
for child in path:
if child not in update:
update[child] = {}
@ -354,8 +362,8 @@ class Installer(object):
def add_installable_package(self, name, **kwargs):
"""Add an url for a platform path to the binary.
@param binary[in,out] a dict containing all the details about a binary.
"""Add an url for a platform path to the installable.
@param installable[in,out] a dict containing installable details.
"""
platform_help_str = """\
Please enter a new package location and url. Some examples:
@ -369,10 +377,11 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
+"--add-installable-package option"
return False
else:
print "Updating binary '" + name + "'."
print "Updating installable '" + name + "'."
for arg in ('platform', 'url', 'md5sum'):
if not kwargs[arg]:
if arg == 'platform': print platform_help_str
if arg == 'platform':
print platform_help_str
kwargs[arg] = raw_input("Package "+arg+":")
path = kwargs['platform'].split('/')
@ -381,22 +390,22 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
def add_installable_metadata(self, name, **kwargs):
"""Interactively add (only) library metadata into install,
w/o adding binary"""
w/o adding installable"""
if name not in self._installables:
print "Adding installable '" + name + "'."
self._installables[name] = BinaryDefinition({})
self._installables[name] = InstallableDefinition({})
else:
print "Updating installable '" + name + "'."
binary = self._installables[name]._definition
installable = self._installables[name]._definition
for field in ('copyright', 'license', 'description'):
self._update_field(binary, field, kwargs[field])
self._update_field(installable, field, kwargs[field])
print "Added installable '" + name + "':"
pprint.pprint(self._installables[name])
return True
def add_installable(self, name, **kwargs):
"Interactively pull a new binary into the install"
"Interactively pull a new installable into the install"
ret_a = self.add_installable_metadata(name, **kwargs)
ret_b = self.add_installable_package(name, **kwargs)
return (ret_a and ret_b)
@ -405,17 +414,18 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
self._installables.pop(name)
self._install_changed = True
def add_license(self, name, text, url):
if name in self._licenses:
print "License '" + name + "' being overwritten."
definition = {}
if url:
definition['url'] = url
if not url and text is None:
print "Please enter license text. End input with EOF (^D)."
text = sys.stdin.read()
definition['text'] = text
self._licenses[name] = LicenseDefinition(definition)
def add_license(self, name, **kwargs):
if name not in self._licenses:
print "Adding license '" + name + "'."
self._licenses[name] = LicenseDefinition({})
else:
print "Updating license '" + name + "'."
license = self._licenses[name]._definition
for field in ('url', 'text'):
multiline = False
if field == 'text':
multiline = True
self._update_field(license, field, kwargs[field], multiline)
self._install_changed = True
return True
@ -423,15 +433,15 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
self._licenses.pop(name)
self._install_changed = True
def _uninstall(self, binaries):
def _uninstall(self, installables):
"""@brief Do the actual removal of files work.
*NOTE: This method is not transactionally safe -- ie, if it
raises an exception, internal state may be inconsistent. How
should we address this?
@param binaries The package names to remove
@param installables The package names to remove
"""
remove_file_list = []
for pkgname in binaries:
for pkgname in installables:
for url in self._installed[pkgname].urls():
remove_file_list.extend(
self._installed[pkgname].files_in(url))
@ -455,16 +465,16 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
# normal failures.
pass
def uninstall(self, binaries, install_dir):
def uninstall(self, installables, install_dir):
"""@brief Remove the packages specified.
@param binaries The package names to remove
@param installables The package names to remove
@param install_dir The directory to work from
"""
print "uninstall",binaries,"from",install_dir
print "uninstall",installables,"from",install_dir
cwd = os.getcwdu()
os.chdir(install_dir)
try:
self._uninstall(binaries)
self._uninstall(installables)
finally:
os.chdir(cwd)
@ -476,7 +486,9 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
"""
ifiles = []
for bin in self._installables:
ifiles.extend(self._installables[bin].ifiles(bin, platform, cache_dir))
ifiles.extend(self._installables[bin].ifiles(bin,
platform,
cache_dir))
to_install = []
#print "self._installed",self._installed
for ifile in ifiles:
@ -484,13 +496,15 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
to_install.append(ifile)
elif ifile.url not in self._installed[ifile.pkgname].urls():
to_install.append(ifile)
elif ifile.md5sum != self._installed[ifile.pkgname].get_md5sum(ifile.url):
elif ifile.md5sum != \
self._installed[ifile.pkgname].get_md5sum(ifile.url):
# *TODO: We may want to uninstall the old version too
# when we detect it is installed, but the md5 sum is
# different.
to_install.append(ifile)
else:
#print "Installation up to date:",ifile.pkgname,ifile.platform_path
#print "Installation up to date:",
# ifile.pkgname,ifile.platform_path
pass
#print "to_install",to_install
return to_install
@ -521,9 +535,9 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
self._installed[ifile.pkgname] = InstalledPackage(definition)
self._installed_changed = True
def install(self, binaries, platform, install_dir, cache_dir):
def install(self, installables, platform, install_dir, cache_dir):
"""@brief Do the installation for for the platform.
@param binaries The requested binaries to install.
@param installables The requested installables to install.
@param platform The target platform. Eg, windows or linux/i686/gcc/3.3
@param install_dir The root directory to install into. Created
if missing.
@ -537,7 +551,7 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package"""
to_install = self._build_ifiles(platform, cache_dir)
# Filter for files which we actually requested to install.
to_install = [ifl for ifl in to_install if ifl.pkgname in binaries]
to_install = [ifl for ifl in to_install if ifl.pkgname in installables]
for ifile in to_install:
ifile.fetch_local()
self._install(to_install, install_dir)
@ -614,9 +628,9 @@ def _getuser():
import win32api
return win32api.GetUserName()
def _default_binary_cache():
"""In general, the binary files do not change much, so find a host/user
specific location to cache files."""
def _default_installable_cache():
"""In general, the installable files do not change much, so find a
host/user specific location to cache files."""
user = _getuser()
cache_dir = "/var/tmp/%s/install.cache" % user
if _get_platform() == 'windows':
@ -628,23 +642,23 @@ def _default_binary_cache():
def parse_args():
parser = optparse.OptionParser(
usage="usage: %prog [options] [binary1 [binary2 [binary3...]]]",
usage="usage: %prog [options] [installable1 [installable2...]]",
formatter = helpformatter.Formatter(),
description="""This script fetches and installs binary packages.
description="""This script fetches and installs installable packages.
It also handles uninstalling those packages and manages the mapping between
packages and their license.
The process is to open and read an install manifest file which specifies
what files should be installed. For each binary to be installed.
what files should be installed. For each installable to be installed.
* make sure it has a license
* check the installed version
** if not installed and needs to be, download and install
** if installed version differs, download & install
If no binaries are specified on the command line, then the defaut
behavior is to install all known binaries appropriate for the platform
specified or uninstall all binaries if --uninstall is set. You can specify
more than one binary on the command line.
If no installables are specified on the command line, then the defaut
behavior is to install all known installables appropriate for the platform
specified or uninstall all installables if --uninstall is set. You can specify
more than one installable on the command line.
When specifying a platform, you can specify 'all' to install all
packages, or any platform of the form:
@ -696,13 +710,14 @@ darwin/universal/gcc/4.0
default=_get_platform(),
dest='platform',
help="""Override the automatically determined platform. \
You can specify 'all' to do a installation of binaries for all platforms.""")
You can specify 'all' to do a installation of installables for all platforms.""")
parser.add_option(
'--cache-dir',
type='string',
default=_default_binary_cache(),
default=_default_installable_cache(),
dest='cache_dir',
help='Where to download files. Default: %s'%(_default_binary_cache()))
help='Where to download files. Default: %s'% \
(_default_installable_cache()))
parser.add_option(
'--install-dir',
type='string',
@ -767,14 +782,14 @@ Ignored if --add-license is not specified.""")
type='string',
default=None,
dest='remove_installable',
help="Remove a binary from the install file.")
help="Remove a installable from the install file.")
parser.add_option(
'--add-installable',
type='string',
default=None,
dest='add_installable',
help="""Add a binary into the install file. Argument is the name of \
the binary to add.""")
help="""Add a installable into the install file. Argument is \
the name of the installable to add.""")
parser.add_option(
'--add-installable-metadata',
type='string',
@ -836,21 +851,22 @@ Ignored if --add-installable or --add-installable-package is not specified.""")
action='store_true',
default=False,
dest='list_installables',
help="List the binaries in the install manifest and exit.")
help="List the installables in the install manifest and exit.")
parser.add_option(
'--detail',
type='string',
default=None,
dest='detail_binary',
help="Get detailed information on specified binary and exit.")
dest='detail_installable',
help="Get detailed information on specified installable and exit.")
parser.add_option(
'--uninstall',
action='store_true',
default=False,
dest='uninstall',
help="""Remove the binaries specified in the arguments. Just like \
during installation, if no binaries are listed then all installed binaries \
are removed.""")
help="""Remove the installables specified in the arguments. Just like \
during installation, if no installables are listed then all installed \
installables are removed.""")
return parser.parse_args()
def main():
@ -867,15 +883,15 @@ def main():
print "installed list:", installer.list_installed()
return 0
if options.list_installables:
print "binary list:", installer.list_installables()
print "installable list:", installer.list_installables()
return 0
if options.detail_binary:
if options.detail_installable:
try:
detail = installer.detail_binary(options.detail_binary)
print "Detail on binary",options.detail_binary+":"
detail = installer.detail_installable(options.detail_installable)
print "Detail on installable",options.detail_installable+":"
pprint.pprint(detail)
except KeyError:
print "Bianry '"+options.detail_binary+"' not found in",
print "Binary '"+options.detail_installable+"' not found in",
print "install file."
return 0
if options.list_licenses:
@ -887,7 +903,7 @@ def main():
print "Detail on license",options.detail_license+":"
pprint.pprint(detail)
except KeyError:
print "License '"+options.detail_binary+"' not defined in",
print "License '"+options.detail_license+"' not defined in",
print "install file."
return 0
if options.export_manifest:
@ -905,8 +921,8 @@ def main():
if options.new_license:
if not installer.add_license(
options.new_license,
options.license_text,
options.license_url):
text=options.license_text,
url=options.license_url):
return 1
elif options.remove_license:
installer.remove_license(options.remove_license)
@ -945,14 +961,15 @@ def main():
# passed in on the command line. We'll need to verify we
# know about them here.
uninstall_installables = args
for binary in uninstall_installables:
if binary not in all_installed:
raise RuntimeError('Binary not installed: %s' % (binary,))
for installable in uninstall_installables:
if installable not in all_installed:
raise RuntimeError('Binary not installed: %s' %
(installable,))
installer.uninstall(uninstall_installables, options.install_dir)
else:
# Determine what binaries should be installed. If they were
# Determine what installables should be installed. If they were
# passed in on the command line, use them, otherwise install
# all known binaries.
# all known installables.
all_installables = installer.list_installables()
if not len(args):
install_installables = all_installables
@ -960,18 +977,19 @@ def main():
# passed in on the command line. We'll need to verify we
# know about them here.
install_installables = args
for binary in install_installables:
if binary not in all_installables:
raise RuntimeError('Unknown binary: %s' % (binary,))
for installable in install_installables:
if installable not in all_installables:
raise RuntimeError('Unknown installable: %s' %
(installable,))
if options.check_license:
# *TODO: check against a list of 'known good' licenses.
# *TODO: check for urls which conflict -- will lead to
# problems.
for binary in install_installables:
if not installer.is_valid_license(binary):
for installable in install_installables:
if not installer.is_valid_license(installable):
return 1
# Do the work of installing the requested binaries.
# Do the work of installing the requested installables.
installer.install(
install_installables,
options.platform,