summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Ambroff <ambroff@lindenlab.com>2008-06-21 07:39:52 +0000
committerKyle Ambroff <ambroff@lindenlab.com>2008-06-21 07:39:52 +0000
commitdc3f5ff87cfa085998bf69db6dedad45440419d3 (patch)
treee6c54376390a110e0e91ea0139ce6bb54925ffae
parentaf080d1c62f1a2cdc17c3870427f07ad0cf9534f (diff)
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
-rw-r--r--indra/cmake/CMakeLists.txt1
-rw-r--r--indra/llcommon/llkeythrottle.h35
-rw-r--r--indra/llmessage/llcurl.cpp54
-rw-r--r--indra/llmessage/llcurl.h28
-rw-r--r--indra/llmessage/llhttpclient.cpp43
-rw-r--r--indra/llmessage/llhttpnode.cpp27
-rw-r--r--indra/llmessage/llhttpnode.h88
-rw-r--r--indra/llmessage/lliohttpserver.cpp48
-rw-r--r--indra/newview/CMakeLists.txt1
-rw-r--r--indra/test/lliohttpserver_tut.cpp17
-rw-r--r--install.xml342
-rwxr-xr-xscripts/install.py228
12 files changed, 530 insertions, 382 deletions
diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt
index 9cc34ea159..f0bb241961 100644
--- a/indra/cmake/CMakeLists.txt
+++ b/indra/cmake/CMakeLists.txt
@@ -63,7 +63,6 @@ set(cmake_SOURCE_FILES
PNG.cmake
Python.cmake
QuickTime.cmake
- Smartheap.cmake
TemplateCheck.cmake
UI.cmake
UnixInstall.cmake
diff --git a/indra/llcommon/llkeythrottle.h b/indra/llcommon/llkeythrottle.h
index 61a43b2dad..ac2f4254f2 100644
--- a/indra/llcommon/llkeythrottle.h
+++ b/indra/llcommon/llkeythrottle.h
@@ -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
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index e282f49438..5a426c7238 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -113,6 +113,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)
{
llinfos << status << ": " << reason << llendl;
@@ -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);
}
}
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index 1b3d3f6266..b7634d420f 100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -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 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);
+ virtual void completed(
+ U32 status,
+ const std::string& reason,
+ const LLSD& content);
/**< The default implemetnation calls
either:
* result(), or
diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp
index 859f3c1536..52cb8fe1c3 100644
--- a/indra/llmessage/llhttpclient.cpp
+++ b/indra/llmessage/llhttpclient.cpp
@@ -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)
diff --git a/indra/llmessage/llhttpnode.cpp b/indra/llmessage/llhttpnode.cpp
index 196aa5f8cf..91605b4008 100644
--- a/indra/llmessage/llhttpnode.cpp
+++ b/indra/llmessage/llhttpnode.cpp
@@ -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)");
diff --git a/indra/llmessage/llhttpnode.h b/indra/llmessage/llhttpnode.h
index e27056a51f..54715f2b38 100644
--- a/indra/llmessage/llhttpnode.h
+++ b/indra/llmessage/llhttpnode.h
@@ -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;
+
+ /**
+ * @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;
+
+ /**
+ * @brief Return no body, just status code and 'UNKNOWN ERROR'.
+ */
+ void status(S32 code);
+
+ 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;
+ };
- void status(S32 code);
- void notFound(const std::string& message);
- void notFound();
- void methodNotAllowed();
- };
- typedef LLPointer<Response> ResponsePtr;
+ 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 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;
//@}
diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp
index ec5cb93d69..90f8ef7638 100644
--- a/indra/llmessage/lliohttpserver.cpp
+++ b/indra/llmessage/lliohttpserver.cpp
@@ -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();
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 20876d630f..85cb5dd007 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -28,7 +28,6 @@ include(LScript)
include(Linking)
include(Mozlib)
include(NDOF)
-include(Smartheap)
include(TemplateCheck)
include(UI)
include(UnixInstall)
diff --git a/indra/test/lliohttpserver_tut.cpp b/indra/test/lliohttpserver_tut.cpp
index 5401d1a8ae..e5607cdad7 100644
--- a/indra/test/lliohttpserver_tut.cpp
+++ b/indra/test/lliohttpserver_tut.cpp
@@ -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
*/
diff --git a/install.xml b/install.xml
index f00fdd3aa3..3fb439e183 100644
--- a/install.xml
+++ b/install.xml
@@ -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>
diff --git a/scripts/install.py b/scripts/install.py
index 7a1d57aaa7..ea32f0b8aa 100755
--- a/scripts/install.py
+++ b/scripts/install.py
@@ -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,